先申明下这方法只对ACCESS数据库的网站有效
关于ACCESS注入的基本常识:
第一、ACCESS数据库注入与MySQL方法不同,它的用户列表名,密码字段,以及字段的内容不能用MySQL“暴”的方法来取得。
第二、ACCESS只能用“猜”的方法来得到表名和字段,然后再猜解出字段的长度,最后把字段的第一位到第N位分别猜出来。
比如说,有一个人心里想着一个数字,另一个人要猜出这个人心里想的是什么数字,所以如果要百分之百、系统性的猜准, 就要有一定的提示。比如说,那个人问,这个数字是否大于100,如果被问的那个人说“不”,那么可以确定,这个数字不 大于100,继续问,是否小于1,如果被问的那个人仍然说“不”,那么就可以确定这个数字是一个正数,并且在1-100之间。继续问下去,是否大于60,是否小于90……,这样一直问下去,最后一定可以得到一个准确的答案。这种猜法被称为“折半猜解法”。
知道ACCESS数据库注入的一些基本规律,就可以通过一些相关语法来进行手动注入了。
第一步:确定注入点
用“ and 1=1”或者“ and 1=2”来确认。注意:and两边各有一处空格。
如果检测过后,返回错误信息,那么就证明这个网站有注入漏洞。
第二步:猜解表名
用:and exists (select * from [admin])
检测是否存在admin表,admin这个表名可以替换成其它的表名进行猜解,如果存在该表名返回页面结果为正常,如果不存在则返回为出错。
第三步:猜解某表名中存在的字段
语法:and exists (select top 1 [name] from [admin])
前面[name]大括号中的name可以换成你要查询的字段名,后面admin则是要查询的表名,这一句的意思就是查询在admin表中是否存在name字段,和上述一样,如果存在返回页面为正常,如果不存在,则返回出错页面。比如说你要查密码字段名,则要把[name]改成pass或者password(可以通过尝试访问界面来确认是否存在该字段)。
第四步:猜解字段的长度
语法:and (select top 1 len(username) from Admin)>0
len参数提取字段长度()内的username是字段名,>0可以换成>1、>2直到猜中。继续我们以上的叙述,刚才找的是密码字段,所以可以把(username)(记住username是由小括号括住的)改成password。
第五步:折半法猜出字段--最关键的一环
语法:and (select top 1 asc(mid(username,N,1)) from Admin)>0 猜解第N位的ASCII码>0取值从负数到正数都有可能,当然常见的 密码都是数字加字母的组和,它们的ASCII值在0-128之间,将值替换为这之间的值,如果正确,则返回正常页面,如果不是责返回出错,将N分别替换为1、2、3、4……反复猜解即可得出字段每一个位数的值而得到密码,参数N为字段的位数,如果是(mid(username,1,1)),则查找username字段中的第一位,依此类推。整个语句的最右边“>0”,数字0表示的是ASCII码,并不是真正的字段位数相应的字符。
还是一样,我们继续上述结果,可以把username改为password。