OpenRASP xss算法的几种绕过方法
openrasp默認(rèn)只能檢測反射型XSS,存儲型XSS僅IAST商業(yè)版支持。對于反射型xss,openrasp也只能檢測可控輸出點在html標(biāo)簽外的情況,本文的繞過方法是針對這種情況。如果可控輸出點在html標(biāo)簽內(nèi),如或 內(nèi)部,openrasp幾乎檢測不到。
測試環(huán)境
【網(wǎng)安學(xué)習(xí)資料】
windows / tomcat / jdk1.8 / openrasp 1.3.7-beta
測試環(huán)境部署參見https://www.anquanke.com/post/id/241107,或者官網(wǎng)文檔。
在official.js中xss_userinput算法默認(rèn)配置為ignore,修改為block來開啟攔截。此時點擊官方測試用例中下面鏈接,即可觸發(fā)openrasp攔截。
openrasp xss算法
openrasp xss算法有2種。算法1是針對PHP環(huán)境,此處不考慮。算法2是用戶輸入匹配算法,根據(jù)注釋說明,算法原理是”當(dāng)用戶輸入長度超過15,匹配上標(biāo)簽正則,且出現(xiàn)在響應(yīng)里,直接攔截”。
標(biāo)簽正則含義使用regexper網(wǎng)站解析如下
標(biāo)簽正則從整體上來說匹配兩種情況,一是請求參數(shù)值中有子字符串以<! 開頭的;二是請求參數(shù)值中有子字符串以< 開頭的。對于第二種情況,標(biāo)簽正則會匹配< 字符后接1到12個大小寫字母,再后接/ 或> 或0x00 - 0x20 字符的字符串。所以下面這些常見的xss測試payload都會攔截。
<script>alert(1)</script> // "<script>"部分匹配標(biāo)簽正則 <img src=1 onerror=alert()> // "<img "部分匹配正則,空格符對應(yīng)正則中0x20 <svg/onload=alert()> // "<svg/"部分匹配正則 <img src=1 onerror=alert()>觸發(fā)攔截標(biāo)簽正則繞過
【網(wǎng)安學(xué)習(xí)資料】
整理網(wǎng)上的一些xss 繞過payload,發(fā)現(xiàn)下面這些可以順利繞過標(biāo)簽正則
<d3v/onmouseleave=[1].some(confirm)>click <d3/onmouseenter=[2].find(confirm)>z <d3"<"/onclick="1>[confirm``]"<">z <w="/x="y>"/ondblclick=`<`[confir\u006d``]>z瀏覽器直接輸入上面那些xss payload會報400響應(yīng)錯誤。對payload進(jìn)行url編碼所有字符。
burpsuite repeater中右鍵”copy url”,復(fù)制url到瀏覽器中訪問,點擊即可觸發(fā)彈框。
[外鏈圖片轉(zhuǎn)存中…(img-d91Hx3yz-1626861607081)]
標(biāo)簽后接單雙引號
【網(wǎng)安學(xué)習(xí)資料】
收集過程中還發(fā)現(xiàn)下面這兩種xss payload也可以繞過。
<a"/onclick=(confirm)()>click <a'/onclick=(confirm)()>click簡單測了下其他標(biāo)簽后接單引號或雙引號進(jìn)行繞過,好像蠻多都行的。
<button onclick=alert()>12</button> // 攔截 <button' onclick=alert()>12</button> // 點擊彈框 <button" onclick=alert()>12</button> // 點擊彈框 <div onclick=alert()>12</div> // 攔截 <div' onclick=alert()>12</div> // 點擊彈框 <div" onclick=alert()>12</div> // 點擊彈框例如,使用123<img’ src=1 οnclick=alert()>123 ,url編碼后,點擊也能彈框。
構(gòu)造無效標(biāo)簽
【網(wǎng)安學(xué)習(xí)資料】
這種也可以用于繞過openrasp。看到這種繞過方式,感覺前面的都不香了。
只要構(gòu)造如下payload即可
<abc1 onclick=confirm()>click here // 標(biāo)簽名是字母+數(shù)字驗證如下
或者
<abcdefabcdefa onclick=confirm()>click here // 標(biāo)簽名稱長度大于12程序邏輯繞過
【網(wǎng)安學(xué)習(xí)資料】
還有一種繞過方法,是從程序檢測邏輯上進(jìn)行繞過。
openrasp xss具體檢測代碼實現(xiàn)在這個文件中agent/java/engine/src/main/java/com/baidu/openrasp/plugin/checker/local/XssChecker.java。下面的一段代碼是對”當(dāng)用戶輸入長度超過15,匹配上標(biāo)簽正則,且出現(xiàn)在響應(yīng)里,直接攔截”的具體實現(xiàn)。
但代碼中多了一處邏輯。如果請求會傳遞多個參數(shù),當(dāng)某個參數(shù)值長度大于15,且匹配之前的標(biāo)簽正則<![-[A-Za-z]|<([A-Za-z]{1,12})[/\x00-\x20>] ,如果對應(yīng)參數(shù)值沒有在響應(yīng)中出現(xiàn)時,變量count值會加1。當(dāng)count值大于10時,openrasp會直接放行。控制程序運行到上面圖片中第二個方框中即可產(chǎn)生繞過。
繞過演示
【網(wǎng)安學(xué)習(xí)資料】
此處為了查看payload內(nèi)容方便,使用了post請求。如果轉(zhuǎn)換成get請求,并對參數(shù)值url編碼,效果一樣。
原始請求會觸發(fā)攔截
繞過payload。在input參數(shù)前面添加多個input[n]的參數(shù),且參數(shù)值為其他xss payload。
轉(zhuǎn)換成get請求,并對payload進(jìn)行編碼。
繞過payload分析
【網(wǎng)安學(xué)習(xí)資料】
構(gòu)造的繞過payload有幾點要求。一是,虛構(gòu)的請求參數(shù)理論上至少要有11個,如前面input0到input11請求參數(shù)。如果沒成功,最好在增加幾個請求參數(shù)。二是,虛構(gòu)的請求參數(shù)名取值有些要求。三是,虛構(gòu)的請求參數(shù)值不能與真實請求參數(shù)值相同。
因為這樣的話,input0到input11這些請求參數(shù)在parameterMap 中會排在input參數(shù)前面,見下圖。
這樣input0到input11這些參數(shù)就會優(yōu)先input請求參數(shù)被openrasp檢測邏輯處理,從而擊中count > exceedLengthCount 的條件進(jìn)行繞過。
【想學(xué)網(wǎng)絡(luò)安全的同學(xué),上船啦】
總結(jié)
以上是生活随笔為你收集整理的OpenRASP xss算法的几种绕过方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络即服务(NaaS)是什么???
- 下一篇: CVE-2021-33909:Linux