閱讀本文大概需要 2.4 分鐘
XSS,即跨站腳本攻擊漏洞。
Web 安全中,攻擊者常利用此漏洞,在網(wǎng)頁中注入 JS 攻擊代碼。
一旦受害者訪問該網(wǎng)頁,則 JS 代碼執(zhí)行,攻擊者則能以此進行一系列攻擊操作。
比如竊取用戶 Cookie 信息,甚至可能取得受害者機器的完整控制權(quán)。
今天談一下 3 種 XSS 類型。
以 DVWA 為例。首先將 DVWA 難度設(shè)置為 Low。
0x01 DOM 型 XSS
DOM 型 XSS 是由于瀏覽器 DOM 解析的漏洞所導致的。
值得一提的是,對于 DOM XSS,在網(wǎng)頁源代碼中是看不到 XSS Payload 的。只有在網(wǎng)頁動態(tài)運行過程中,才會注入,通過 F 12 才可以看到。
打開 DVWA 中的 XSS (DOM)。
點擊 Select,可以看到所選的內(nèi)容出現(xiàn)在了地址欄。
打開 HackerBar,Load URL,將地址上的 English 替換為如下 Payload。
<script>alert(1)</script>
成功觸發(fā) XSS,且查看源代碼,看不到這段 XSS Payload。因為這段代碼是在網(wǎng)頁動態(tài)運行過程中插入進去的。
其實就是源代碼里的這一段代碼干的。
<script>
if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
document.write("<option value='' disabled='disabled'>----</option>");
}
document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");
</script>
直接將地址欄參數(shù)插入到了 DOM 中,從而造成了 XSS。
0x02 反射型 XSS
和 DOM 型 XSS 有些類似,不同的是,可以直接在網(wǎng)頁源代碼中看到 XSS Payload。
打開 DVWA 中的 XSS (Reflected)。
在輸入框輸入剛剛使用的 Payload,一樣觸發(fā) XSS。
并且查看源代碼,可以在源代碼中看到 Payload。
服務(wù)端代碼如下。
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
可以看出是由于服務(wù)端直接將客戶端提交的內(nèi)容回顯,導致的 XSS。
0x03 存儲型 XSS
存儲型 XSS 是 XSS 中危害最大的。因為它的 XSS Payload 將會存儲在服務(wù)端,導致每個訪問網(wǎng)頁的用戶都將被攻擊。
打開 XSS (Stored)。
在 Name 和 Message,輸入 Payload,沒錯還是剛剛那個。
出現(xiàn)一點小問題,Name 限制了長度。直接 F 12 修改 maxlength 即可。
提交,成功觸發(fā) XSS。查看源代碼,可以看到剛剛提交的 Payload。
并且每次刷新頁面或者重新進入,都會觸發(fā)。
因為 Payload 被存儲在了服務(wù)端。
每次訪問,服務(wù)端又會將其查詢出來,返回給客戶端。
由此可見存儲型 XSS 的危害性,每個用戶每次訪問,都將受到攻擊。
0x04 總結(jié)
上面只是一些最簡單的 XSS 例子,實際滲透過程中,往往會有各種過濾,各種防火墻,導致 XSS 攻擊失敗。
這個時候就需要知道各種繞過姿勢,這需要我們不斷地去深入學習。
加油!