upload-labs闖關


upload-labs闖關

1關

  1. 原理:客戶端(前端js驗證文件是否正確)驗證,可以直接抓包,重放繞過。

2關

  1. 原理

mime:多用途互聯網郵件擴展類型。是設定某種擴展名文件用一種應用程序來打開的方式類型(規定了擴展名)

  1. 可以用第一關的方式繞過

  2. 原理:其content-type(mime)是由客戶端根據你上傳的文件生成的,但限制只能是jpg/image格式,所以抓包改就好了

    也可以抓一個正確的包,修改器白名單限制類型

改mime為image/jpeg

3關

黑名單過濾,禁止上傳.asp|.aspx|.php|.jsp后綴文件。更改后綴解析

例:AddType application/x-httpd-php .php .php3 .phtml

apche服務配置以上語句 將.php .php3 .phtml都以php格式解析,所以思路就是修改可以解析的后綴。

需要自己修改apche配置文件httpd.conf,構造漏洞環境)

AddType application/x-httpd-php .php .php3 .phtml

但是我是phpstudy新版,無法解析文件環境問題

4關

查看源碼,發現過濾了幾乎所有的后綴名,還是黑名單。

htaccess文件:是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過htaccess文件,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。

原理:他沒有過濾 .htaccess后綴,我們可以構建一個htaccess配置文件,讓所有格式文件都解析為php,然后再上傳圖片馬(只要后綴是允許的,隨便都可以)就會被解析了。

.htaccess語句:

SetHandler application/x-httpd-php

  1. 上傳.htaccess文件

  2. 上傳圖片馬(千萬不要用phpstudy的新版本,解析不了,只能用老版本,我在新版本哪里浪費了很多時間)

5關

還是先看源碼,發現還是黑名單過濾,這次包括了.htaccess后綴,但是第四關源碼全部轉化為了小寫,第五關沒有過濾大小寫。所以可以通過大小寫繞過。

1-直接將木馬后綴改為1.Php就好了

6關

首先查看源代碼,發現也是黑名單過濾。只是沒有收尾去空。所以可以更改后綴,在末尾加入空格。windows后綴會刪除末尾的.和空格。所以bp抓包,將文件改為1.php .(空格加點),傳進去后會刪除空格和.保留1.php文件名。(因為bp不能末尾加空格無用,所以換成空格加.)

1-后綴改為1.php .

7關

黑名單,沒有對后綴名進行去"."處理,在bp中改為1.php. ,傳成功后就會自動刪除“.”

8關

查看源代碼,黑名單過濾,沒有對后綴名進行去”::$DATA”處理,利用windows特性,可在后綴名中加” ::$DATA”繞過:

NTFS文件系統包括對備用數據流的支持。這不是眾所周知的功能,主要包括提供與Macintosh文件系統中的文件的兼容性。備用數據流允許文件包含多個數據流。每個文件至少有一個數據流。在Windows中,此默認數據流稱為:$ DATA。

1-bp中文件后綴改為:1.php::$DATA

9關

查看文件源代碼,還是黑名單過濾,先刪除文件名末尾的點,再進行首尾去空。都只進行一次。故可以構造點空格點進行繞過。

1-后綴名為:1.php. .

10關

原理:利用str_ireplace對黑名單里的文件后綴名進行了替換,換成空字符,使用了str_ireplace函數,即不區分大小寫,故大小寫繞過不適用。但是這里替換是替換成了空字符。

順序雙寫,我們就可以構建.pphphp后綴。從左至右識別到php替換后,還剩下一個php。(不能.phpphp這樣全部都能識別替換)

11關

查看源代碼,發現使用了白名單,只允許jpg,png,gif三種格式文件。

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上傳出錯!';
        }
    } 

理解原理:$_GET['save_path']函數是文件最終存儲路徑。代碼里面拼接了一些隨機字符,我們可以上傳1.jpg,而在 save_path這個最終保存路徑函數下面保存為1.php並加上%00來隔斷后面的隨機字符,這樣實際存儲到服務器上面路徑上就是1.php的后綴了。

這里利用的是00截斷。即move_uploaded_file函數的底層實現類似於C語言,遇到0x00會截斷

截斷條件:
1、php版本小於5.3.4
2、php.ini的magic_quotes_gpc為OFF狀態

  1. 將1.php改為1.jpg后綴(白名單限制),抓包?save_path=../upload/1.php%00

  2. 加入截斷%00

  3. 返回url時間戳,復制地址,粘貼測試,../upload/1.php /3120200428231832.jpg

12關

原理:和11關一樣,但11關是$_GET['save_path'],12關是$_POST['save_path']。請求方式不同。還是用截斷的方法繞過,我試了一下%00發現不成功。

原理:通過get方式在url中添加%00,通過get方式傳遞到服務器會被自動解碼,所以ASCII碼數值0對應的(null)字符,達到截斷的目的。

遇到ascii碼為零的位置就停止,而這個ascii碼為零的位置在16進制中是00

​ 通過post,加入%00不會被服務器解碼,只會原樣被參數變量接受。所以這里要修改post數據的16進制來達到截斷的目的。(0x00是十六進制表示方法,是ascii碼為0的字符,在有些函數處理時,會把這個字符當做結束符。)就是說系統是按16進制讀取文件(或者說二進制)。

1-可以通過bp直接url手動解碼

../upload/1.php%00,選擇%00右擊選擇convert selection(轉換)-> url->url decode(url解碼)

2-也可以在hex里面修改1.php后面的一個字符的16進制改為00,來對應asscall碼的0字符達到截斷的作用。

具體參照:https://www.zhaosimeng.cn/writeup/68.html

17關

原理:時間差,競爭關系。

上傳木馬文件會在緩存中停留幾毫秒然后才被刪除掉,可以利用這個時間差執行操作。

1-首先抓取上傳木馬的數據包

木馬構造語句,在解析執行時,創建一個新的shell2.php木馬文件,內容為一句話木馬。只要訪問成功就可以在這個時間差內,寫入一個新文件,即使這個文件之后被刪除也沒有關系。

’);?>

2-抓取訪問包

通過不停的訪問,來在這個時間差內抓取到還未刪除的木馬文件,使其解析執行。

3-在爆破模塊,先執行訪問包,在執行木馬包。這樣能更大概率的能成功執行木馬文件。pload配置如下

每個包都不斷發送2000次,這樣總會抓住時間差,解析木馬成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM