#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍05-基于堆叠查询的SQL注入(Stacked Queries SQL Injection)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。
目录
一、堆叠查询注入原理
原理:
示例:
二、与联合注入(union injection)的区别
三、使用条件及其局限性
四、在实战中的应用示例
(一)MySQL数据库实例
(二)CTF实战示例
攻击过程
示例
防御措施
一、堆叠查询注入原理
在SQL中,分号(;)用来表示一条sql语句的结束。堆叠查询注入的基本思想是在一个分号结束一个SQL语句后继续构造下一条语句,多条语句一起执行,这就形成了堆叠查询注入1。例如在MySQL的命令行中,这种方式是可行的。
原理:
- 分号分隔:在SQL语句中,分号(;)是用来表示一条语句结束的标志。攻击者可以通过在输入中插入分号,并在其后构造新的SQL语句,使得数据库引擎按顺序执行这些语句。
- 多条语句执行:某些数据库函数或API支持同时执行多条SQL语句(如MySQL中的
mysqli_multi_query()
函数)。攻击者可以利用这一特性,将恶意的增删改查操作与正常的查询操作结合在一起执行。- 权限要求:堆叠注入的成功与否还取决于攻击者的权限。如果攻击者没有足够的权限,某些操作可能无法成功执行。
示例:
假设有一个用户登录表单,用户输入的用户名和密码会被传递到后端的SQL查询中进行验证。如果应用程序没有对用户输入进行适当的过滤和转义处理,攻击者可以构造如下输入:
' OR '1'='1'; DELETE FROM users WHERE '1'='1'; -- 其他恶意操作... -- ' AND password='任意密码' -- 其他正常操作... -- ' AND password='任意密码' -- 其他正常操作... -- ' AND password='任意密码' ... ... ... ... ... ... ... ...... ...... ...... ...... ..... ..... ..... ..... .. .. .. .. . . . . . . . ............ ............ ............ ............ ............ .............
二、与联合注入(union injection)的区别
- 可执行语句类型
- 联合注入:union或者union all执行的语句类型是有限的,主要用来执行查询语句1。
- 堆叠查询注入:可以执行的是任意的语句,像insert,update,create,delete等常规数据库语句都可以执行,而不仅仅局限于查询语句。
三、使用条件及其局限性
- 使用条件:只有当调用数据库函数支持执行多条sql语句时才能够使用,例如mysqli_multi_query()函数支持多条sql语句同时执行。
- 局限性
- 受环境限制:受到API或者数据库引擎,又或者权限的限制。例如在PHP中,为了防止sql注入机制,往往使用mysqli_query()函数,该函数只能执行一条语句,分号后面的内容将不会被执行。
- 结果显示问题:在Web系统中,代码通常只返回一个查询结果,所以堆叠注入第二个语句产生的错误或者结果只能被忽略,在前端界面无法看到返回结果2。
- 需要先掌握数据库信息:在使用堆叠注入之前,需要知道一些数据库相关信息,例如表名,列名等信息。
四、在实战中的应用示例
(一)MySQL数据库实例
- 创建、删除表及数据操作:可以通过堆叠注入实现创建、删除表以及查询和修改数据等操作。比如“Select * from products where productid = 1;DELETE FROM products;”这样的语句,先查询products表中特定productid的数据,然后执行删除products表的操作(这里只是示例,实际应用中需要满足上述使用条件等)。
(二)CTF实战示例
- 绕过关键字过滤
- 重命名操作:在像[强网杯2019]随便注这道题中,后台为单引号过滤,存在sql注入且为单引号字符型。在有强大的正则过滤,但没有过滤alter和rename关键字的情况下,可以利用堆叠查询注入进行一些巧妙操作,如把words表随便改成words1,然后把包含flag字段的表1919810931114514改成words,再把列名flag改成id(或data),结合特定的输入(如1’or1 = 1#)爆出表所有内容就可以查flag了(命令需要一起执行,分开执行会报错找不到某表名)。
- HANDLER语句:当题目中rename、alter也被过滤时,可以利用HANDLER语句来进行读取数据操作。
- MySQL预处理配合其他操作
- 配合十六进制:在遇到堆叠注入且select、rename、alter和handler等语句都被过滤的话,可以用MySql预处理语句配合十六进制来执行sql语句拿flag。
- 配合字符串拼接:也可以利用MySql预处理语句配合concat拼接来执行sql语句拿flag。
攻击过程
识别SQL注入点:
- 攻击者首先需要找到Web应用程序中的SQL注入点,这通常是通过输入测试数据并观察应用程序的响应来实现的。
构造恶意查询:
- 一旦找到注入点,攻击者就会构造包含恶意SQL语句的查询。这些语句通常通过分号与原始查询分隔开。
执行恶意操作:
- 当数据库系统接收到包含恶意查询的请求时,如果它支持同时执行多条语句,就会执行这些语句。这可能导致数据泄露、数据修改或删除等严重后果。
示例
假设有一个Web应用程序,它使用以下SQL查询来检索产品信息:
SELECT * FROM products WHERE categoryid = '用户输入'
如果攻击者在输入字段中输入“1; DELETE FROM products”,则生成的查询将变为:
SELECT * FROM products WHERE categoryid = '1'; DELETE FROM products
如果数据库系统支持同时执行多条语句,那么它将首先执行SELECT查询以检索产品信息,然后执行DELETE查询以删除所有产品记录。
防御措施
为了防止基于堆叠查询的SQL注入攻击,可以采取以下措施:
使用预编译语句和参数化查询:这是防止SQL注入的最有效方法之一。通过预编译SQL语句并使用参数化查询,可以确保用户输入不会被解释为SQL代码的一部分。
输入验证和过滤:对用户输入进行严格的验证和过滤,确保输入符合预期的格式和范围。特别是要过滤掉分号等特殊字符,以防止攻击者构造恶意查询。
限制数据库权限:为数据库用户分配最小必要权限,限制他们对数据库的访问和操作权限。这样可以减少攻击者利用SQL注入漏洞对数据库系统造成的潜在损害。
错误处理和日志记录:避免在错误消息中泄露数据库结构或敏感信息。同时,记录可疑的数据库访问尝试以便后续分析。这有助于及时发现并响应潜在的SQL注入攻击。