很多时候我们发现程序有本地文件包含漏洞或文件读取漏洞却不知道服务器上有什么文件或在哪个文件夹下。比如前段时间我发现某程序有个本地任意文件包含漏洞,由于目标环境设置了basedir,所以我只能包含tmp目录和web目录下的文件。
因为无法操作web目录,所以我瞄向了tmp目录,我们知道向任意php页面发包上传文件都会在tmp目录生成临时文件(php特性),文件名前缀为php加3个或3个以上的随机大小写字母加数字。(如: php47B6) 并且存在时间只有一瞬间。
想在这一瞬间爆破出文件名来几乎不可能,好在php在windows下有个bug,就是能使用<<当通配符用。使用<<符号相当于使用*号通配符。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #file.php View Code PHP <?php include($_GET[‘b4dboy’]); ?> #payload |
这样就可以匹配到php47B6文件,基于这个bug我们可以很轻松的遍历出服务器上的文件和文件夹。
造 成这个bug的原因是由Windows APi FindFirstFile函数引起的,这是FindFirstFile的一个特性,有兴趣的可以自己用c语言来测试下。通过查看php原代码发现在 win32/readdir.c,正是调用了FindFirstFile来操作文件的。所以受影响的并不止include函数。
常用的文件操作函数大部分都受此影响.
1 2 3 4 5 6 7 8 9 10 11 12 | include include_once require require_once fopen copy file_get_contents file_put_contents readfile mkdir move_uploaded_file …… |