• 文件上传绕过


    ID
    技术描述
    利用场景/条件
    过程
    参考
    武器库关联
    S1 00截断_url
    • 文件名出现在url中

    当url中出现%00时就会认为读取已结束 eg:https://mp.csdn.net/upfiles/?filename=test.php%00.txt            此时输出的是test.php

    ps:网上大部分教程提到这个技术,其实这个方法只适合任意文件上传后的利用,在上传php文件,因为url读取的内容在%00时就结束了,导致上传的文件一样会被拦截

    https://www.jianshu.com/p/71b8b554d9b3http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html  
    S2 00截断_php
    • php版本要小于5.3.4
    • magic_quotes_gpc需要为OFF状态
    • 有上传的路径且不作检查
    • %00是否要进行urldecode需要看情况

    ps:有一个重点是修改上传的路径进行00截断,而不是文件名

    0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制

    这里在php的后面添加了一个空格和字母a,其实a写不写都可以,这里加a是为了显示空格的位置。空格是为了占位,方便修改00。然后打开hex,(空格的16进制为0x20)修改16进制内容,把20改成00:

     

    这样上传文件时检测的是1.jpg,不会触发过滤,和路径合并后,因为00截断机制,最终保存的文件名为1.php,相当于上传了一个1.php的文件


    另外:
    • path大多数都是存放在表单中的,因此需要在数据包中进行urldecode操作使%00变成字符串结束符号
    • 如果path在非enctype=multipart/form-data的表单中或URL or Cookie中的时候,就可以直接写%00不需要进行URLdecode操作,让服务端对%00进行URL解码即可。
    https://www.jianshu.com/p/71b8b554d9b3http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html  
    S3

    客户端JavaScript检测

    客户端进行了JS校验检测
    • 直接本地禁用JS,不让其做检测 
    • 抓包,修改文件后缀名类型,绕过检测限制
    https://www.cnblogs.com/TomDwan/p/14550984.html  
    S4

    服务器后端检测_

    文件类型检测

    检验请求中content-type是否符合可接受的上传类型

    抓包将http请求头中的content-type改为可接受图片形式,即可绕过,如

    "image/gif"

    "image/png"

    "image/jpeg"

    https://www.cnblogs.com/TomDwan/p/14550984.html  
    S5

    服务器后端检测_

    文件头类型检测 

    使用getimagesize()函数来获取文件的MIME类型,通过文件头进行判断文件类型

    先使用编辑工具在数据最前面添加图片的文件头进行伪造,即可绕过,如:

    gif: GIF89ajpg

    jpeg: FF D8 FF

    png: 89 50 4E 47 0D 0A

    https://www.cnblogs.com/TomDwan/p/14550984.html  

    S6

    服务器后端检测_

    文件内容检测

    对文件的内容做检测

    从特殊敏感字符开始进行Fuzz测试,探测webshell中有多少必要的字符存在被替换,如果构成webshell执行的字符被替换得较多,剩下未过滤的字符的难以支撑webshell执行,可以换个角度利用系统,调用脚本语言,如<script language='php'>system('ls');<script>

    https://www.cnblogs.com/TomDwan/p/14550984.html  
    S7 二次渲染 主要就是后端调用了php的GD库,利用imagecreatefromjpeg()函数提取了文件中的图片数据,然后再重新渲染 借鉴二进制中钩子的思想,其实就是在上传图片中找一块"地方",存储webshell,这块"地方"要求在后端处理后没有被过滤掉。那就上传一个正常的文件,然后下载下来,diff一下,查看哪些位置没有被改动过,然后添加webshell进行尝试。 https://www.cnblogs.com/TomDwan/p/14550984.html  
    S8 IIS 5.x/6.0解析漏洞

    IIS 5.x/6.0

    1.目录解析

    1
    /xx.asp/xx.jpg   如:test.asp/test.jpg

    即:新建一个名为”test.asp”的目录,该目录中的任何文件都被IIS当做asp程序执行(特殊符号是”/“)
    2.文件解析

    1
    test.asp;.jpg

    即分号后的不被解析,仍被IIS当做asp程序执行。

    https://zerlong.com/300.html  
    S9

    IIS7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞

    • IIS7.0/IIS 7.5
    • Nginx <8.03
    • php开启Fast-CGI

    在默认Fast-CGI开启状况下,上传一个名字为wooyun.jpg,内容为
    <?PHP fputs(fopen(‘shell.php’,’w’),'<?phpeval($_POST[cmd])?>’);?>的文件,然后访问wooyun.jpg/.php,在这个目录下就会生成一句话木马 shell.php


    原理:IIS和Nginx在这一点上是一样的,一看到URL中文件后缀是.php,便无论该文件是否存在,都直接交给php处理,而php又默认开启“cgi.fix_pathinfo”,会对文件路径进行“修理”,何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。

    https://yinwc.github.io/2018/07/02/iis%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/https://zerlong.com/300.html  
    S10

    Windows操作系统规则

    • windows
    • 在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,通过抓包,在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被windows自动消除,这样也可以getshell。
    • 在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,如

      phpinfo.php::$DATA

    https://yinwc.github.io/2018/07/02/iis%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/https://blog.csdn.net/weixin_44032232/article/details/109005766  
    S11

    Nginx空字节代码执行漏洞

    nginx version0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37 Nginx在图片中嵌入PHP代码然后通过访问
    xxx.jpg%00.php可以解析php代码,所有可以构造图片马进行解析,下面S17有图片马的构造方法
    https://zerlong.com/300.html  
    S12 绕过安全狗 安全狗4.0
    • 两个=或者三个=都可以达到绕过的效果

    • 文件名中间加符号扰乱某狗匹配,经测试 ";" " " " ' " 均可,如:

    • 切断filename= 和 之后的值,则可以绕过

    • 文件名换行,即hex加入0a,也可以绕过
    https://mp.weixin.qq.com/s?__biz=MzI5MDU1NDk2MA==&mid=2247496973&idx=1&sn=6843d879919ee0ee69311cc4befc05ec&chksm=ec1ca032db6b2924c5a7b7e2f38ff6e4fabbc16dca1332fd8166b18965253e13c618737dea7e#rd  
    S13 apahce换行解析漏洞 Apache 2.4.0~2.4.29
    如下图,已上传一个“6.php换行符”文件。(上传过程后文有记载,在linux可使用如下方法发现文件名后面有换行符:“cat 文件名前部分+Tab键”,如cat 6.p+Tab键)浏览器访问:http://192.168.131.136/upload/upload-labs/master/upload//6.php%0a(访问链接最后加%0a)
    https://zhuanlan.zhihu.com/p/125115734  
    S14

    Apache多后缀解析漏洞

    使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞(如果是使用fastcig模式与php结合的所有版本apache不存在此漏洞)

    上传index.php.abc文件

    Apache会将其解析为php文件。这样可以绕过后台的后缀检测

    https://zhuanlan.zhihu.com/p/125115734  
    S15 条件竞争
    • 服务器先将文件上传到文件夹中,然后检测文件后缀名,不符合过滤条件再删掉
    • 访问目录有写权限

    首先上传一个可以在访问路径下写入webshell的php文件,

    同时我们使用多线程并发的访问刚刚上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个webshell文件。

    https://cloud.tencent.com/developer/article/1650655  
    S16 黑名单绕过 服务器使用黑名单进行过滤,可以尝试使用其他的后缀名绕过
    • php:php3、php4、php5、php7、phtml、pht
    • IIS6.0 默认的可执行文件除了asp还包含这三种
      /wooyun.asa
      /wooyun.cer
      /wooyun.cdx
       
    S17 图片马 需要结合文件包含漏洞或者其他解析漏洞 copy a.jpg/b+yi.asp/a b.jpg          (a.jsp是正常图片,yi.asp是木马,最后b.jpg是图片马,结合文件包含漏洞可以利用)    
    S18 zip文件自解压
    • 允许上传zip文件
    • 并且zip文件可自解压
    如果解压后的路径不变的话比较容易利用,比如上传a.zip后自动解压出a.php,那么上传成功    
    S19 大小写&双写绕过 服务器过滤规则不严谨的情况下

    大小写:c.AsP

    双写:c.asaspp

       
    S20 .htaccess绕过
    • apache
    • 没有禁用.htaccess
    • 上传内容为:

    eg:SetHandler application/x-httpd-php      或AddType application/x-httpd-php .jpg

    的.htaccess文件(具体内容根据语言和apache版本决定)使得原本无害的后缀文件强制使用php或其他语言进行解析

    • 上传带有可执行代码的正常后缀的文件,如S17上面提到的图片马
       
               
     
  • 相关阅读:
    java内存回收机制
    scala学习
    [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
    linux 进程的创建
    linux中的进程和线程
    linux 文件系统
    gdb 调试程序
    makefile
    linux下的gcc编译器
    socket 网络编程
  • 原文地址:https://www.cnblogs.com/1008612mrzou/p/15393788.html
Copyright © 2020-2023  润新知