安洵杯-iamthinking

前言

这不刚刚学了学TP6.0.3的链子么,找到了个相关的赛题,打算做做看,题还挺老的,但还是要学哇,只能加快进度了()

分析

拿源码,简单搜索一些魔术方法,比如__destruct,比如__toString
心里有预期,但没想到大体链子就是和刚学的6.0.3的链子一样,但是有细微的差距,如下

1
2
3
4
5
6
7
8
foreach($query as $value)
{
if(preg_match("/^O/i",$value))
{
die('STOP HACKING');
exit();
}
}

不允许序列化数据以O开头,数组绕过秒了
还有一处有差异

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
protected function checkAllowFields(): array
{
// 检测字段
if (empty($this->field)) {
if (!empty($this->schema)) {
$this->field = array_keys(array_merge($this->schema, $this->jsonType));
} else {
$table = $this->table ? $this->table . $this->suffix : $query->getTable();
$this->field = $query->getConnection()->getTableFields($table);
}

return $this->field;
}

$field = $this->field;

if ($this->autoWriteTimestamp) {
array_push($field, $this->createTime, $this->updateTime);
}

if (!empty($this->disuse)) {
// 废弃字段
$field = array_diff($field, $this->disuse);
}

return $field;
}

跳过了进入db方法,不过无碍,依旧存在拼接
甚至依旧是table这个值,没啥影响
可以跳到__toString方法
实现后半段的链子到达RCE点

总的来说,就是之前学的链子套个数组即可()

按规定传入payload就直接RCE了

结语

还是多审几条链子,小终极目标把suctf那道框架反序列化题拿下