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代碼審計的內容。
File Upload
File Upload,即文件上傳漏洞,通常是由於對上傳文件的類型、內容沒有進行嚴格的過濾、檢查,使得攻擊者可以通過上傳木馬獲取服務器的webshell權限,因此文件上傳漏洞帶來的危害常常是毀滅性的,Apache、Tomcat、Nginx等都曝出過文件上傳漏洞。
LOW:
代碼:
<?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // Can we move the file to the upload folder? if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { // No echo '<pre>Your image was not uploaded.</pre>'; } else { // Yes! echo "<pre>{$target_path} succesfully uploaded!</pre>"; } } ?>
可以看到,服務器對上傳文件的類型、內容沒有做任何的檢查、過濾,存在明顯的文件上傳漏洞,生成上傳路徑后,服務器會檢查是否上傳成功並返回相應提示信息。
文件上傳漏洞的利用是有限制條件的,首先當然是要能夠成功上傳木馬文件,其次上傳文件必須能夠被執行,最后就是上傳文件的路徑必須可知。這里三個條件全都滿足。
php版本的一句話木馬,文件格式記得改成php:
上傳成功,並且顯示上傳的路徑。
利用中國菜刀登錄:
Medium:
代碼:
<?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // File information $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // Is it an image? if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && ( $uploaded_size < 100000 ) ) { // Can we move the file to the upload folder? if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { // No echo '<pre>Your image was not uploaded.</pre>'; } else { // Yes! echo "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; } } ?>
Medium級別的代碼對上傳文件的類型、大小做了限制,要求文件類型必須是jpeg或者png,大小不能超過100000B(約為97.6KB)。
漏洞利用1:文件包含+文件上傳
首先我們把之前的php文件改成png文件上傳
然后再普通情況下菜刀肯定連接不上,因為不能解析成php文件。
我們可以利用文件包含,在菜刀的添加地址欄中輸入:
http://192.168.5.100/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.5.100/dvwa//hackable/uploads/onemm.png
然后拿到webshell
漏洞利用2:抓包上傳文件的數據,然后修改其為php文件
然后上傳文件:
上菜刀連接:
漏洞利用三:截斷繞過規則
在php版本小於5.3.4的服務器中,當Magic_quote_gpc選項為off時,可以在文件名中使用%00截斷
修改文件后綴名為.php%00.png
抓包可以看到類型符合要求,並且上傳成功
使用菜刀連接即可。
HIGH:
代碼:
<?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // File information $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ]; // Is it an image? if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && ( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp ) ) { // Can we move the file to the upload folder? if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) { // No echo '<pre>Your image was not uploaded.</pre>'; } else { // Yes! echo "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; } } ?>
strrpos(string,find,start)函數返回字符串find在另一字符串string中最后一次出現的位置,如果沒有找到字符串則返回false,可選參數start規定在何處開始搜索。
getimagesize(string filename)函數會通過讀取文件頭,返回圖片的長、寬等信息,如果沒有相關的圖片文件頭,函數會報錯。可以看到,High級別的代碼讀取文件名中最后一個”.”后的字符串,期望通過文件名來限制文件類型,因此要求上傳文件名形式必須是”*.jpg”、”*.jpeg” 、”*.png”之一。同時,getimagesize函數更是限制了上傳文件的文件頭必須為圖像類型。
漏洞利用1:采取%00截斷
首先使用一張真正的圖片文件,把后綴名改成txt然后打開,在最后加入一句話木馬。萬物皆可txt。
然后成功上傳:
菜刀連接,地址欄變成:http://192.168.5.100/dvwa/vulnerabilities/fi/?page=file:///C:/PhpStudy/PHPTutorial/WWW/dvwa//hackable/uploads/hh.jpg
連接成功拿到webshall。