freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

thinkphp3.2.3文件包含RCE
2021-12-06 15:39:06
所属地 辽宁省

thinkphp3.2.3RCE

ThinkPHP3.2.X RCE漏洞 分析,复现)

漏洞利用条件:

assign方法变量可控
如:

漏洞分析

tp3基础

assign两种调用方法:

  1. 传入一个数组如assign(array('a'=>'haha'));

  2. 传入两个变量assign('a','haha');
    暂且将a和haha称为键值对,
    assign方法传入的键值对可以在模板中通过{$变量名}调用
    如在模板中使用{$a}即可取到haha

display方法,显示模板内容,参数是模板位置,如果参数为空调用默认模板

分析

tp3在解析模板时,会生成一个php缓存文件$_filename,将解析后的模板写入这里,然后再include $_filename
解析过程中将 {$a}变成 :<?php echo ($a); ?>,在这之前使用extract,生成变量$a=haha
这样就达到了模板可以直接调用键值对的效果

缓存变量名是$_filename
所以,如果我在assign传入('_filename','日志'),那extract就会导致变量覆盖,然后include日志文件
http://xxx.com?s=<?php phpinfo();?>,就会触发报错,将url写入日志,然后include日志,getshell

复现的时候发现个问题,写入日志时,直接访问http://xxx.com?s=<?php phpinfo();?>尖括号会被浏览器编码

burp抓包改下就好了

代码调试


如图,获取一个test参数,assign,然后display
访问:http://tp3.cc/?test[_filename]=./Application/Runtime/Logs/Common/21_08_03.log

assign

  1. Controller的assign调用view的assign

  2. assgin将键值对存到tVar里

display

  1. Controller的display调用view的display

  2. 调用fetch方法

  3. tVar值传给了params['var'],然后传给了listen

  4. 跟踪params,调用了exec

  5. 继续跟踪发现调用了Behavior\ParseTemplateBehavior->run

  6. 变量传给了$data,又将$_data['var']传给了fetch

  7. 又load

  8. 终于

    extract变量覆盖,,这里include的就是日志文件

  1. assgin将键值对存到tVar里

display

  1. Controller的display调用view的display

  2. 调用fetch方法

  3. tVar值传给了params['var'],然后传给了listen

  4. 跟踪params,调用了exec

  5. 继续跟踪发现调用了Behavior\ParseTemplateBehavior->run

  6. 变量传给了$data,又将$_data['var']传给了fetch

  7. 又load

  8. 终于

    extract变量覆盖,,这里include的就是日志文件

# web安全 # 漏洞分析 # 代码审计 # ThinkPHP # 漏洞复现
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录