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