ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Web渗透之SQL注入-堆叠注入(Stacked Queries Injection)

Web渗透之SQL注入-堆叠注入(Stacked Queries Injection) 本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行任何未经授权使用文中技术的行为均与作者无关请务必遵守法律法规获得许可后方可进行渗透测试。目录一、概念1、核心原理2、与普通注入的区别3、触发条件4、常见攻击 Payload5、实际案例6、防御措施7、总结二、靶场注入示例一、靶场代码分析二、正常请求与响应三、堆叠注入攻击过程四、堆叠注入原理五、其他可能的 Payload 示例六、防御措施七、总结一、概念堆叠注入是指攻击者在 SQL 语句末尾使用分号;结束当前查询然后再执行一条或多条额外的 SQL 语句从而实现多条语句连续执行的一种注入技术。1、核心原理在支持多语句执行的数据库连接驱动中SQL 引擎可以一次性解析并执行由分号分隔的多个 SQL 语句。攻击者利用这一特性在原本只有一个查询的位置注入;后跟任意 SQL 命令。示例 原始查询SELECT * FROM users WHERE id 1如果参数id存在注入点攻击者输入1; DROP TABLE users --拼接后的 SQLSELECT * FROM users WHERE id 1; DROP TABLE users -- 数据库会先执行SELECT再执行DROP TABLE users造成破坏。2、与普通注入的区别注入类型是否允许多条语句典型目的普通注入UNION、报错、盲注否窃取数据堆叠注入是执行任意 SQL增、删、改、执行存储过程等3、触发条件堆叠注入并非所有环境都支持需要满足数据库驱动支持多语句执行MySQL PHPmysqli或PDO默认不开启多语句需设置PDO::MYSQL_ATTR_MULTI_STATEMENTS为trueSQL Server、PostgreSQL 默认支持Oracle 需特殊配置Web 应用使用了支持多语句的 API例如 PHP 的mysqli_multi_query()注入点可以成功闭合且注释掉后续多余代码4、常见攻击 Payload1. 删除数据; DELETE FROM users WHERE 11; --2. 插入后门用户; INSERT INTO users (username, password) VALUES (hacker, pass); --3. 修改数据; UPDATE users SET password hacked WHERE username admin; --4. 执行存储过程SQL Server; EXEC xp_cmdshell whoami; --5. 延时盲注某些环境; SELECT SLEEP(5); --5、实际案例假设一个搜索框的 SQL 为$sql SELECT * FROM products WHERE name .$_GET[name].;攻击者输入apple; DROP TABLE products; --结果SELECT * FROM products WHERE name apple; DROP TABLE products; -- 成功删除products表。6、防御措施禁止使用多语句执行函数在 PHP 中避免使用mysqli_multi_query()使用query()或prepare()代替。参数化查询预编译无论是否支持多语句预编译可以彻底防止 SQL 注入。数据库账户最小权限应用程序账户不应有DROP、CREATE等危险权限。输入过滤过滤或转义分号;但不如参数化可靠。WAF 规则拦截包含; SQL 关键字如DROP、INSERT、UPDATE的请求。7、总结堆叠注入危害极大因为它可以执行任意 SQL 命令而不仅仅是窃取数据。但利用条件较为苛刻需要数据库驱动和应用代码的支持。根本防御依然是参数化查询同时限制数据库账户权限。二、靶场注入示例一、靶场代码分析原始 PHP 代码demo4.php如下?php $conn mysql_connect(127.0.0.1, root, root, demo); mysql_query($conn, set names utf8); ​ $id $_GET[id]; ​ $sql delete from userinfo where id{$id}; echo $sql; ​ $res mysql_multi_query($conn, $sql); ?关键漏洞点使用了已废弃的mysql_*函数PHP 7.0 后移除但更重要的是mysql_multi_query()允许一次性执行多条由分号;分隔的 SQL 语句。直接将 GET 参数$id拼接到 DELETE 语句中没有任何过滤或参数化处理。代码没有对用户输入进行转义或校验攻击者可以注入额外的 SQL 语句。注意mysql_multi_query()是mysqli_multi_query()的前身功能相同——执行多条 SQL 语句。堆叠注入正是利用了这一特性。二、正常请求与响应正常请求http://127.0.0.1/demo4.php?id1拼接后的 SQLdelete from userinfo where id1页面输出delete from userinfo where id1仅打印 SQL 语句不显示执行结果但数据库中id1的记录被删除三、堆叠注入攻击过程攻击者在id参数中插入分号;并追加第二条 SQL 语句。恶意请求http://127.0.0.1/demo4.php?id1;delete from userinfo实际执行的 SQL 变成delete from userinfo where id1; delete from userinfo解析第一条语句delete from userinfo where id1删除 id1 的记录第二条语句delete from userinfo删除整个 userinfo 表的所有数据效果全表数据被清空危害极大。四、堆叠注入原理核心数据库驱动支持多语句执行Multi-Query允许用分号;分隔多条 SQL 语句。触发条件应用程序使用了支持多语句的 API如mysql_multi_query、mysqli_multi_query。数据库连接未禁止多语句MySQL 默认允许但 PHP 的mysqli_query()不支持多语句。注入点可以闭合并注释掉后续多余的代码本例中无需注释因为$sql直接拼接没有多余后缀。与普通 SQL 注入的区别普通注入UNION、报错、盲注只能执行一条查询目的是窃取数据。堆叠注入可以执行任意多条 SQL 语句包括INSERT、UPDATE、DELETE、DROP、CREATE等实现数据篡改、删除、提权等破坏性操作。五、其他可能的 Payload 示例目的Payload效果删除整张表1; DROP TABLE userinfo表被删除插入后门数据1; INSERT INTO userinfo (id, name) VALUES (99, hacker)添加恶意用户修改数据1; UPDATE userinfo SET nameadmin2 WHERE id1修改记录延时探测盲注1; SELECT SLEEP(5)响应延迟5秒执行系统命令需权限1; SELECT xp_cmdshell(whoami)SQL Server命令执行六、防御措施禁用多语句执行避免使用mysql_multi_query、mysqli_multi_query等函数。使用mysql_query已废弃或mysqli_query默认不支持多语句即可防止堆叠注入。参数化查询预编译使用 PDO 或 mysqli 的prepare()execute()彻底杜绝 SQL 注入无论是否支持多语句。$stmt $conn-prepare(DELETE FROM userinfo WHERE id ?); $stmt-bind_param(i, $id); $stmt-execute();输入验证对于数字型 ID强制转换为整数$id (int)$_GET[id]。对于字符串使用白名单过滤。最小权限原则数据库账户不应拥有DROP、TRUNCATE、INSERT等危险权限仅授予必要的DELETE且限定表。WAF 规则拦截包含;后接 SQL 关键字如DELETE、DROP、INSERT的请求但注意编码绕过。七、总结堆叠注入危害巨大因为攻击者可以执行任意 SQL 命令而不仅仅是窃取数据。利用条件严格需要应用代码使用multi_query类函数且数据库驱动支持多语句。根本防御参数化查询 禁用多语句函数 最小数据库权限。
返回列表