匯總鏈接:
------------------------------------------------------------------分割線------------------------------------------------------------------
File ,即文件上傳漏洞,通常是由于對(duì)上傳文件的類型、內(nèi)容沒有進(jìn)行嚴(yán)格的過濾、檢查上傳一句話但上傳文件會(huì)自動(dòng)重命名,使得攻擊者可以通過上傳木馬獲取服務(wù)器的權(quán)限,因此文件上傳漏洞帶來(lái)的危害常常是毀滅性的,、、Nginx等都曝出過文件上傳漏洞。
下面對(duì)四種級(jí)別的代碼進(jìn)行分析。
Low 服務(wù)器端核心代碼
Your image was not uploaded.
';}else {// Yes!echo "
{$target_path} succesfully uploaded!
";}}?>
可以看到,服務(wù)器對(duì)上傳文件的類型、內(nèi)容沒有做任何的檢查、過濾,存在明顯的文件上傳漏洞,生成上傳路徑后,服務(wù)器會(huì)檢查是否上傳成功并返回相應(yīng)提示信息。
漏洞利用
文件上傳漏洞的利用是有限制條件的,首先當(dāng)然是要能夠成功上傳木馬文件,其次上傳文件必須能夠被執(zhí)行,最后就是上傳文件的路徑必須可知。
1.上傳文件
上傳成功后返回路徑。
2.使用菜刀連接。
服務(wù)器端核心代碼
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' ]; //上傳的原文件類型,通過mime判斷
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; //上傳的原文件大小
// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) { //必須是jpeg或者png類型以及文件大小不超過100K
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo 'Your image was not uploaded.
';}else {// Yes!echo "
{$target_path} succesfully uploaded!
";}}else {// '
Your image was not uploaded. We can only accept JPEG or PNG images.
';}}?>
可以看到,級(jí)別的代碼對(duì)上傳文件的類型、大小做了限制,要求文件類型必須是jpeg或者png,大小不能超過(約為97.6KB)。
漏洞利用
抓包修改文件類型,上傳test.php文件,通過改包
完成后,查看發(fā)現(xiàn)在直接上傳成功。

通過菜刀直接連接。
High 服務(wù)器端核心代碼
Your image was not uploaded.
';}else {// Yes!echo "
{$target_path} succesfully uploaded!
";}}else {// '

Your image was not uploaded. We can only accept JPEG or PNG images.
';}}?>
函數(shù)解析 (,find,start)
函數(shù)返回字符串find在另一字符串中最后一次出現(xiàn)的位置,如果沒有找到字符串則返回false,可選參數(shù)start規(guī)定在何處開始搜索。
( )
函數(shù)會(huì)通過讀取文件頭,返回圖片的長(zhǎng)、寬等信息,如果沒有相關(guān)的圖片文件頭,函數(shù)會(huì)報(bào)錯(cuò)。
可以看到,High級(jí)別的代碼讀取文件名中最后一個(gè)”.”后的字符串,期望通過文件名來(lái)限制文件類型,因此要求上傳文件名形式必須是”.jpg”、”.jpeg” 、”*.png”之一。同時(shí),函數(shù)更是限制了上傳文件的文件頭必須為圖像類型。
漏洞利用
需要將上傳文件的文件頭偽裝成圖片。
參數(shù)/b指定以二進(jìn)制格式復(fù)制、合并文件; 用于圖像類/聲音類文件
參數(shù)/a指定以ASCII格式復(fù)制、合并文件。用于txt等文檔類文件
在文件打開最后可以看到有一句話木馬
直接上傳,由于是JPG圖片所以可以直接上傳成功。如果此時(shí)服務(wù)器有解析漏洞就大功造成了(會(huì)寫個(gè)小總結(jié)在最后);
由于安裝DVWA用的是工具,web服務(wù)器軟件版本均比較新,漏洞均不存在,只好借用DVWA的其它功能一起來(lái)完成。
1.將命令注入漏洞將test.jpg重命名為test.php
1.1.1.1 | …\\\test.jpg test.php
然后用菜刀直接連接即可。
2.用文件包含漏洞來(lái)讓菜刀進(jìn)行連接
:///D://www/dvwa///test.jpg
用菜刀添加上述地址,并且先用菜刀自帶的瀏覽器登陸一下DVWA然后再將DVWA的模式改為High,再來(lái)連接即可成功。
服務(wù)器端核心代碼
// 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 "${target_file} succesfully uploaded!
";}else {// '
Your image was not uploaded.
';}// any temp ( ( $ ) )( $ );}else {// '
Your image was not uploaded. We can only accept JPEG or PNG images.
';}}// Anti-CSRF Token();?>
函數(shù)說明 ()
函數(shù)返回相應(yīng)選項(xiàng)的值
( )
函數(shù)返回圖片文件的圖像標(biāo)識(shí),失敗返回false
( image , , )
從image圖像以為文件名創(chuàng)建一個(gè)JPEG圖像,可選參數(shù),范圍從 0(最差質(zhì)量,文件更小)到 100(最佳質(zhì)量,文件最大)。
( img )
函數(shù)銷毀圖像資源
可以看到,級(jí)別的代碼對(duì)上傳文件進(jìn)行了重命名(為md5值,導(dǎo)致截?cái)酂o(wú)法繞過過濾規(guī)則),加入Anti-CSRF token防護(hù)CSRF攻擊,同時(shí)上傳成功后作不顯示文件上傳的路徑,導(dǎo)致攻擊者無(wú)法連接上含有惡意腳本的圖片文件。而且似乎將圖片重做了上傳一句話但上傳文件會(huì)自動(dòng)重命名,在上傳的圖片文件中也找不到惡意腳本了。
總結(jié)文件上傳漏洞的利用: 一、結(jié)合幾個(gè)解析漏洞:
1. 解析漏洞:
解析: test.php.abc(其中abc為任意不屬于黑名單且也不屬于解析白名單的名稱)
描述:一個(gè)文件名為x1.x2.x3的文件, 會(huì)從x3的位置往x1的位置開始嘗試解析,如果x3不屬于能解析的擴(kuò)展名,那么會(huì)嘗試去解析x2的位置,這樣一直往前嘗試,直到遇到一個(gè)能解析的擴(kuò)展名為止。
2.IIS 解析漏洞:
解析:test.asp/abc 或 test.asp;abc 名 或 abc/def.php (其中abc、def都為任意文件名)
描述:IIS6.0在解析asp格式的時(shí)候有兩個(gè)解析漏洞,一個(gè)是如果目錄名包含".asp"字符串,那么這個(gè)目錄下所有的文件都會(huì)按照asp去解析,另一個(gè)是只要文件名中含有".asp;“會(huì)優(yōu)先按asp來(lái)解析;IIS7.0/7.5是對(duì)php解析時(shí)有一個(gè)類似于Nginx的解析漏洞,對(duì)任意文件名只要在URL 后面追加上字符串”/任意文件名.php"就會(huì)按照php的方式去解析。
3.Nginx 解析漏洞:
解析:abc/def.php 或 abc.php (其中abc、def都為任意文件名)
描述:目前Nginx 主要有這兩種漏洞,一個(gè)是對(duì)任意文件名,在后面添加/abc.php 的解析漏洞,如原本文件名是test.jpg則可以添加為test.jpg/x.php進(jìn)行解析攻擊。還有一種是對(duì)低版本的Nginx 可以在任意文件名后面添加.php 進(jìn)行解析攻擊。
二、結(jié)合文件包含漏洞