代码审计零基础入门之思路篇

news2024/11/17 4:29:39

0x01 前言

ThinkPHP 是一款开源的 PHP 框架,用于快速、简单地开发 PHP 应用程序。它提供了一套丰富的功能和工具,使开发者能够更容易地构建各种规模的 Web 应用。ThinkPHP 的目标是提高开发效率,同时保持代码的可读性和可维护性。thinkphp的许多版本中也爆出了多个漏洞,本篇文章主要记录thinkphp 5.0.23版本 RCE的漏洞复现。

0x02 thinkphp RCE分析

thinkphp的开发框架就不说了,RCE的分析会说的详细点,在此只记录这次分析过程中我对于thinkphp的认识。
主要有两个poc,其实都大同小异

poc1
/?s=captcha
POST
_method=__construct&filter[]=system&method=get&get[]=whoami

贴个执行截图

还有类似验证码的图片,怎么来的
下断点调试,打入poc看看thinkphp内部的一个执行流程。
断点下在哪,thinkphp框架都有一个入口文件index.php,在public目录下,既然我们要在该文件下传数据,那么就在该文件下断点。

这里会调用 start.php 引导文件

执行app.php的run方法,app.php用于配置应用程序的全局设置和参数,我们跟进run方法,跟进之后会进入到Loader.php,

这里判断是否存在对应的类文件,是否是windows环境,然后就包含这个文件。

接下来进入到run方法,这里会创建一个Request类的实例,Request 就是处理请求的类,继续跟进

又需要 Loader 去包含,然后走到Request类的构造方法

这里将POST数据写入到input变量里,

创建完Request实例后,进入到 routeCheck 方法里

这里获取到path,跟进方法

这里做了一个判断,从Config类里获取到varpathinfo的值,然后检查$_GET全局变量里是否存在这个变量,我们不妨跟进这个get方法去看一下

$range是_sys,name属性的值就是var_pathinfo,对应config默认值就是s
那么所获取到的path就是captcha 然后走到路由检查这块地方

时刻关注与request有关的代码,因为可控的地方只有我们请求的数据
这里跟进到check方法

在857行这里,执行的request实例的 method 方法

这里,在config配置类中var_method的默认值就是

然后从$_POST全局变量中找键名为_method的值,这里存在任意函数调用,很关键,我们当前所传的值就是request类的构造方法,这里跟进

遍历键值对,然后判断键名在当前类中是否存在,若存在,就覆盖掉键值。
实际上该类的filter属性是没有空的,我们传的 filter[]=system 会在此刻覆盖掉原有的值,参数值的覆盖同理,又是一个关键的一步。poc中method=get 是将 method 的值给改回来,防止报错。

走到App类的exec方法,应该对应路由的调用,跟进

这里会走到这个分支,还像是captcha路由影响的,至于为什么,代码还没调出来,先留个坑。
然后跟进到 param 方法

$this->mergeParam 为true,进入不到 if 里面,那么进入到input方法
首先是对$name做一些格式 上的处理

然后判断$data是否为数组,满足条件就调用 filterValue 方法,此时的$data和$filter为

弹出filter数组的最后一个元素,然后遍历数组,call_user_func函数调用达到任意命令执行的目的。

poc2

大同小异
?s=captcha
POST
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
在 param 方法中

又有一处method方法的调用,不过参数设置为true了,跟进

调用了 server 方法,参数是 REQUEST_METHOD

最后也会走到input,任意函数调用。
补坑
来补坑了,写完这篇文章之后不甘心,打算又调一下代码,这次算是调明白了。
坑:为什么要get传一个 ?s=captcha
结论:为了方便使 $dispatch=method 从而进入 Request::instance()->param(),当时不懂,为什么传一个captcha 就能让$dispatch=method???

就是在这里,所对应的$dispatch[‘type’]就是method

继续往上跟,看它是由什么赋值

在118行,调用routeCheck方法获取路由调度,这个方法返回的是 $result 那么继续看$result是由谁赋值

路由检查方法的返回值赋给 $result 调试跟的话实际上会走到这里

