新手指南:DVWA-1.9全級別教程(完結篇,附實例)之XSS
* 本文原創作者:lonehand,轉載請註明來自FreeBuf.COM
目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/
),
而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地方還請大家指正。
DVWA簡介
DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑒定的PHP/MySQL Web應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防範的過程。
DVWA共有十個模塊,分別是:
Brute Force(暴力(破解))
Command Injection(命令行注入)
CSRF(跨站請求偽造)
File Inclusion(文件包含)
File Upload(文件上傳)
Insecure CAPTCHA (不安全的驗證碼)
SQL Injection(SQL注入)
SQL Injection(Blind)(SQL盲注)
XSS(Reflected)(反射型跨站腳本)
XSS(Stored)(存儲型跨站腳本)
需要注意的是,DVWA 1.9的代碼分為四種安全級別:Low,Medium,High,Impossible。初學者可以通過比較四種級別的代碼,接觸到一些PHP代碼審計的內容。
DVWA的搭建
Freebuf上的文章《新手指南:手把手教你如何搭建自己的滲透測試環境》已經寫得非常好了,在這裡就不贅述了。
本篇為完結篇,介紹XSS模塊的相關內容,之前的教程包括
(點擊文末的閱讀原文,查看這些文章)
:Brute Force
Command Injection
CSRF
File Inclusion
File Upload
Insecure CAPTCHA
SQL Injection
SQL Injection(Blind)
XSS
XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限於JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在伺服器中,XSS可以分為存儲型的XSS與反射型的XSS。
DOM型的XSS由於其特殊性,常常被分為第三種,這是一種基於DOM樹的XSS。例如伺服器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變數時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。
(註:下面的實驗都是在Firefox瀏覽器下進行的,感謝火狐沒做XSS filter)
反射
型
XSS下面對四種級別的代碼進行分析。
Low
伺服器端核心代碼
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ "name" ] != NULL ) {
// Feedback for end user
echo "
Hello " . $_GET[ "name" ] . "
";
}
?>
可以看到,代碼直接引用了name參數,並沒有任何的過濾與檢查,存在明顯的XSS漏洞。
漏洞利用
輸入,成功彈框:
相應的XSS
鏈接:
http://192.168.153.130/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert(/xss/)%3C%2Fscript%3E#
Medium
伺服器端核心代碼
// Get input $name = str_replace( ",成功彈框:
相應的XSS鏈接:
http://192.168.153.130/dvwa/vulnerabilities/xss_r/?name=%3Csc%3Cscript%3Eript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E#
2.大小寫混淆繞過
輸入,成功彈框:
相應的XSS
鏈接:
http://192.168.153.130/dvwa/vulnerabilities/xss_r/?name=%3CScRipt%3Ealert(%2Fxss%2F)%3C%2Fscript%3E#
High
伺服器端核心代碼
// Get input $name = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", $_GET[ "name" ] );
// Feedback for end user echo "
Hello ${name}
";
}
?>
可以看到,High級別的代碼同樣使用黑名單過濾輸入,preg_replace() 函數用於正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)不再有效。
漏洞利用
雖然無法使用,成功彈框:
name
一欄前端有字數限制,抓包改為
:
成功彈框:
Medium
伺服器端核心代碼
// Get input $message = trim( $_POST[ "mtxMessage" ] );
$name = trim( $_POST[ "txtName" ] );
// Sanitize message input $message = strip_tags( addslashes( $message ) );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message );
// Sanitize name input $name = str_replace( ":
成功彈框
2.大小寫混淆繞過
抓包改name參數為:
成功彈框:
High
伺服器端核心代碼
// Get input $message = trim( $_POST[ "mtxMessage" ] );
$name = trim( $_POST[ "txtName" ] );
// Sanitize message input $message = strip_tags( addslashes( $message ) );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message );
// Sanitize name input $name = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", $name );
$name = mysql_real_escape_string( $name );
// Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( "$message", "$name" );";
$result = mysql_query( $query ) or die( "
" . mysql_error() . "
" );
//mysql_close(); }
?>
可以看到,這裡使用正則表達式過濾了