源码分析
核心源码如下,文件路径:pikachu-mastervulunsafedownloadexecdownload.php
$file_path="download/{$_GET['filename']}";
if(!file_exists($file_path)){
skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');
return ;
}
$fp=fopen($file_path,"rb");
$file_size=filesize($file_path);
ob_clean();//输出前一定要clean一下,否则图片打不开
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));
设置下载的文件路径,并从 Get 请求中获得需要下载的文件名称
$file_path="download/{$_GET['filename']}";
判断文件路径是否存在(源码里只是判断了我们要下载的文件是否在 download 目录下,如果不在该目录下就提示文件不存在,并没有考虑到目录穿越的情况)
if(!file_exists($file_path)){
skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');
return ;
}
以二进制打开文件,并读取文件大小
$fp=fopen($file_path,"rb");
$file_size=filesize($file_path);
最后四行组成了一个完整的下载过程
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));
-
Header("Content-type: application/octet-stream");
:设置了 HTTP 响应的内容类型为 “application/octet-stream”,意味着浏览器会将接收到的数据视为一个要下载的文件,而不是在浏览器打开 -
Header("Accept-Ranges: bytes");
:这行代码告诉浏览器,服务器可以接受字节范围的请求,主要是负责断点续传 -
Header("Accept-Length:".$file_size);
:设置了 HTTP 响应的内容长度为文件的大小,负责正确显示下载进度 -
Header("Content-Disposition: attachment; filename=".basename($file_path));
:设置了 HTTP 响应的内容处置为附件,并指定了下载的文件名
Pikachu 靶场实践
目录穿越
打开 Burp Suite 进行抓包,观察到以 Get 方式对目标文件进行请求
将文件名改为想要下载的文件,这里我们演示下载源码
最终成功获取到源码
目录穿越进阶
当我们不确定文件结果时,可以使用 Burp Suite 的 Intruder 功能,通过增加../
层数对目标文件进行爆破这里先用 “1” 来代替../
的位置
Payload 直接叠加../
的层数即可
模式选择狙击手,最终结果如下
原文始发于微信公众号(天禧信安):【Pikachu 靶场精讲】Unsafe filedownload—不安全的文件下载
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论