当前位置: 首页 > article >正文

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍05-基于堆叠查询的SQL注入(Stacked Queries SQL Injection)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。

目录

一、堆叠查询注入原理

原理:

示例:

二、与联合注入(union injection)的区别

三、使用条件及其局限性

四、在实战中的应用示例

(一)MySQL数据库实例

(二)CTF实战示例

攻击过程

示例

防御措施


一、堆叠查询注入原理

在SQL中,分号(;)用来表示一条sql语句的结束。堆叠查询注入的基本思想是在一个分号结束一个SQL语句后继续构造下一条语句,多条语句一起执行,这就形成了堆叠查询注入1。例如在MySQL的命令行中,这种方式是可行的。

原理:

  1. 分号分隔:在SQL语句中,分号(;)是用来表示一条语句结束的标志。攻击者可以通过在输入中插入分号,并在其后构造新的SQL语句,使得数据库引擎按顺序执行这些语句。
  2. 多条语句执行:某些数据库函数或API支持同时执行多条SQL语句(如MySQL中的mysqli_multi_query()函数)。攻击者可以利用这一特性,将恶意的增删改查操作与正常的查询操作结合在一起执行。
  3. 权限要求:堆叠注入的成功与否还取决于攻击者的权限。如果攻击者没有足够的权限,某些操作可能无法成功执行。

示例:

假设有一个用户登录表单,用户输入的用户名和密码会被传递到后端的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。

攻击过程

  1. 识别SQL注入点

    • 攻击者首先需要找到Web应用程序中的SQL注入点,这通常是通过输入测试数据并观察应用程序的响应来实现的。
  2. 构造恶意查询

    • 一旦找到注入点,攻击者就会构造包含恶意SQL语句的查询。这些语句通常通过分号与原始查询分隔开。
  3. 执行恶意操作

    • 当数据库系统接收到包含恶意查询的请求时,如果它支持同时执行多条语句,就会执行这些语句。这可能导致数据泄露、数据修改或删除等严重后果。

示例

假设有一个Web应用程序,它使用以下SQL查询来检索产品信息:

SELECT * FROM products WHERE categoryid = '用户输入'

如果攻击者在输入字段中输入“1; DELETE FROM products”,则生成的查询将变为:

SELECT * FROM products WHERE categoryid = '1'; DELETE FROM products 

如果数据库系统支持同时执行多条语句,那么它将首先执行SELECT查询以检索产品信息,然后执行DELETE查询以删除所有产品记录。

防御措施

为了防止基于堆叠查询的SQL注入攻击,可以采取以下措施:

  1. 使用预编译语句和参数化查询:这是防止SQL注入的最有效方法之一。通过预编译SQL语句并使用参数化查询,可以确保用户输入不会被解释为SQL代码的一部分。

  2. 输入验证和过滤:对用户输入进行严格的验证和过滤,确保输入符合预期的格式和范围。特别是要过滤掉分号等特殊字符,以防止攻击者构造恶意查询。

  3. 限制数据库权限:为数据库用户分配最小必要权限,限制他们对数据库的访问和操作权限。这样可以减少攻击者利用SQL注入漏洞对数据库系统造成的潜在损害。

  4. 错误处理和日志记录:避免在错误消息中泄露数据库结构或敏感信息。同时,记录可疑的数据库访问尝试以便后续分析。这有助于及时发现并响应潜在的SQL注入攻击。


http://www.kler.cn/a/445848.html

相关文章:

  • Hive解决数据倾斜
  • MySQL复制问题和解决
  • 【读书笔记】《论语别裁》学而有何乐
  • Java中的LIst
  • 蓝桥杯刷题——day8
  • QT笔记- QClipboard剪切板对QByteArray数据的复制与粘贴
  • java全栈day17--Web后端实战(java操作数据库)
  • springboot3访问第三方接口
  • GNU Octave:特性、使用案例、工具箱、环境与界面
  • PHP接入美团联盟推广
  • textfile类型小文件合并
  • Unity动态读取外部图片转Texture2D,内存过大问题解决方案
  • [ThinkPHP]5.0.23-Rce 1
  • Oracle/MySQL 到 OceanBase 数据库迁移的关键问题与解决方案
  • python学opencv|读取图像(十五)BGR图像和HSV图像通道合并
  • M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务
  • 【蓝桥杯每日一题】扫雷——暴力搜索
  • 方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]
  • css底部对齐布局
  • PC寄存器(Program Counter Register) jvm
  • 探索 Python编程 调试案例:计算小程序中修复偶数的bug
  • 构建一个rust生产应用读书笔记7-确认邮件1
  • 使用screw来对比数据库表和字段差异
  • R语言的数据结构-数据框
  • docker打包镜像并迁移:如何从A服务器打包docker镜像到B服务器上容器中运行
  • 如何利用Python爬虫获得Lazada商品评论列表