一个基于报错的盲注场景
MayIKissYou | 2015-11-06 16:17
1:背景
近日某壮汉给了我个链接 说有注入 但是过滤了一些关键字 导致数据有些出不来 让我帮忙看看
于是 我看他造爷 就研究了下 场景说明给大家,有兴趣的同学一起交流 不一定是好办法,目前为止想到的
可行的办法
2:场景
一个站点的登录框存在注入,
1):用户名存在,密码不存在 通过输入'号出来明显的报错信息
2):输入正确与错误的用户名都会返回 用户名或则密码错误
3):此处过滤了(select 基本上输入(sdadadsselectadsd也会被过滤[此处个人觉得是比较恶心的 过滤太严,而且出数据基本靠他了]
4):不想用时间盲注 怕把服务器给睡挂了
ps。测试的时候就没用线上环境了 自己在数据库的表里找了个实例测试了
3:想法
由于select被干的太狠了,因此想法就是要把管理员的账号密码弄到就好了。
但是现在比较惨的地方是直接用经典的报错语句 由于语句中有(select会直接被干掉的
于是此时就想由于当前就在user表里,直接通过username=‘admin’and password='xxx'的形式来猜解账号密码
1)起初用了updatexml()来进行报错
大致语法就是
select * from corp where corp_id =1 and updatexml(1,if(1=2,1,concat(0x5e,version())),1)
但是这里当我把1=2 改成user字段的时候 会提示如下内容
ERROR 1105 (HY000): Only constant XPATH queries are supported
仅仅支持constant
然后我换了种 写法
select * from corp where corp_id =1 and if(1=1,1,updatexml(1,concat(0x5e,corp_id),1)) ERROR 1105 (HY000): Only constant XPATH queries are supported
我的想法是1=1的时候不执行这个报错语句,结果发现mysql在执行顺序的时候 先执行了updatexml语句
我擦没办法了 走到头了 换个别的方法吧。
2)换了个报错语句 group by concat(version(),floor(rand(0)*2)) having min(0)
于是很快的写出了如下的语句:
select * from corp where corp_id in (1,2,(if(1=1,3,2))) group by concat(version(),floor(rand(0)*2)) having min(0);
ps.说明下 这里我corp里面有3列 id分别为1 2 3
我们先来查看一下运行结果:
这样一个基于报错的盲注的方法
我们直接去这么操作:
正确的时候返回为空 不正确的时候返回为报错。
于是我们可以使用corp_id=1 and corp_name= 'xxxx'的形式最后获取corp_name的值
按道理类似的使用uname = ‘admin’ and upass = 'xxx'的方式获取pass的值
ps.
但是这里得靠字典将pass的字段爆破出来
各种吐槽:
1#
Vigoss_Z (http://i-security.cc) | 2015-11-06 16:28
没看懂啊,
pass也可以相同的办法, 36x16(32次)搞定?为什么需要字典?
2#
MayIKissYou | 2015-11-06 16:30
@Vigoss_Z 啊 实际环境不知道 user表的password字段的名称的 = =
3#
紫霞仙子 | 2015-11-06 16:32
waf小王子,赞!
4#
Vigoss_Z (http://i-security.cc) | 2015-11-06 16:37
@MayIKissYou
2333333
以为报错出来sql语句,知道user和pass字段了。
看脸了。
5#
MayIKissYou | 2015-11-06 16:41
@Vigoss_Z = =主要是想说一下如何构造一个判断依据[盲注的条件] 之前没碰到过 嘿嘿
6#
Manning (MSpider作者) | 2015-11-06 16:48
啥啊,给个链接一起玩啊!?
7#
我是壮丁 (专业打酱油) | 2015-11-06 18:28
waf小王子
留言评论(旧系统):