天天看點

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

中國菜刀

在web***中,我最期待兩種漏洞,一種是任意指令執行漏洞,如struct2漏洞等;另一種是檔案上傳漏洞,因為這兩種漏洞都是擷取伺服器權限最快最直接的方法。而對于任意指令執行漏洞,如果是通過内網映射出來的,那麼可能還需要使用不同的手段進行***檔案上傳,進而擷取webshell,通過webshell進行端口轉發或者權限提升。

本文主要是介紹檔案上傳中的個人利用技巧經驗彙總,講解分為兩部分:一部份是檔案解析漏洞,另一部份是檔案上傳漏洞。

檔案解析漏洞

解析漏洞主要是一些特殊檔案被iis、Apache、Nginx等服務在某種情況下解釋成腳本檔案格式并得以執行而産生的漏洞。

iis 5.x/6.0解析漏洞

iis6.0解析漏洞主要有以下三種:

1. 目錄解析漏洞 /xx.asp/xx.jpg

在網站下建立檔案夾名字為.asp、.asa的檔案夾,其目錄内的任何擴充名的檔案都被iis當做asp檔案來解析并執行。是以隻要***者可以通過該漏洞直接上傳圖檔馬,并且可以不需要改字尾名!

2. 檔案解析 xx.asp;.jpg

在iis6.0下,分号後面的不被解析,是以xx.asp;.jpg被解析為asp腳本得以執行。

3. 檔案類型解析 asa/cer/cdx

iis6.0 預設的可執行檔案除了asp還包含這三種asa、cer、cdx。

Apache解析漏洞

Apache對檔案的解析主要是從右到左開始判斷并進行解析,如果判斷為不能解析的類型,則繼續向左進行解析,如xx.php.wer.xxxxx将被解析為PHP類型。

IIS 7.0/ Nginx <8.03畸形解析漏洞

在預設Fast-CGI開啟狀況下上傳名字為xx.jpg,内容為:

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

然後通路xx.jpg/.php,在這個目錄下就會生成一句話***shell.php。

Nginx<8.03空位元組代碼執行漏洞

nginx如下版本:0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37在使用PHP-FastCGI執行php的時候,URL裡面在遇到%00空位元組時與FastCGI處理不一緻,導緻可以在圖檔中嵌入PHP代碼然後通過通路xxx.jpg%00.php來執行其中的代碼。

另一種Nginx檔案漏洞是從左到右進行解析,既可繞過對字尾名的限制,又可上傳***檔案,是以可以上傳XXX.jpg.php(可能是運氣,也可能是代碼本身問題,但在其他都不能成功的條件下可以試試)。如下:

Content-Disposition: form-data; name="userfiles"; filename="XXX.jpg.php"

htaccess檔案解析

如果Apache中.htaccess可被執行并可被上傳,那麼可以嘗試在.htaccess中寫入:

SetHandler application/x-httpd-php

然後再上傳shell.jpg的***,這樣shell.jpg就可被解析為PHP檔案了。

作業系統特性解析

由于windows會将檔案的字尾中的空格以及點進行過濾,如果遇到是黑名單校驗的,如限制不允許上傳PHP檔案,而系統又是windows系統,那麼我們可以上傳xx.php ,或者xx.php.,通過這種方式就可以繞過黑名單檢驗的檔案上傳!

檔案上傳漏洞

前端上傳限制

有的網站由于對檔案上傳的地方隻做前端的一個校驗,導緻可輕易繞過,因為前端的一切限制都是不安全的!

如下是一個隻對前端進行校驗的一個上傳測試點:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

在這裡我是開啟了burp抓包的,但是我一點選上傳就提示無法上傳,而burp未抓到任何資料庫,這說明這是一個前端校驗的一個上傳,在這裡我們通過禁用js來直接上傳php的webshell,我們也可以先将我們的php的webshell進行字尾名更改,如更改為jpg,然後上傳,通過burp抓包,然後發往repeater中進行測試,如圖:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

此時我們在将我們上傳的檔案更改為我們的原本字尾名php,即可成功上傳!

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

檔案頭欺騙漏洞

在一句話***前面加入GIF89a,然後将***儲存為圖檔格式,可以欺騙簡單的waf。

