High Level
查看源碼
<?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 $html .= '<pre>Your image was not uploaded.</pre>'; } else { // Yes! $html .= "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file $html .= '<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函數更是限制了上傳文件的文件頭必須為圖像類型。
漏洞利用
采用%00截斷的方法可以輕松繞過文件名的檢查,但是需要將上傳文件的文件頭偽裝成圖片,由於實驗環境的php版本原因,這里只演示如何借助High級別的文件包含漏洞來完成攻擊。
首先利用copy將一句話木馬文件php.php與圖片文件1.jpg合並
copy 1.jpg/b+php.php/a hack.jpg
生成的文件hack.jpg
打開可以看到,一句話木馬藏到了最后
順利通過文件頭檢查,可以成功上傳。
上菜刀,右鍵添加shell,地址欄填入http://192.168.0.101/dvwa/vulnerabilities/fi/?page=file:///D:/software/wamp/www/dvwa/hackable/uploads/hack.jpg
參數名填hello,腳本語言選擇php。
成功拿到webshell
參考:https://www.freebuf.com/articles/web/119467.html