web安全學習筆記(七) XSS(Cross-site scripting)跨站腳本漏洞

1.XSS原理解析

HTML中,有着<script></script>標籤,用於定義客戶端腳本。在<script>與</script>之間輸入代碼,即可實現一些特殊效果。
例如,新建兩個文件,xxstest.html 和 PrintSrc.php兩個文件:

<form action = "PrintStr.php" method="post">
    <input type="text" name="username">
    <input type="submit" value="submit">
</form>
<?php
$name = $_POST['username'];
echo $name;

代碼的含義爲,在xxstest.html頁面,輸入一個用戶名,並在PrintStr頁面打印出來。比如,在xsstest.html頁面輸入abc
在這裏插入圖片描述
點擊submit後,在PrintStr頁面打印abc
在這裏插入圖片描述
但是如果我們在輸入框中輸入,<script>alert(/xss/)</script>時,就會觸發XSS攻擊:
在這裏插入圖片描述
在這裏插入圖片描述
爲什麼網頁不會像abd那樣打印<script>alert(/xss/)</script>,而是彈出了提示框呢?這是因爲alert(/xss/)被包含在script標籤中,標籤中的內容被解析了,這就是XSS漏洞。
XSS漏洞可以分爲三類,反射形XSS,儲存形XSS和DOM形XSS。

2.反射形XSS

反射形XSS也稱爲非持久性XSS,即爲用戶訪問一個帶有XSS的URL時,服務端接收數據後處理,然後把帶有XSS代碼的數據發送到瀏覽器,造成XSS漏洞,這個過程就像一次反射,所以稱爲反射形XSS。
例如,修改PrintSrc.php爲:

<?php
$name = $_GET['username'];
echo $name;

此時訪問URL:http://192.168.85.128/PrintStr.php?username=<script>alert(/xss/)</script>
就會產生XSS漏洞。
在這裏插入圖片描述
那麼這樣的漏洞有什麼危害呢?
假如a和admin都是這個網站的用戶,a用戶發現了這個網站存在XSS漏洞,並且構造了這樣的URL:

這裏構造的是打印用戶的cookie,當然也可以實現將用戶的cookie遠程發送。
a用戶構造了這條URL後,把這條URL發送給了admin用戶。
http://192.168.85.128/PrintStr.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E
若admin用戶點擊了這條URL,
在這裏插入圖片描述
則會顯示admin用戶的cookie信息。若script中間的代碼將用戶admin的cookie遠程發送,那麼a用戶就可以使用這個cookie僞造admin用戶進行登陸(這部分內容下一章進行實驗)

3.存儲型XSS漏洞

顧名思意,與反射型XSS漏洞不同,存儲型XSS漏洞並不需要通過點擊URL的形式中招,而是將部分特殊字符存儲在數據庫中,在加載顯示的過程中,惡意代碼就被解析出來了。
比如在搭建的網站中,登陸的邏輯是這樣的,當我們輸入用戶名和密碼點擊登陸的時候,網站的提示我們,welcome + 用戶名。
在這裏插入圖片描述在這裏插入圖片描述
經過判斷,這裏就有可能存在XSS漏洞,假如我們申請一個用戶,用戶名爲<script>alert(document.cookie)</script>,密碼隨便填。
那麼
註冊完成後,對這個用戶進行登陸。
在這裏插入圖片描述
用戶正常登陸後,本應該是一個用戶查詢的界面,但是卻顯示:
在這裏插入圖片描述
當然,這裏存在的XSS漏洞,只會對登陸的這個用戶產生影響,這裏講述的目的也只是爲了說明什麼是存儲型XSS漏洞。試想,如果一個網站的留言板存在這樣的漏洞,那麼如果惡意用戶不斷在別人的留言板中,插入惡意代碼,那麼所有查看自己留言板的用戶cookie都會被盜取。所以存儲型XSS是最危險的一種跨站腳本。

4.DOM XSS

DOM型XSS和反射型XSS相似點在於,DOM型XSS和反射型XSS都是通過構建URL來插入惡意代碼。不同的是,反射型XSS是把參數交給了服務器,而DOM型的XSS是不需要與服務器端交互的,因爲僅用javascript就可以重構整個html頁面。這裏可以對比一下,舉一個簡單的例子。
新建一個dom.html文件,代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>dom XSS test</title>
</head>
<body>
dom test!
<script>
    var hash = location.hash.slice(1);
    document.write(decodeURI(hash));
</script>
</body>
</html>

此時,如果我們在地址欄輸入:http://192.168.85.128/dom.html#%3Cscript%3Ealert(/xss/)%3C/script%3E,那麼則會觸發XSS漏洞:
在這裏插入圖片描述
這和反射型XSS有什麼區別呢?我們打開burp進行抓包:
首先訪問http://192.168.85.128/PrintStr.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E
在這裏插入圖片描述
我們可以發現,給username傳入的惡意代碼參數被傳送到了服務器,與服務發生了交互。
再訪問http://192.168.85.128/dom.html#%3Cscript%3Ealert(/xss/)%3C/script%3E
在這裏插入圖片描述
我們發現#後面的內容並沒有傳送給服務器。
因此,DOM型XSS與反射形XSS相比有以下的優點:

  • 避開waf
  • 長度不限
  • 隱蔽性強
    這就是不同類型的XSS了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章