天天看點

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

目錄

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、數組、/繞過)

upload-labs檔案上傳漏洞(Pass-01~Pass-21)
upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-1(js前端繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

由于是直接對上傳的檔案進行判斷,隻允許.jpg|.png|.gif,上傳檔案後,substring()函數會提取檔案字尾名,由indexOf()處理傳回指定的字元串值在字元串中首次出現的位置,然後進行比較,不符合或沒有找到則返還 -1

從源碼判斷出隻是在送出時,對字尾名進行檢測然後上傳至背景

1.上傳一句話

<?php phpinfo();?>  

2.burpsuite抓包,修改字尾,将. jpg 改為.php

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路1.php

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-2(MiMe繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

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

upload-labs檔案上傳漏洞(Pass-01~Pass-21)
upload-labs檔案上傳漏洞(Pass-01~Pass-21)

上傳後通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

MiMe常見的繞過格式

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-3(黑名單繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

過濾大寫繞過,過濾php、asp等為字尾的檔案,隻是對檔案名進行了限制,但是上傳檔案後,會更改檔案名為目前時間

1.上傳一句話

2.bp抓包,更改檔案字尾

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

注意:在phpstudy下apache服務下,預設配置檔案無法解析以.pthml,.php5等等為字尾的檔案,不更改的話伺服器無法解析

修改步驟

進入phpstudy的根目錄→找到apache檔案夾→打開conf→更改httpd.conf配置檔案

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

更改AllowOverride為All

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

修改預設值#AddType application/x-httpd-php

AddType application/x-httpd-php .php .phtml .php5 .pht

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-04(.htaccess檔案上傳)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

過濾大小寫繞過,phtml,php5等等

1.先上傳.htaccess檔案

2.再上傳1.jpg

.htaccess檔案全稱Hypertext Access(超文本入口),提供了針對目錄改變配置的方法,通過修改此配置檔案,可以幫我們實作自定義錯誤頁面、更改擴充名、使用其他檔案作為index檔案等等

先上傳一個.htaccess檔案

SetHandler application/x-httpd-php //所有上傳的檔案都會當成php來解析  
upload-labs檔案上傳漏洞(Pass-01~Pass-21)

再上傳一個1.jpg,被當成php解析

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-05

(注:更新後的upload-labs又在第四關後插入第五關,原第五關改為第六關,第六關改為第七關,第七關改為第八關,以此類推)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

方法一:

過濾phtml,php5等等,禁止上傳.htaccess檔案

1.過濾不嚴謹,沒有過濾Php1,上傳1.Php1

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

方法二:

點繞過

上傳檔案:1.php. .

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-06(大小寫繞過)

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

過濾phtml,php5等等,禁止上傳.htaccess檔案

1.過濾不嚴謹,沒有對大小寫嚴格過濾,上傳1.Php

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-07(空格繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

沒有對字尾去空處理,沒有對大小寫進行轉換,是以可以在字尾名加空格繞過

1.上傳一句話1.Php

2.bp抓包,在filename的檔案名1.Php後增加一個空格

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-08(windows特性加點繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

沒有對字尾名"."進行處理,利用windows特性,會自動去掉字尾名中最後的".",可在字尾名中加"."繞過

1.上傳1.php

2.bp抓包,将字尾修改為1.php.

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-09(::$DATA繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

在window的時候如果檔案名+'::$DATA'會把::$DATA之後的資料當成檔案流處理,不會檢測字尾名。且保留::$DATA之前的檔案名。利用windows特性,可在字尾名中加::$DATA繞過

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-10(點空點繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

代碼先去除檔案名最後的'.',去除檔案名前後的空格,第15行和之前不太一樣,路徑拼接的是處理後的檔案名,導緻可以利用1.php. .(點+空格+點)繞過

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-11(雙寫繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

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抓包

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-12(GET請求00截斷)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

入手點在substr函數,傳回白名單後進行拼接,如果将字尾名改為.php再利用%00截斷後面的内容,即可執行一句話

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

當以GET方式送出請求的時候,資料會在url内暴露出來,以?分割,多個參數之間用&連接配接

1.上傳檔案

2.bp抓包,添加%00

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

注意:

截斷條件:php版本小于5.3.4,magic_quotes_gpc為NO

更改php版本

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

勾選magic_quotes_gpc

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-13(POST請求00截斷)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; 

以POST方式送出請求的時,資料不會在url内暴露出來,會放置在http包的包體中,以二進制流的方式傳輸,是以需要在二進制中進行修改增加%00

注:有些人的bp是新版,界面上可能并沒有找到可以直接修改二進制的Hex

首先做個标記

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

然後從右拉欄裡找到

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

将2b修改為00即可

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

上傳檔案

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-14(頭檔案繞過、圖檔碼繞過、檔案包含)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

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)

上傳圖檔

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

利用檔案包含通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-15(頭檔案繞過、圖檔碼繞過、檔案包含)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

getimagesize() 函數用于擷取圖像大小及相關資訊,成功傳回一個數組,失敗則傳回 FALSE

将測定 GIF,JPG,PNG等等 圖像檔案的大小并傳回圖像的尺寸以及檔案類型

1.修改一句話,上傳檔案

2.bp抓包擷取檔案路徑

3.利用檔案包含漏洞通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

常見的檔案頭

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

截包,将1.php修改為1.jpg,修改content-type為image/jpeg,然後重放

如果直接通路圖檔,作為php進行解析,需要利用檔案包含通路

payload:127.0.0.1/upload/include.php?file=upload/7220211007162015.gif

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

或者制作圖檔碼代替頭檔案繞過

copy 1.jpg /b + 1.php /a ganyu.jpg

pass-16(頭檔案繞過、圖檔碼繞過、檔案包含)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

php_exif子產品來判斷檔案類型,方法與上面兩題相同

注意:需要先啟用php_exif子產品

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-17(二次渲染)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

當上傳一個檔案的時候,首先$fileext會判斷是否為jpg的同時,content-type是否為image/jpeg,然後使用move_uploaded_file進行處理,成功則執行二次渲染

1.利用windows下的畫圖工具,然後儲存為一張gif格式的圖檔(其他格式有的顯示上傳失敗)

2.上傳後,儲存上傳的圖檔,與原圖做比較,利用winhex寫入一句話

3.利用bp抓包,擷取上傳檔案路徑

4.利用檔案包含讀取、解析

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

上傳成功後,右擊儲存上傳後的檔案

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

利用winhex,對比原圖和上傳圖檔的差別,在相同的地方寫入一句話并儲存,然後再上傳儲存的檔案  

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-18(條件競争)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

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

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

上傳,設定爆破選項

upload-labs檔案上傳漏洞(Pass-01~Pass-21)
upload-labs檔案上傳漏洞(Pass-01~Pass-21)
upload-labs檔案上傳漏洞(Pass-01~Pass-21)

Start attack

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

不斷重新整理浏覽器頁面

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-19(中間件解析漏洞&條件競争)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

利用Apache的解析漏洞,不管最後字尾是什麼,構造以.php.xxx結尾,就會被Apache伺服器解析成php檔案,配合條件競争通路2.php

注意:這裡的路徑缺失'/',上傳的shell路徑為../uploadxxx.php或自行修改源碼

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-20(%00截斷)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)
upload-labs檔案上傳漏洞(Pass-01~Pass-21)

題目多出了一個寫入儲存名稱,注意,與GET送出不同的是,POST方式請求的時,資料不會在url内暴露出來,會放置在http包的包體中,以二進制流的方式進行傳輸,是以需要在二進制中進行修改增加%00

上傳2.php,在上傳之前,寫入儲存名稱為upload-19.php

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

給upload-19.php後寫入+jpg(加号隻是用作标記)

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

将+改為00,選擇+号

然後從右拉欄裡找到

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

将2b修改為00即可

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

上傳

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

pass-21(MIME、數組、/繞過)

源碼:

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

檢測content-type是否存在白名單

判斷save_name是否為空定義$file變量

若file不為數組,則explode('.', strtolower($file))對file進行分割

将file變為一個數組,利用end函數将file數組的最後一個機關指派給$ext

判斷$ext是否比對白名單

将file數組的第一個元素用點拼接最後一個元素,指派給$file_name後上傳

bp抓包

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

1.修改content-type

2.修改POST參數為數組類型,索引[0]為upload-21.php,索引[2]為jpg|png|gif,隻要第二個索引不為1,$file[count($file) - 1]就等價于$file[2-1],值為空

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

通路

upload-labs檔案上傳漏洞(Pass-01~Pass-21)

繼續閱讀