文件上传漏洞%00截断绕过
声明:该文章由作者(大明最后一个狠人)发表,转载此文章须经作者同意并请附上出处(0XUCN)及本页链接。。
网上传说的 %00截断 其实非常的简单,没有想像中的那么高深,以下给大家简单的讲解一下!还有一点需要注意,关于如何判断文件上传漏洞是否能用%00截断绕过?这个只能试一下才能知道结果,不行的话只能换其它的方法喽!
一、%00截断原理
www.ijiandao.com/qq.jpg
www.ijiandao.com/qq.php%00.jpg => www.ijiandao.com/qq.php
二、文件上传漏洞 %00截断 绕过正确用法
这里需要用上抓包工具,我这里以“BurpSuite ”抓包工具为例,具体步骤如下:
1、 %00截断 GET 用法
当是GET接收情况的时候,直接用 %00 就可以了。
某些情况下,直接在文件名中加 %00 进行截断这是不对的,因为 %00 会以字符串的形式解析了。
如果没有做后缀名判断的情况下,那样会变成:
www.ijiandao.com/qq.php%00.jpg => www.ijiandao.com/qq.php%00.jpg
也就是所谓的任意文件上传漏洞了,这又是另一个概念了。
如果做了后缀名判断的情况下,那样是会直接报错,不让你上传,因为你的后缀是 .jpg,不是 .php;
2、%00截断 POST 用法
当是POST接收情况的时候,正确的用法应该是我们需要对 %00 做一个URL解码,也就是URL-decode;
为什么两者用法不同?
这是因为 %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效果。
[超站]友情链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
- 1 跨越山海的友谊 7950748
- 2 媒体评前体操冠军当性感网红 7914390
- 3 保时捷公开道歉 7878439
- 4 2024年世界互联网大会乌镇峰会亮点 7721832
- 5 曾被举报出轨的县委副书记落马 7692280
- 6 哈尔滨中央大街铺上地毯了 7563638
- 7 黄圣依 死脑快想啊 7468468
- 8 故意冲撞石山舰 17人被抓 7335820
- 9 王楚钦说张本智和赢得不容易 7282153
- 10 9条具体措施稳外贸 7140180