dio 上传文件报错_文件上传漏洞“%00截断”绕过

网上传说的 %00截断 其实非常的简单,没有想像中的那么高深,以下给大家简单的讲解一下!还有一点需要注意,关于如何判断文件上传漏洞是否能用%00截断绕过?这个只能试一下才能知道结果,不行的话只能换其它的方法喽!

一、%00截断原理

www.xxx.com/qq.jpg

www.xxx.com/qq.php%00.jpg => www.xxx.com/qq.php

二、文件上传漏洞 %00截断 绕过正确用法

这里需要用上抓包工具,我这里以“BurpSuite ”抓包工具为例,具体步骤如下:

1、 %00截断 GET 用法

当是GET接收情况的时候,直接用 %00 就可以了。

3848c257ed91a38a6ecf25b5e986f148.png

某些情况下,直接在文件名中加 %00 进行截断这是不对的,因为 %00 会以字符串的形式解析了。

如果没有做后缀名判断的情况下,那样会变成:

www.xxx.com/qq.php%00.jpg => www.xxx.com/qq.php%00.jpg

也就是所谓的任意文件上传漏洞了,这又是另一个概念了。

如果做了后缀名判断的情况下,那样是会直接报错,不让你上传,因为你的后缀是 .jpg,不是 .php;

2、%00截断 POST 用法

当是POST接收情况的时候,正确的用法应该是我们需要对 %00 做一个URL编码,也就是URL-decode;

93eb1e019b7338f003bc5165435badb1.png

为什么两者用法不同?

这是因为 %00 截断在 GET 中被 url 解码之后是空字符。但是在 POST 中 %00 不会被 url 解码,所以只能通过 burpsuite 修改 hex 值为 00 (URL decode)进行截断。

注意:

有些时候数据包中必须含有上传文件后的目录情况才可以用。

例如:数据包中存在 path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00

像以下这个PHP文件上传检测代码,这个就需要有上传文件后的目录才能用。

$uploaded_name = $_FILES[ 'file' ][ 'name' ];$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); // 提取上传文件后缀$target_name = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; // 对上传文件进行重命名if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" )) {      move_uploaded_file($_FILES["file"]["tmp_name"],    $dir . $target_name); // 将临时文件移动到指定目录    $result = $dir . $target_name;    echo "Stored in: $result"; }else{    echo "Invalid file";}

为什么修改path才可以?

因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。

那么,攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/20190818.php

移动文件的时候会将文件保存为:uploads/aaa.php

从而达到Getshell效果。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值