XSS基礎(chǔ)學(xué)習(xí)筆記
XSS基礎(chǔ)
XSS概念:
通常情況下,在Web應(yīng)用的網(wǎng)頁中,有些部分的顯示內(nèi)容會根據(jù)外屆輸入值而發(fā)生變化(會反彈惡意代碼),而如果生成這些HTML的程序中存在問題,就會滋生名為跨站腳本(Cross-Site Scripting)的安全隱患。由于它和知名的CSS(層疊樣式表)縮寫沖突,所以經(jīng)常縮寫為XSS。
XSS的實(shí)質(zhì)其實(shí)是HTML代碼與Javscript代碼的注入。但由于XSS的攻擊對象是與客戶對等的Browser端,因此常常不被開發(fā)者所重視。
一般意義上的XSS通??梢杂煤唵蔚姆椒z測出來:當(dāng)用戶輸入中某個參數(shù)的全部或其中一部分,原封不動地在源代碼里出現(xiàn)時,我們就可以認(rèn)為這個參數(shù)存在XSS漏洞。
XSS的風(fēng)險:
Web應(yīng)用若存在XSS漏洞,就會有如下風(fēng)險:
用戶的瀏覽器中運(yùn)行攻擊者的惡意腳本,從而導(dǎo)致Cookie信息被竊取,用戶身份被報名頂替。
攻擊者能獲得用戶的權(quán)限來惡意使用Web應(yīng)用的功能。
向用戶顯示偽造的輸入表單,通過釣魚式攻擊竊取用戶的個人信息。
XSS漏洞總覽:
產(chǎn)生地點(diǎn):Web應(yīng)用中南生成HTML和JavaScript的地方。
影響范圍:Web應(yīng)用全體
影響類型:在網(wǎng)站用戶的瀏覽器中執(zhí)行JavaScript,顯示偽造的網(wǎng)站內(nèi)容。
影響程度:中~大。
用戶參與程度:需要—> 瀏覽惡意網(wǎng)站、點(diǎn)擊郵件內(nèi)的附屬連接、瀏覽已被入侵的網(wǎng)站等。
對策概要:用雙引號括起來屬性對,轉(zhuǎn)義HTML中的特殊字符。
XSS被惡意使用的三種方法:
竊取Cookie值
通過JavaScript攻擊
篡改網(wǎng)頁
同源策略:
同源策略:來自相同網(wǎng)站的頁面。
不同源策略:來自不同網(wǎng)站的頁面。
跨站腳本類型:
XSS分類:可根據(jù)不同分類方式,分為不同類型。
按形式分:反射型XSS 存儲型XSS
按介質(zhì)分:JSXSS FlashXSS
按接口分:DOM base XSS , 非DOM XSS
注:因此沒有反射型XSS、存儲型XSS、DOM XSS這種分類,因?yàn)榉诸愐罁?jù)都不同…
反射型XSS:
如果攻擊用JavaScript代碼位于攻擊目標(biāo)網(wǎng)站之外的其他網(wǎng)站(惡意網(wǎng)站或者郵件中的URL),就 稱為反射型的XSS(Reflected XSS)。
竊取Cookie實(shí)例中用到的XSS攻擊模式就屬于反射型XSS。
反射型XSS多發(fā)生于網(wǎng)頁將用戶輸入值原封不動地顯示出來的情況。其中,輸入值確定頁面就是一個典型的例子。
存儲型XSS:
有時攻擊者也會將攻擊用JavaScript代碼保存至攻擊對象的數(shù)據(jù)庫中。這種模式的XSS就被稱為存儲型的XSS(Stored XSS)或持久性的XSS(Presistent XSS)。
存儲型的XSS的典型攻擊對象為Web郵箱客戶端以及社交網(wǎng)站(Social Networking Service,簡稱SNS)。
存儲型XSS無需攻擊者費(fèi)勁心思將用戶引誘至惡意網(wǎng)站,而且即使是戒心很重的用戶也會有很大的幾率中招,因此對攻擊者來說益處多多。
存儲型XSS:
長期存儲與服務(wù)器端
每次用戶訪問都會被執(zhí)行JS腳本
客戶端表單長度限制:
客戶端源碼修改限制
代理截斷
DOM型XSS:
DOMXSS漏洞是基于文檔對象模型(Document Object Model)的一種漏洞。
DOM是一套JS和其他語言課調(diào)用的API(遍歷、獲取、修改)。
根據(jù)XSS在DOM中輸出點(diǎn)的不同,DOM XSS機(jī)有可能是反射型,也有可能是存儲型。
注意:‘#’,它告訴瀏覽器所有在它后面的東西都是個片段,也就是不作為查詢的一部分。IE(6.0)和Mozilla不會把這個片段發(fā)送到服務(wù)器,因此服務(wù)器端看到的只是#號前面提交的參數(shù)。這樣如果#號后面填充了惡意腳本,就不會被服務(wù)器端看到。
如果服務(wù)器端直接讀取客戶端提交參數(shù)的所有,重寫改寫頁面,就會將惡意腳本寫到頁面。在寫頁面時,需要先使用URL解碼。
兩種典型的DOM過程:
反射型DOM base XSS:
用戶輸入帶有參數(shù)的URL
JavaScript處理URL并獲取參數(shù)
通過DOM調(diào)用參數(shù)對頁面進(jìn)行排版。
通過DOM動態(tài)輸出到頁面上。
存儲型DOM base XSS:
用戶輸入帶有參數(shù)的URL或者Body域數(shù)據(jù)
服務(wù)器將參數(shù)存入數(shù)據(jù)庫
通過JSON格式返回參數(shù)到頁面
通過DOM調(diào)用參數(shù)進(jìn)行排版
通過DOM動態(tài)輸出到頁面上。
XSS產(chǎn)生的根源:
XSS漏洞產(chǎn)生的原因?yàn)椋?strong>生成HTML的過程中,HTML語法中含有特殊意義的字符(元字符)沒有被正確處理,結(jié)果導(dǎo)致HTML或JavaScript被肆意注入,從而使得原先的HTML結(jié)構(gòu)產(chǎn)生變化。為了消除元字符的特殊意義,將其轉(zhuǎn)化為普通字符,就需要用到轉(zhuǎn)義(Escape)處理。HTML的轉(zhuǎn)義處理對消除XSS至關(guān)重要。
HTML轉(zhuǎn)義:
在HTML中顯示< 時,必須按照字符實(shí)體引用(Character Entity Reference)將其轉(zhuǎn)義記載為 <;而如果忽略這一步驟直接生成HTML的話,瀏覽器會將 < 解釋為標(biāo)簽的開始。從而就或招致惡意利用此漏洞進(jìn)行的XSS攻擊。
在HTML中,根據(jù)字符所處位置的不同,應(yīng)當(dāng)轉(zhuǎn)義的元字符也會發(fā)生變化。
元素內(nèi)容轉(zhuǎn)義:
特征:能解釋Tag和字符實(shí)體;結(jié)束邊界字符為<。
轉(zhuǎn)義:< 和 & 使用字符實(shí)體轉(zhuǎn)義。
PHP轉(zhuǎn)義函數(shù):
htmlspecialchars($String, $quote_style, $charset)
$string :轉(zhuǎn)換對象字符串
$quote_style:轉(zhuǎn)換方法。
| 轉(zhuǎn)換前 | 轉(zhuǎn)換后 | ENT_NOQUOTES | ENT_COMPAT | ENT_QUOTES |
| —— | ——- | ———— | ———- | ———- |
| < | <; | 支持 | 支持 | 支持 |
| > | >; | 支持 | 支持 | 支持 |
| & | &; | 支持 | 支持 | 支持 |
| “ | "; | 不支持 | 支持 | 支持 |
| ‘ | '; | 不支持 | 不支持 | 支持 |一般使用最后一種即可:ENT_QUOTES
$charset:字符編碼。如UTF-8、GBK。
屬性值(雙引號中南的內(nèi)容)轉(zhuǎn)義:
特征:能解釋字符實(shí)體;結(jié)束邊界字符為雙引號。
轉(zhuǎn)義:屬性值用雙引號括起來,< 和 & 和 “ 使用字符實(shí)體轉(zhuǎn)義。
XSS的輔助性對策:
輸入校驗(yàn):通過檢驗(yàn)輸入值的有效性,當(dāng)輸入值不符和條件是就顯示錯誤消息,并促使用戶重新輸入,有時也能夠防御XSS攻擊。
給Cookie添加HttpOnly屬性:Cookie中有名為HttpOnly屬性,該屬性能禁止JavaScript讀取Cookie值。
通過給Cookie添加HttpOnly屬性,能夠杜絕XSS中竊取會話ID這一典型的攻擊手段。但需要注意的是其他攻擊手段依然有效,所以這樣只能是限制了攻擊者的選擇范圍,并不能杜絕所有的XSS攻擊。
php.init:session.cookie_httponly=On
XSS對策總結(jié):
根本性對策(個別對策)
HTML的元組內(nèi)容:使用htmlspecialchars函數(shù)轉(zhuǎn)義。
屬性值:使用htmlspecialchars函數(shù)轉(zhuǎn)義并用雙引號括起來。
根本性對策(共通對策)
明確設(shè)置HTTL響應(yīng)的字符編碼。
輔助對策
輸入校驗(yàn)
給Cookie添加HttpOnly屬性。
XSS進(jìn)階
HTML組成元素
腳本(事件綁定)
事件綁定函數(shù)中的字符串字面量
屬性值/(URL),屬性位置防止雙引號。
元素內(nèi)容,元素位置防止尖角符號。
script元素中南的字符串字面量
JavaScript問題:
之所以會混入安全隱患,是因?yàn)?strong>沒有將JavaScript字符串字面量進(jìn)行轉(zhuǎn)義。因此,輸入?yún)?shù)中的單引號沒有被識別為字符,而是被當(dāng)成了JavaScript中南字符串的結(jié)束符。
為了避免這種情況,理論上應(yīng)采取如下措施:
首先,將數(shù)據(jù)作為JavaScript字符串字面量進(jìn)行轉(zhuǎn)義。
將得到的結(jié)果再次進(jìn)行HTML轉(zhuǎn)義。
JS字符串字面量中南應(yīng)被轉(zhuǎn)義的字符:

JS字符串字面量動態(tài)生成的對策:
按照J(rèn)avaScript語法,將引號(單引號及雙引號)和斜杠\及換行符等進(jìn)行轉(zhuǎn)義?!盶“” 。如果是事件綁定函數(shù),將JS執(zhí)行結(jié)果按照字符實(shí)體進(jìn)行HTML轉(zhuǎn)義, 并用雙引號括起來。
如果是在script元素中,執(zhí)行JS后,確保字符串中不存在</ 。
雖然理論上如此,但JavaScript的轉(zhuǎn)義規(guī)則相當(dāng)復(fù)雜,執(zhí)行起來很容易產(chǎn)生疏漏,因此一直以來都是安全隱患誕生的溫床。鑒于這種情況,最好的辦法可能是避免動態(tài)生成JavaScript。然而,現(xiàn)實(shí)中又會經(jīng)常需要傳給JavaScript的參數(shù)是動態(tài)的。此時,一般使用Unicode轉(zhuǎn)義的解決方案。
Unicode轉(zhuǎn)義:
為了避免動態(tài)生成JavaScript帶來的風(fēng)險,可以采取將字母和數(shù)字以外的其他所有字符都進(jìn)行轉(zhuǎn)義的方法。這種方法利用了JavaScript能將Unicode代碼點(diǎn)U+XXXX字符轉(zhuǎn)義為\uXXXX的功能。
輔助方案:錯誤消息導(dǎo)致的信息泄露。
錯誤消息中包含對攻擊者有幫助應(yīng)用程序內(nèi)部信息。
通過蓄意攻擊使錯誤信息中顯示隱私信息(如用戶個人信息等。)
應(yīng)用程序內(nèi)部信息是指,發(fā)生錯誤的函數(shù)名、數(shù)據(jù)庫的表名、列名等,這些信息都可能成為攻擊的突破口。
為了解決以上問題,當(dāng)應(yīng)用程序發(fā)生錯誤時,應(yīng)該僅在頁面上顯示“此時訪問量太大,請稍后再試”等提示用戶的消息。
PHP的情況下,禁止顯示詳細(xì)錯誤信息,只需要在php.ini中做如下設(shè)置:
display_errors = Off
HTML轉(zhuǎn)義概要:

XSSer簡介-確認(rèn)XSS存在的工具
XSSer概述:
跨站點(diǎn)“Scripter”(又名XSSer)是一個自動化框架,用于檢測、利用以及報告基于Web應(yīng)用程序
中的XSS漏洞。
XSS是Web應(yīng)用常見的漏洞。利用該漏洞,安全人員在網(wǎng)站注入惡意腳本,控制用戶瀏覽器,并發(fā)起其他滲透操作。XSSer是Kali Linux提供的一款自動化XSS攻擊框架。該工具可以同時探測多個網(wǎng)址。如果發(fā)現(xiàn)XSS漏洞,可以生成報告,并直接進(jìn)行利用,如建立反向連接。為了提供攻擊效率,該工具支持各種規(guī)避措施,如判斷XSS過濾器、規(guī)避特定的防火墻、編碼規(guī)避。同時,該工具提供豐富的選項(xiàng),供用戶自定義攻擊,如指定攻擊載荷、設(shè)置漏洞利用代碼等。
一個自動框架、檢測,利用和報告基于Web應(yīng)用的XSS漏洞。
支持命令行、圖形化界面。
提供繞過服務(wù)器過濾的選項(xiàng),以及一些特殊的代碼注入技術(shù)。
XSSer經(jīng)典命令:
BeEF攻擊簡介
BeEF概述:
通過XSS漏洞,將hook.js腳本注入,可將中招的客戶端掛起。
如果客戶端瀏覽器關(guān)掉,則連接會斷開。
可以做持久化連接。不讓用戶關(guān)閉瀏覽器,或者后臺開一個小窗。
BeEF(Brower exploitation framerwork):
生成,交付Payload
Ruby語言編寫
服務(wù)器端:管理Hooked客戶端
客戶端:運(yùn)行與客戶端瀏覽器的JS腳本(hook)
降低白帽子對JS代碼的要求。
BeEF主要針對瀏覽器(客戶)進(jìn)行攻擊。
應(yīng)用普遍轉(zhuǎn)移到B/S架構(gòu),瀏覽器稱為唯一客戶端程序。
結(jié)合社會工程學(xué)方法對瀏覽器進(jìn)行攻擊。
攻擊瀏覽器用戶
通過注入的JS腳本,劉勇瀏覽器工具其他網(wǎng)站
BeEF攻擊手段:
利用網(wǎng)站XSS漏洞實(shí)現(xiàn)攻擊
誘使客戶端訪問包含hook的偽造網(wǎng)站
結(jié)合中間人攻擊注入hook腳本
BeEF常見用途:
鍵盤記錄器
網(wǎng)絡(luò)掃描
瀏覽器信息收集
綁定shell
與Metasploit集成