前言
这不刚刚学了学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那道框架反序列化题拿下