GXYCTF-2019-禁止套娃
1. git泄露源码
GitHack扫描泄露源码
1 | py -2 GitHack.py http://0e91035e-1a9f-4217-a4b2-af6454fe08b0.node3.buuoj.cn/.git |
泄露源码 index.php,查看:
1 |
|
2. 分析源码
1 | if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) |
[a-z,_]
这就是匹配任意字母到_然后+(?R)? ,后面这个?R是引用当前表达式,形成递归调用,然后继续来匹配。
也就是说,这里这种代码才能通过匹配
1 | a(); |
1 | 1.需要以GET形式传入一个名为exp的参数。如果满足条件会执行这个exp参数的内容。 |
3. 无参数函数
3.1 print_r()
读取文件函数,相似的函数还有:
1 | file_get_content() |
3.2 localeconv()
返回一个包含本地数字及货币格式信息的数组。
3.4 current()/pos()
返回数组中的当前单元,默认取第一个值。
3.4 scandir()
列出目录中的文件和目录 。
3.5 next()
该函数将内部指针指向数组中的下一个元素并输出。
3.6 end()
取数组的最后一项,数组指针指向下一位。
3.7 array_reverse()
以相反的元素返回数组,将数组颠倒。
3.8 array_rand()
随机返回数组的键名。
3.9 array_flip()
交换数组的键和值。
3.10 highlight_file()
打印输出或者返回filename文件中语法高亮版本的代码。
4. 构建payload
1 | ?exp=print_r(scandir(pos(localeconv()))); //查看当前目录文件下的存在的数组 |
1 | ?exp=readfile(next(array_reverse(scandir(pos(localeconv()))))); |
5. 方法二
5.1 session_id(session_start())
这道题目虽然ban了hex关键字,导致hex2bin()被禁用,但是我们可以并不依赖十六进制转ASCII的方式,因为flag.php这些字符是PHPSESSID本身就支持的。使用session之前需要通过session_start()告诉PHP使用session,php默认的是不主动使用session的,session_id()可以获取当前的session_id。
所以我们手动设置名为PHPSESSID的cookie,并设置为flag.php。