從左到右解析

我們在上傳檔案的時候,還有遇到伺服器是從左到右進行解析的漏洞,也就是說伺服器隻檢查檔案名的第一個字尾,如果滿足驗證要求即可成功上傳,但是我們都知道,隻有最後一層的字尾才是有效的,如1.jpg.php,那麼真正的字尾應該是PHP檔案,根據這個我們可繞過相關驗證進行上傳。

我們上傳通過burp抓包并在repeater中進行嘗試上傳:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

此時我們将字尾改為php試試:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

發現上傳失敗,這是我們可以試試上傳一個.jpg.php的PHP檔案:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

我們可以發現,檔案成功上傳!

filepath漏洞

filepath漏洞主要用來突破伺服器自動命名規則,主要有以下兩種利用方式:

1、改變檔案上傳後路徑(filepath),可以結合目錄解析漏洞,路徑/x.asp/

2、直接改變檔案名稱(都是在filepath下進行修改),路徑/x.asp;.

對于第一種我們使用較多,如下是一個上傳測試頁面:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

我們使用burp進行抓包并且發往repeater裡面,如圖:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

此時我們上傳是不成功的,而請求的頭裡面顯示了上傳後的目錄,此時我們在此目錄下新增一個eth10.php的目錄,然後将filename改為圖檔格式,如jpg,但是如果直接這樣的話還是上傳不成功,于是我們可以結合00截斷來進行上傳,在建立的目錄後面使用00截斷,如圖上傳成功:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

另外有一種情況我們我們在原目錄下建立一個eth10.php的檔案,然後直接使用00截斷,這樣我們依舊可以上傳php檔案,因為上傳是使用filepath以及filename來控制的,filename白名單,那麼我們就可以從filepath入手!利用手法和上面一樣,唯一的差別是在00截斷前不加最後一個斜杠(/),

00截斷

00截斷的兩種利用方式:

1、更改filename,xx.php .jpg,在burpsuit中将空格對應的hex 20改為00

2、更改filename,xx.php%00.jpg,在burpsuit中将%00進行右鍵轉換-url-urldecoder

filetype漏洞

filetype漏洞主要是針對content-type字段,主要有兩種利用方式:

1、先上傳一個圖檔,然後将content-type:p_w_picpath/jpeg改為content-type:text/asp,然後對filename進行00截斷,将圖檔内容替換為一句話***。

2、直接使用burp抓包,得到post上傳資料後,将Content-Type: text/plain改成 Content-Type: p_w_picpath/gif。

我們經常使用的一般是第二種,主要是将conten-type改為伺服器accept的類型。如下圖是一個簡單的上傳測試頁面:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

我們直接上傳一個PHP的檔案,使用burp進行抓包,然後發往repeater裡,如圖:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

此時顯示的是非圖檔檔案,此時我們将conten-type改為伺服器accept的圖檔類型,即可成功上傳php檔案,圖中顯示的flag你可以當成是實戰中生成成功後的路徑,進而getshell,如圖:

php檔案上傳漏洞 抓包,淺談檔案解析及上傳漏洞

iconv函數限制上傳

如果某天你上傳檔案發現,不管你上傳什麼檔案,上傳後的檔案都會自動添加一個.jpg的字尾,那麼我們可以懷疑是否是使用iconv這個函數進行了上傳的限制,此時我們可以使用類似00截斷的方法,但是這裡不是00截斷,二是80-EF截斷,也就是說我們可以修改HEX為80到EF中的某一個來進行截斷,如果真是使用這個函數的話,那麼恭喜你上傳任意檔案成功!如上傳一個xx.php ,然後截斷抓包将後面的空格對應的十六進制改為80到EF中的任意一個!

雙檔案上傳

再一個檔案上傳的地方,右鍵審查元素,首先修改action為完整路徑,然後複制粘貼上傳浏覽檔案(

表單送出按鈕

我們有時掃描發現上傳路徑,可是隻有一個浏覽檔案,卻沒有送出按鈕,此時我們就需要寫入送出按鈕。

寫入表單:

F12審查元素,在選擇檔案表單下面添加送出按鈕代碼。