前言
上次分享了javascript語義分析,並且簡單介紹了新型xss掃描器的一些想法,如何在不進行大量fuzz的情況下又能準確的檢測出xss漏洞,這其中我們又可以儘量的避免觸發waf的xss防護功能!
關聯文章:XSS語義分析的階段性總結(一)
首先先接著上文介紹一下html語義分析的方法。
掃描思路
HTML語義分析
如果把html語義分析看為對html結構的解析與識別,在python中我們可以使用HTMLParser,對,又是python幫我解決了難題。在XSStrike裡面同樣使用了自定義的HTMLParser進行漏洞的輔助識別。
我們可以通過繼承HTMLParser並重載其方法來實現我們需要的功能
下面是簡單的 HTML 解析器的一個基本示例,使用HTMLParser類,當遇到開始標記、結束標記以及數據的時候將內容列印出來
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Encountered a start tag:", tag)
def handle_endtag(self, tag):
print("Encountered an end tag :", tag)
def handle_data(self, data):
print("Encountered some data :", data)
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
'<body><h1>Parse me!</h1></body></html>')
我們需要定義一個我們自己的HTML解析器來處理我們的標籤,標識出來script標籤,html注釋,html標籤,屬性,css等等
部分代碼如下
尋找反射點的思路和js的類似,通過遍歷標籤來來解析html結構,tagname代表標籤名,attibutes代表屬性,content代表數據內容,#comment代表注釋,每個標籤被封裝為字典形式的列表元素
使用以下的demo
<body>
<a href="?q=1&w=2&e=3&r=4&t=5">test</a>
<style>
body{
background:#aaaflag{111222};
}
</style>
<script>
var a = 'xx';flag{111222}</script>
<div>
<textarea>flag{111222}</TexTarea>kkk
</div>ffff<aaaaa>bb
<input style="color:flag{111222}" value2="flag{111222}" aflag{111222}="aaa"/>
<!--
this is comment
5flag{111222}
-->
</body>
</html>
處理後的效果
處理完html標籤,接下該尋找sink輸出點在html的上下文。思路跟js的尋找思路是相同的。通過遍歷列表內容來找到我們的input,部分代碼如下:
最後會給出輸出點上下文的一些細節信息,如是否是html標籤等等
然後根據不同的上下文給出我們的payload,使用html語法樹有很多好處,比如可以準確判斷回顯的位置
探究發包
X3Scan的掃描思路參考了一些xray的掃描思路,比如不發送一些產生危害的payload,只根據回顯的上下文發送一些flag測試一些關鍵字符是否被轉義和過濾,如<>,".',()等,如果沒有過濾最後給出建議payload,如:confirm()
首先對於無法使用html和js解析的回顯,如jsonp和json格式的相應包,我們使用如下的發包順序:
隨機flag ---》判斷回顯 ----》解析找不到回顯 ---》發送<隨機flag> ---》判斷響應包中字符是否轉義---》給出payload
最後給出<img src=1>的payload,對與jsonp_xss這裡有一個tip,正常情況下判斷jsonp_xss,會首先判斷content-type是包含text/html,然後繼續測試,實際測試中當content-type為空時,也可能存在xss漏洞,因此應該對兩種情況都進行一下判斷。
if 'html' in (resp_headers.get("content-type","").lower()) or resp_headers.get("content-type")==None:
對於html標籤內的內容
<h2>xxxxx</h2>
掃描器會依次發送0xb9d8c,</H2><mowvhry>當確認標籤可以閉合,會給出</h2><img src=1>
對於標籤屬性
demo:https://brutelogic.com.br/xss.php?b3=
掃描器會依次發送0xb78123,'psafq=','><arcbvyf>,"psafq=","><arcbvyf>,當確認引號和尖括號沒有被過濾時,最終給出"><img src=1>,"OnMoUsEoVeR=confirm()//。
對於html注釋
`<!-- this is comment <?php echo $t;?> -->`
掃描器會依次發送0xfda748,--><aorxlwd>,--!><aorxlwd>,當確定-->或--!>沒有過濾時,給出payload,--><aorxlwd>
對於script標籤的回顯
掃描器會依次發送0x829a5c,-829a5c-,</sCRiPt><sCRiPt>dncjbwv</sCRiPt>,當最後確認</sCrIpT>未被過濾時,最終給出payload,</sCRiPt><sCRiPt>confirm()</sCRiPt>
另外一種情況就是回顯到script標籤的注釋裡面
使用以下demo
掃描器會依次發出0x829a5c,-829a5c-,</sCRiPt><sCRiPt>dncjbwv</sCRiPt>,\n;rmhwe;//,最後給出payload,</sCRiPt><sCRiPt>confirm()</sCRiPt>,/n;prompt(1);//。
對於塊注釋,掃描器會依次發出,0xc13f,*/0xc13f;/*,最後給出payload,*/prompt(1);/*
通過上面的分析,我們可以發現使用html語法樹有很多好處,比如通過發送一個隨機payload,例如:<wrqweew>,然後通過html語法樹檢測是否有wrqweew這個標籤,便可以確定payload是否執行成功了。
對於回顯在js的情況,發送測試payload後,通過js語法樹解析確定Identifier和Literal這兩個類型中是否包含,如果payload是Identifier類型,就可以直接判斷存在xss,最後給出payload,confirm();//。如果payload是Literal類型,再通過單雙引號來測試是否可以閉合。
另外,還有一些比較精緻的技巧,比如對payload的隨機大小寫,由於html對大小寫是不敏感的,但是一些waf由於設計缺陷能會被繞過。
大致流程
掃描器大致流程:
發送隨機字符--》確認參數回顯---》通過html/js解析確認回顯位置--》根據回顯的上下文發送不同的payload進行測試--》使用html,js語法樹解析是否多出來標籤,屬性,js語句等來確定是否執行成功
成果展示
由於一直處於開發階段,並沒進行大規模測試,但是偶爾也會有個小驚喜,某次調bug的時候發現京東某站的xss
合天網安實驗室相關實驗推薦==XSS進階二
(惡意攻擊者往Web頁面裡插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html代碼會被執行,從而形成XSS攻擊)