无参数RCE
遇到一些正则匹配判断
if(';' === preg_replace('/[^W]+((?R)?)/', '', $_GET['code'])) {
eval($_GET['code']);
}
在这一串代码中我们不能转入参数,只能传入函数,因此我们只能通过利用函数得到rce的目的
bypass的方法
这里我们通过嵌套函数的方法达到目的
getallheaders()
这个函数就要用来获取http标头,例如cookie;user-agent;content-type之类的
我们可以通过让服务器执行我们http传入的内容,导致代码执行,也就是利用getallheaders()传入rce命令。
但是只有getallheaders()函数还不够,这里我们利用其他函数,从getallheaders()数组中获取我们需要的内容。
end()
end()函数可以将数组的内部指针自动到最后一个单元,也就是我们可以通过end()获取到getallheaders()数组中的最后一个值
因此我们可以使用
?c=eval(end(getallheaders()))
的方法,然后将content-type放置到header中的第一个,这样我们就可以通过content-type传参了
我们可以看到ls不能执行,因为没有匹配上正则,eval函数不被执行
因此我们可以利用上面说的方法
我们除了把Content-Type放到最底下,我们还可以放到http头最上面,然后利用函数array_reverse倒转到最底下
这个就是getallheaders()+end()+array_reverse()利用方法
get_defined_vars()方法
get_defined_vars可以用来返回所有变量的数组
我们可以向get再传多一个参数
current()
这里再用多一个函数current,current可以用来获取数组中的当前的值,默认第一个,也就是获取到数组中的GET,而GET里面还有一个数组用来存储具体参数,因此我们再利用end来获取test的值作为参数
这个是get_defined_vars()+current()+end()利用方法
session_start()+session_id() [仅限于php7以下的]
session_id()可以用来获取/设置当前会话的id
session_start()可以启动新会话或者重用现有的会话
我们利用session_start()启动session机制然后通过session_id()读取id
然后再cookie传入参数
只读取文件的方法
scandir(pos(localeconv()))可以找到服务器的根目录
使用show_file和highlight_file可以读取指定文件
原文始发于微信公众号(YaYaLiou):无参数RCE学习分享
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论