那么就需要看checkRoute函数的返回值了

此时遍历$rules的下标,有两个元素

拆分,解析路由相关参数

然后跟进到这个函数

在这个match函数里,将 $rule 的内容以斜杠分隔符拆分为数组,然后遍历,经过一系列的判断

这是一个关键点,这里判断$val 和 $m1[$key] 是否不相等,若不相等,返回非0,然后会 return false;所以在get传参上,一定要让s=captcha,至于为什么是参数s,因为在config类中默认参数就是s了。
这里进入不了 elseif 就会遍历下一个元素,

成功匹配后就会调用到 parseRule函数来解析路由

最后就是让 $dispatch[‘type’]=method了,回到了结论。
而如果我们get传入的不是 captcha,在match函数匹配规则的时候就会返回false,然后一路返回false

进入到这个if条件,然后调用 parseUrl 函数

最后返回的 type 是module,在主要执行流中就走不到call_user_func函数了。

0x03 结语

thinkphp没有对用户输入的方法名进行过滤和限制,导致可以任意函数调用,(此时的任意函数只是在Request类中)调用Request类的构造方法达到变量覆盖,最终call_user_func任意代码执行。
主要还是多调试才能理解poc的执行过程。

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql:在字符串类型的列上创建索引,建议指定索引前缀长度

https://dev.mysql.com/doc/refman/8.2/en/create-index.html#create-index-column-prefixes 在字符串类型的列上创建索引,建议指定索引前缀长度,而没有必要用整个列来创建索引。因为用前面的字符创建索引,查询时并不会比在整列上创建索引慢很…

绿盟 SAS堡垒机 local_user.php 权限绕过漏洞复现

0x01 产品简介 SAS 安全审计系统是绿盟科技开发的一款堡垒机。 0x02 漏洞概述 绿盟 SAS堡垒机 local_user.php接口处存在权限绕过漏洞,未经身份认证的攻击者可以访问他们通常无权访问的敏感资源,最终导致系统处于极度不安全状态。 0x03 复现环境 FOFA: body="/ne…

土壤科学灌溉CG-36 土壤水势传感器

土壤科学灌溉CG-36 土壤水势传感器产品概述 土壤水势传感器可以很方便地插入到土壤剖面坑中,在其周围包裹上湿土即可。测定和记录非常简单。免维护、无需校准即可测量较大范围的土壤水势;无需灌水,大量程使得它成为测量自然系统水势的理想传…

javacv的视频截图功能

之前做了一个资源库的小项目,因为上传资源文件包含视频等附件,所以就需要时用到这个功能。通过对视频截图,然后作为封面缩略图,达到美观效果。 首先呢,需要准备相关的jar包,之前我用的是低版本的1.4.2&…

spring boot 实现直播聊天室(二)

spring boot 实现直播聊天室(二) 技术方案: spring bootnettyrabbitmq 目录结构 引入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.96.Final</version> </dependency>Si…

位1的个数

