题目
打开靶机后发现就一句话,burpsuite也抓不到重要信息,于是用dirsearch扫描一下
python3 dirsearch.py -u http://d61508ba-cde6-41b2-a2ca-0f69ccadb80e.node4.buuoj.cn:81/
发现了这些,盲猜为git信息泄露,使用GitHack下载源码(GitHack大佬教程)
python GitHack.py http://d61508ba-cde6-41b2-a2ca-0f69ccadb80e.node4.buuoj.cn:81/.git
下载后发现就只有一个index.php文件,看一下源码:
开始审计源码,我们最终的目标是执行@eval($_GET['exp']),从这开始瞄一下大佬的wp,因为我的脚本基础差的没眼看
对于第二个if,(?R)是引用当前表达式,(?R)?这里多一个?表示可以有引用,也可以没有。引用一次正则则变成了[a-z,_]+[a-z, _]+\((?R)?\),可以迭代下去,那么它所匹配的就是print(echo(1))、a(b(c()));类似这种可以括号和字符组成的,这其实是无参数RCE比较典型的例子。
先构建payload查看flag的位置
?exp=print_r(scandir(pos(localeconv())));
localeconv(),回显数组,第一个数组是字符"."点号
解释一下上面的参数:
pos(),传入数组,回显第一个数组的值,pos可以用current代替
所以pos(localeconv())等价于.号
而函数scandir(.)意思是以数组的形式回显当前目录下的所有文件
再配合print_r函数输出数组
flag在第四个数组里 ,我们只要想办法包涵这个文件即将flag.php调到第一个数组里或者是数组指针指向flag.php,这里有两个函数可以使用。
PHP array_reverse() 函数 (w3school.com.cn)数组反转
PHP next() 函数 (w3school.com.cn) 数组指针移动下一位
所以可以先利用函数array_reverse将数组反转,flag就在第二位了,再利用next指向第二位数组,在用文件显示包涵即可输出flag.php文件,构造payload
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
成功获取flag: