一茵肃、什么是 XSS
? ? XSS全稱(Cross Site Scripting)跨站腳本攻擊盐须,是最常見的Web應(yīng)用程序安全漏洞之一颓芭,位于OWASP top 10 2013/2017年度分別為第三名和第七名垒迂,XSS是指攻擊者在網(wǎng)頁中嵌入客戶端腳本牵舵,通常是JavaScript編寫的危險(xiǎn)代碼堂污,當(dāng)用戶使用瀏覽器瀏覽網(wǎng)頁時(shí)家肯,腳本就會(huì)在用戶的瀏覽器上執(zhí)行,從而達(dá)到攻擊者的目的盟猖。
? ? 從上面中的一段話讨衣,可以得知,XSS屬于客戶端攻擊式镐,受害者最終是用戶反镇,但特別要注意的是網(wǎng)站管理人員也屬于用戶之一。這就意味著XSS可以進(jìn)行“服務(wù)端”攻擊娘汞,因?yàn)楣芾韱T要比普通用戶的權(quán)限大得多歹茶,一般管理員都可以對(duì)網(wǎng)站進(jìn)行文件管理,數(shù)據(jù)管理等操作你弦,而攻擊者一般也是靠管理員身份作為“跳板”進(jìn)行實(shí)施攻擊惊豺。
? ? XSS攻擊最終目的是在網(wǎng)頁中嵌入客戶端惡意腳本代碼,最常用的攻擊代碼是javascript語言禽作,但也會(huì)使用其它的腳本語言尸昧,例如:ActionScript、VBscript旷偿。而如今的互聯(lián)網(wǎng)客戶端腳本基本是基于Javascript,所以如果想要深入研究XSS烹俗,必須要精通Javascript碍沐。
? ? XSS換句話說,JavaScript能做到什么效果衷蜓,XSS的胃口就有多大。這完全不是危言聳聽尘喝。javascript可以用來獲取用戶的cookie磁浇,彈出窗口,那么存在XSS漏洞的網(wǎng)站朽褪,XSS就可以用來盜取用戶Cookie,廢掉頁面置吓,導(dǎo)航到惡意網(wǎng)站!更高端的XSS代碼完全可以進(jìn)行監(jiān)控你的鍵盤操作缔赠,模仿Windows注銷界面衍锚,誘導(dǎo)你輸入開機(jī)密碼!而攻擊者需要做的僅僅是向你的代碼中注入Javascript代碼嗤堰!
二戴质、XSS漏洞出現(xiàn)的原因
? ? 程序?qū)斎牒洼敵龅目刂撇粔驀?yán)格,導(dǎo)致"精心構(gòu)造“的腳本輸入后,在輸?shù)角岸藭r(shí)被瀏覽器當(dāng)作有效代碼解析執(zhí)行從而產(chǎn)生危害.
三、XSS的危害
1踢匣、首先對(duì)于那些半年沒有更新的小企業(yè)網(wǎng)站來說告匠,發(fā)生XSS漏洞幾乎沒有什么用。一般在各類的社交平臺(tái)离唬,郵件系統(tǒng)后专,開源流行的Web應(yīng)用,BBS输莺,微博等場(chǎng)景中戚哎,造成的殺傷力卻十分強(qiáng)大。
2嫂用、劫持用戶cookie是最常見的跨站攻擊形式型凳,通過在網(wǎng)頁中寫入并執(zhí)行腳本執(zhí)行文件(多數(shù)情況下是JavaScript腳本代碼),劫持用戶瀏覽器尸折,將用戶當(dāng)前使用的sessionID信息發(fā)送至攻擊者控制的網(wǎng)站或服務(wù)器中啰脚。
3、“框架釣魚”实夹。利用JS腳本的基本功能之一:操作網(wǎng)頁中的DOM樹結(jié)構(gòu)和內(nèi)容橄浓,在網(wǎng)頁中通過JS腳本,生成虛假的頁面亮航,欺騙用戶執(zhí)行操作荸实,而用戶所有的輸入內(nèi)容都會(huì)被發(fā)送到攻擊者的服務(wù)器上。
4缴淋、掛馬(水坑攻擊)
5准给、有局限性的鍵盤記錄
四泄朴、 XSS分類
1、反射型XSS或不持久型XSS(中危)
交互的數(shù)據(jù)一般不會(huì)被存在在數(shù)據(jù)庫里面,只是簡(jiǎn)單的把用戶輸入的數(shù)據(jù)反射給瀏覽器露氮,一次性祖灰,所見即所得。
2畔规、儲(chǔ)存型XSS 或持久型 XSS(高危)
交互的數(shù)據(jù)會(huì)被存在在數(shù)據(jù)庫里面,永久性存儲(chǔ),具有很強(qiáng)的穩(wěn)定性局扶。
3、DOM XSS
不與后臺(tái)服務(wù)器產(chǎn)生數(shù)據(jù)交互,通過前端的dom節(jié)點(diǎn)形成的XSS漏洞叁扫。
什么是DOM:DOM全稱是Document Object Model三妈,也就是文檔對(duì)象模型。我們可以將DOM理解為莫绣,一個(gè)與系統(tǒng)平臺(tái)和編程語言無關(guān)的接口畴蒲,程序和腳本可以通過這個(gè)接口動(dòng)態(tài)地訪問和修改文檔內(nèi)容、結(jié)構(gòu)和樣式对室。當(dāng)創(chuàng)建好一個(gè)頁面并加載到瀏覽器時(shí)模燥,DOM就悄然而生,它會(huì)把網(wǎng)頁文檔轉(zhuǎn)換為一個(gè)文檔對(duì)象掩宜,主要功能是處理網(wǎng)頁內(nèi)容涧窒。故可以使用 Javascript 語言來操作DOM以達(dá)到網(wǎng)頁的目的。
五锭亏、XSS可能存在的地方
HTML context
Attribute Context
URL Context
Style Context
Script Context
六纠吴、XSS測(cè)試方法
1、工具掃描:APPscan慧瘤、AWVS
2戴已、手工測(cè)試:Burpsuite、firefox(hackbar)锅减、XSSER XSSF
? ? 使用手工檢測(cè)Web應(yīng)用程序是否存在XSS漏洞時(shí)糖儡,最重要的是考慮那里有輸入,輸入的數(shù)據(jù)在什么地方輸出怔匣。在進(jìn)行手工檢測(cè)XSS時(shí)握联,人畢竟不像軟件那樣不知疲憊,所以一定要選擇有特殊意義的字符每瞒,這樣可以快速測(cè)試是否存在XSS金闽。
(1)在目標(biāo)站點(diǎn)上找到輸入點(diǎn),比如查詢接口,留言板等;
(2)輸入一組"特殊字符+唯一識(shí)別字符",點(diǎn)擊提交后,查看返回的源碼,是否有做對(duì)應(yīng)的處理;
(3)通過搜索定位到唯一字符,結(jié)合唯一字符前后語法確認(rèn)是否可以構(gòu)造執(zhí)行js的條件(構(gòu)造閉合);提交構(gòu)造的腳本代碼,看是否可以成功執(zhí)行,如果成功執(zhí)行則說明存在XSS漏洞;
七、XSS繞過
? ? 大多數(shù)網(wǎng)站為了避免xss的攻擊剿骨,對(duì)于攻擊者的輸入都采取了過濾的措施代芜,導(dǎo)致攻擊者通常不能正常插入惡意代碼來達(dá)到攻擊目的。但是仍存在一些漏洞可以利用浓利,來繞過過濾措施挤庇。
? ? xss繞過的方法有許多钞速,主要取決于攻擊者的思路和對(duì)前端技術(shù)的掌握,以下介紹幾個(gè)簡(jiǎn)單的繞過方法嫡秕。
(1)對(duì)前端的限制可以嘗試進(jìn)行抓包重發(fā)或者修改前端的HTML渴语。
(2)防止后臺(tái)對(duì)輸入的內(nèi)容進(jìn)行正則匹配來過濾輸入,對(duì)于這樣的過濾可以考慮大小寫混合輸入的方法昆咽。
例:<sCRipT>alert('666')</sCrIPt>
(3)防止后臺(tái)對(duì)輸入的內(nèi)容進(jìn)行替換遵班,采用拼拼湊的輸入方法。
例:<sc<script>ript>alert('666')</scr<script>ipt>
(4)使用注釋來干擾后臺(tái)對(duì)輸入內(nèi)容的識(shí)別潮改。
例:<sc<!--test-->ript>alert('666')</scr<!--tshauie-->ipt>
(5)編碼
思路:后臺(tái)有可能會(huì)對(duì)代碼中的關(guān)鍵字進(jìn)行過濾,但我們可以嘗試將關(guān)鍵字進(jìn)行編碼后在插入腹暖,瀏覽器對(duì)改編碼進(jìn)行識(shí)別時(shí)汇在,會(huì)翻譯成正常的代碼。(注意:編碼在輸出時(shí)是否會(huì)被正常識(shí)別和翻譯才是關(guān)鍵脏答,不是所有的編碼都是可以的)
八糕殉、XSS繞過之htmlspecialchars()函數(shù)
htmlspecialchars()函數(shù)把一些預(yù)定義的字符轉(zhuǎn)換為 HTML 實(shí)體。
預(yù)定義的字符是:
& (和號(hào))成為 &
" (雙引號(hào))成為 "
’ (單引號(hào))成為'
< (小于)成為 <
>(大于)成為 >
該函數(shù)的語法:htmlspecialchars(string,flags,character-set,double_encode)
過濾原理:htmlspecialchars() 函數(shù)把預(yù)定義的字符轉(zhuǎn)換為 HTML 實(shí)體殖告,從而使XSS攻擊失效阿蝶。但是這個(gè)函數(shù)默認(rèn)配置不會(huì)將單引號(hào)和雙引號(hào)過濾,只有設(shè)置了quotestyle規(guī)定如何編碼單引號(hào)和雙引號(hào)才能會(huì)過濾掉單引號(hào)
可用的quotestyle類型:
ENT_COMPAT - 默認(rèn)黄绩。僅編碼雙引號(hào)
ENT_QUOTES - 編碼雙引號(hào)和單引號(hào)
ENT_NOQUOTES - 不編碼任何引號(hào)
可使用以下語句繞過:? q' onclick='alert(666)'
九羡洁、XSS常規(guī)防范
XSS防御的總體思路是:對(duì)輸入進(jìn)行過濾,對(duì)輸出進(jìn)行編碼
過濾:根據(jù)業(yè)務(wù)需求進(jìn)行過濾爽丹,比如輸出點(diǎn)要求輸入手機(jī)號(hào)筑煮,則只允許輸入手機(jī)號(hào)格式的數(shù)字。
轉(zhuǎn)義:所有輸出到前端的數(shù)據(jù)都根據(jù)輸出點(diǎn)進(jìn)行轉(zhuǎn)義粤蝎,比如輸出到html中進(jìn)行html實(shí)體轉(zhuǎn)義真仲,輸入到JS里面的進(jìn)行JS轉(zhuǎn)義