目錄
pass-1(js前端繞過)
pass-2(MiMe繞過)
pass-3(黑名單繞過)
pass-04(.htaccess檔案上傳)
pass-05
pass-06(大小寫繞過)
pass-07(空格繞過)
pass-08(windows特性加點繞過)
pass-09(::$DATA繞過)
pass-10(點空點繞過)
pass-11(雙寫繞過)
pass-12(GET請求00截斷)
pass-13(POST請求00截斷)
pass-14(頭檔案繞過、圖檔碼繞過、檔案包含)
pass-15(頭檔案繞過、圖檔碼繞過、檔案包含)
pass-16(頭檔案繞過、圖檔碼繞過、檔案包含)
pass-17(二次渲染)
pass-18(條件競争)
pass-19(中間件解析漏洞&條件競争)
pass-20(%00截斷)
pass-21(MIME、數組、/繞過)

pass-1(js前端繞過)
源碼:
由于是直接對上傳的檔案進行判斷,隻允許.jpg|.png|.gif,上傳檔案後,substring()函數會提取檔案字尾名,由indexOf()處理傳回指定的字元串值在字元串中首次出現的位置,然後進行比較,不符合或沒有找到則返還 -1
從源碼判斷出隻是在送出時,對字尾名進行檢測然後上傳至背景
1.上傳一句話
<?php phpinfo();?>
2.burpsuite抓包,修改字尾,将. jpg 改為.php
通路1.php
pass-2(MiMe繞過)
源碼:
1.上傳一句話
2.bp抓包,修改content-type
MiMe是什麼?一串簡單的字元串組成的初期辨別了郵件e-mail的附件的類型,後來在html檔案中可以使用屬性表示,當檔案上傳後,content-type會标記檔案類型,簡單來說當我們上傳一個1.php檔案的時候,content-type會自動将我們這個檔案類型辨別為application/octet-stream,不比對時上傳失敗,這裡僅允許content-type為image/jpeg,image/png,image/gif屬性的通過
将content-type辨別的application/octet-stream修改為image/jpeg
上傳後通路
MiMe常見的繞過格式
pass-3(黑名單繞過)
源碼:
過濾大寫繞過,過濾php、asp等為字尾的檔案,隻是對檔案名進行了限制,但是上傳檔案後,會更改檔案名為目前時間
1.上傳一句話
2.bp抓包,更改檔案字尾
注意:在phpstudy下apache服務下,預設配置檔案無法解析以.pthml,.php5等等為字尾的檔案,不更改的話伺服器無法解析
修改步驟
進入phpstudy的根目錄→找到apache檔案夾→打開conf→更改httpd.conf配置檔案
更改AllowOverride為All
修改預設值#AddType application/x-httpd-php
AddType application/x-httpd-php .php .phtml .php5 .pht
通路
pass-04(.htaccess檔案上傳)
源碼:
過濾大小寫繞過,phtml,php5等等
1.先上傳.htaccess檔案
2.再上傳1.jpg
.htaccess檔案全稱Hypertext Access(超文本入口),提供了針對目錄改變配置的方法,通過修改此配置檔案,可以幫我們實作自定義錯誤頁面、更改擴充名、使用其他檔案作為index檔案等等
先上傳一個.htaccess檔案
SetHandler application/x-httpd-php //所有上傳的檔案都會當成php來解析
再上傳一個1.jpg,被當成php解析
通路
pass-05
(注:更新後的upload-labs又在第四關後插入第五關,原第五關改為第六關,第六關改為第七關,第七關改為第八關,以此類推)
源碼:
方法一:
過濾phtml,php5等等,禁止上傳.htaccess檔案
1.過濾不嚴謹,沒有過濾Php1,上傳1.Php1
方法二:
點繞過
上傳檔案:1.php. .
通路
pass-06(大小寫繞過)
過濾phtml,php5等等,禁止上傳.htaccess檔案
1.過濾不嚴謹,沒有對大小寫嚴格過濾,上傳1.Php
通路
pass-07(空格繞過)
源碼:
沒有對字尾去空處理,沒有對大小寫進行轉換,是以可以在字尾名加空格繞過
1.上傳一句話1.Php
2.bp抓包,在filename的檔案名1.Php後增加一個空格
通路
pass-08(windows特性加點繞過)
源碼:
沒有對字尾名"."進行處理,利用windows特性,會自動去掉字尾名中最後的".",可在字尾名中加"."繞過
1.上傳1.php
2.bp抓包,将字尾修改為1.php.
通路
pass-09(::$DATA繞過)
源碼:
在window的時候如果檔案名+'::$DATA'會把::$DATA之後的資料當成檔案流處理,不會檢測字尾名。且保留::$DATA之前的檔案名。利用windows特性,可在字尾名中加::$DATA繞過
通路
pass-10(點空點繞過)
源碼:
代碼先去除檔案名最後的'.',去除檔案名前後的空格,第15行和之前不太一樣,路徑拼接的是處理後的檔案名,導緻可以利用1.php. .(點+空格+點)繞過
通路
pass-11(雙寫繞過)
源碼:
str_ireplace函數:替換字元串中的一些字元(不區分大小寫)。
文法:str_ireplace(find,replace,string)
find:規定查找的值。
replace:規定替換 find 中的值的值
string:規定被搜尋的字元串
如:
<?php echo str_ireplace("WORLD","Shanghai","Hello world!"); ?>
輸出:
Hello Shanghai!
1.雙寫繞過,上傳一個1.pphphp
2.bp抓包
通路
pass-12(GET請求00截斷)
源碼:
入手點在substr函數,傳回白名單後進行拼接,如果将字尾名改為.php再利用%00截斷後面的内容,即可執行一句話
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
當以GET方式送出請求的時候,資料會在url内暴露出來,以?分割,多個參數之間用&連接配接
1.上傳檔案
2.bp抓包,添加%00
通路
注意:
截斷條件:php版本小于5.3.4,magic_quotes_gpc為NO
更改php版本
勾選magic_quotes_gpc
pass-13(POST請求00截斷)
源碼:
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
以POST方式送出請求的時,資料不會在url内暴露出來,會放置在http包的包體中,以二進制流的方式傳輸,是以需要在二進制中進行修改增加%00
注:有些人的bp是新版,界面上可能并沒有找到可以直接修改二進制的Hex
首先做個标記
然後從右拉欄裡找到
将2b修改為00即可
上傳檔案
通路
pass-14(頭檔案繞過、圖檔碼繞過、檔案包含)
源碼:
ction getReailFileType($filename){ $file = fopen($filename, "rb"); $bin = fread($file, 2); fclose($file); $strInfo = @unpack("C2chars", $bin);
檢測是否為真實圖檔格式,fread讀取前兩個字元的數量然後做檢查
1.制作圖檔碼,上傳檔案
2.bp抓包擷取檔案路徑
3.利用檔案包含漏洞執行
構造圖檔碼
copy 1.jpg /b + 1.php /a ganyu.jpg
![]()
upload-labs檔案上傳漏洞(Pass-01~Pass-21)
上傳圖檔
利用檔案包含通路
pass-15(頭檔案繞過、圖檔碼繞過、檔案包含)
源碼:
getimagesize() 函數用于擷取圖像大小及相關資訊,成功傳回一個數組,失敗則傳回 FALSE
将測定 GIF,JPG,PNG等等 圖像檔案的大小并傳回圖像的尺寸以及檔案類型
1.修改一句話,上傳檔案
2.bp抓包擷取檔案路徑
3.利用檔案包含漏洞通路
常見的檔案頭
截包,将1.php修改為1.jpg,修改content-type為image/jpeg,然後重放
如果直接通路圖檔,作為php進行解析,需要利用檔案包含通路
payload:127.0.0.1/upload/include.php?file=upload/7220211007162015.gif
或者制作圖檔碼代替頭檔案繞過
copy 1.jpg /b + 1.php /a ganyu.jpg
pass-16(頭檔案繞過、圖檔碼繞過、檔案包含)
源碼:
php_exif子產品來判斷檔案類型,方法與上面兩題相同
注意:需要先啟用php_exif子產品
pass-17(二次渲染)
源碼:
當上傳一個檔案的時候,首先$fileext會判斷是否為jpg的同時,content-type是否為image/jpeg,然後使用move_uploaded_file進行處理,成功則執行二次渲染
1.利用windows下的畫圖工具,然後儲存為一張gif格式的圖檔(其他格式有的顯示上傳失敗)
2.上傳後,儲存上傳的圖檔,與原圖做比較,利用winhex寫入一句話
3.利用bp抓包,擷取上傳檔案路徑
4.利用檔案包含讀取、解析
上傳成功後,右擊儲存上傳後的檔案
利用winhex,對比原圖和上傳圖檔的差別,在相同的地方寫入一句話并儲存,然後再上傳儲存的檔案
通路
pass-18(條件競争)
源碼:
move_uploaded_file()函數将上傳檔案臨時儲存,再進行判斷
不斷上傳檔案,在檔案還沒被删除前去讀取檔案。
如果上傳檔案1.php内容為
<?php fputs(fopen('2.php','w'),'<?php phpinfo();?>');?>
在判斷1.php的時候,伺服器會解析寫入一個内容為
<?php phpinfo();?>
的2.php檔案。這時使用BurpSuite的Intruder不斷上傳1.php,浏覽器不斷通路2.php,即可造成條件解析漏洞
1.建立一個1.php檔案,寫入<?php fputs(fopen('ganyu.php','w'),'<?php phpinfo();?>');?>
2.上傳檔案,使用bp抓包爆破
3.f5重新整理2.php
上傳,設定爆破選項
Start attack
不斷重新整理浏覽器頁面
pass-19(中間件解析漏洞&條件競争)
源碼:
利用Apache的解析漏洞,不管最後字尾是什麼,構造以.php.xxx結尾,就會被Apache伺服器解析成php檔案,配合條件競争通路2.php
注意:這裡的路徑缺失'/',上傳的shell路徑為../uploadxxx.php或自行修改源碼
通路
pass-20(%00截斷)
源碼:
題目多出了一個寫入儲存名稱,注意,與GET送出不同的是,POST方式請求的時,資料不會在url内暴露出來,會放置在http包的包體中,以二進制流的方式進行傳輸,是以需要在二進制中進行修改增加%00
上傳2.php,在上傳之前,寫入儲存名稱為upload-19.php
給upload-19.php後寫入+jpg(加号隻是用作标記)
将+改為00,選擇+号
然後從右拉欄裡找到
将2b修改為00即可
上傳
通路
pass-21(MIME、數組、/繞過)
源碼:
檢測content-type是否存在白名單
判斷save_name是否為空定義$file變量
若file不為數組,則explode('.', strtolower($file))對file進行分割
将file變為一個數組,利用end函數将file數組的最後一個機關指派給$ext
判斷$ext是否比對白名單
将file數組的第一個元素用點拼接最後一個元素,指派給$file_name後上傳
bp抓包
1.修改content-type
2.修改POST參數為數組類型,索引[0]為upload-21.php,索引[2]為jpg|png|gif,隻要第二個索引不為1,$file[count($file) - 1]就等價于$file[2-1],值為空
通路