这个是源码泄露,用dirsearch扫出来
两个判断语句:
1.if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) //过滤伪协议
2.if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) //只允许传递无参数函数
下面是几个实例(对第二个判断的解释)
1.
2.
区别就是如果函数内有参数,那么结果就为一整串,函数内没有参数才是";"
所以要满足"'"===preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])就要满足传递的函数里面没有参数
这题考的就是没有参数的RCE
法一:getallheaders()---->获取所有请求头
可以看到我们可以修改请求头来传递恶意参数
请看POC:
可以看到成功拿到phpinfo()
法二:get_defined_vars()---->获取当前所有变量
可以通过未使用的传参类型来传递恶意参数,这里使用POST
如果传递的是恶意参数,要想办法先得到改数组
现在要取这个值,可以用array_pop()
成功执行
法三:货币法--->这个被用烂了就简单一点说明了
show_source(next(array_reverse(scandir(pos(localeconv())))));
scandir('.')这个函数的作用是扫描当前目录
localeconv()函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
pos() 函数返回数组第一个值
array_reverse()是将数组颠倒
next()将数组指针一项下一位
show_source()的意思是读取函数内容
法四:session_id()
这里要搭配session_start()
session_start()会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。
1.show_source(session_id(session_start()));
2.print_r(file(session_id(session_start())));
3.highlight_file(session_id(session_start()));
4.readfile(session_id(session_start()));
这题很多做法都能实现,但也有一些被过滤了,但是不重要,重要的是方法和思维
自己动手!!!
自己动手!!!
自己动手!!!
加油学习吧