题目链接 位1的个数 题目描述 注意点 输入必须是长度为 32 的 二进制串 解答思路 位运算判断每一位是否为1 代码 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int res 0;for (int i 0; i < 32; i) {res …

Mac中nvm切换node版本失败

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…

【玩转TableAgent数据智能分析】会话式数据分析,所需即所得!

目录 1 TableAgent介绍 2 TableAgent五大优点 3 体验TableAgent 3.1 登录TableAgent平台 3.2 会话式数据分析 4 总结 【优化改善】 【对比TableAgent与文心一言- E言易图】 1 TableAgent介绍 TableAgent是一款数据集成和分析平台&#xff0c;它可以帮助用户从多个数据源中…

【wimdows电脑上管理员账户与管理员身份的区别】

管理员账户 在控制面板的用户账户中&#xff0c;点击更改账户类型&#xff0c;可以看到目前的账户是“管理员账户”还是“标准账户”。 管理员身份 在快捷方式上右击&#xff0c;可以看到&#xff0c;可以选择以管理员身份运行该软件。 如何查看某个应用是否以管理员身份…

大数据云计算之OpenStack

大数据云计算之OpenStack 1.什么是OpenStack&#xff0c;其作用是什么&#xff1f;OpenStack主要的组成模块有哪些&#xff1f;各自的主要作用是什么&#xff1f; OpenStack是一个开源的云计算平台&#xff0c;旨在为企业和服务提供商提供私有云和公有云的建设和管理解决方案…

MySQL第三方备份工具Percona XtraBackup

实验环境&#xff1a; CentOS7.9 准备软件&#xff1a;yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm 一、什么是Percona XtraBackup&#xff1a;Percona XtraBackup&#xff08;简称PXB&#xff09;是 Percona 公司开发的一个用于 MySQL …

Optional.ofNullable的使用

Optional.ofNullable的使用 Optional.ofNullable()方法是Java 8中的一个方法&#xff0c;用于创建一个Optional对象&#xff0c;该对象可能包含一个非空值&#xff0c;也可能为空。如果传递给ofNullable()方法的参数为null&#xff0c;则返回一个空的Optional对象&#xff0c;…

现代雷达车载应用——第2章 汽车雷达系统原理 2.3节 信号模型

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.3 信号模型 雷达的发射机通常发出精心设计和定义明确的信号。然而&#xff0c;接收到的返回信号是多个分量的叠加&#xff0c;包括目标的反射、杂波…

conda环境报错: Solving environment: failed with initial frozen solve.

出现的情况&#xff1a; 解决方法&#xff1a; 参考了许多博客 建议的方法&#xff1a; 创建一个虚拟环境 conda create -n torch_1.3 python3.6 激活虚拟环境 conda activate torch_1.3 conda安装 conda install pytorch1.5.0 如果报错每个包单独安装就可以了&#x…

issue unit

The Issue Unit issue queue用来hold住&#xff0c;已经dispatched&#xff0c;但是还没有执行的uops&#xff1b; 当一条uop的所有的operands已经ready之后&#xff0c;request请求会被拉起来&#xff1b;然后issue select logic将会从request bit 1的slot中&#xff0c;选择…

中通快递查询,中通快递单号查询,并进行多次揽收分析

批量查询中通快递单号的物流信息&#xff0c;并将其中的多次揽收件分析筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

LeetCode 309买卖股票的最佳时机含冷冻期 714买卖股票的最佳时机含手续费 | 代码随想录25期训练营day51

动态规划算法9 LeetCode 309 买卖股票的最佳时机含冷冻期 2023.12.14 题目链接代码随想录讲解[链接] int maxProfit(vector<int>& prices) {//1确定dp二维数组//dp[i][0]表示遍历到第i天时持有股票的当前收入;dp[i][1]表示遍历到第i天时未持有股票的当前收入//dp…

项目管理:如何把项目管理落实到执行细节

一切皆项目&#xff0c;我们的人生也是一个大的项目&#xff0c;在这个大的项目中&#xff0c;拥有多个小的项目&#xff0c;多个阶段&#xff0c;各种活动&#xff0c;小的项目构建成不同大的项目。 对于个人这个项目&#xff0c;我们可以一步步去完成&#xff0c;从项目管理…

SQL进阶理论篇(二):数据库的设计范式

文章目录 简介数据库的设计范式有哪些数据库中的几种键从1NF到3NF1NF2NF3NFBCNF&#xff08;巴斯范式&#xff09; 反范式设计反范式的适用场景总结参考文献 简介 本小节主要内容&#xff1a; 数据库的设计范式都有哪些数据库的键都有哪些1NF、2NF和3NF都是指什么&#xff1f…

初识大数据应用,一文掌握大数据知识文集(1)

文章目录 &#x1f3c6;初识大数据应用知识&#x1f50e;一、初识大数据应用知识(1)&#x1f341; 01、请用Java实现非递归二分查询&#xff1f;&#x1f341; 02、是客户端还是Namenode决定输入的分片&#xff1f;&#x1f341; 03、mapred.job.tracker命令的作用&#xff1f;…