码迷,mamicode.com
首页 > 数据库 > 详细

sql注入tips

时间:2017-07-06 22:01:17      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:cat   一点   str1   时间   filter   利用   注入   schema   改变   

转自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语句。

然后师傅又甩我个雨牛博客

http://www.yulegeyu.com/2017/04/16/%E5%BD%93%E8%A1%A8%E5%90%8D%E5%8F%AF%E6%8E%A7%E7%9A%84%E6%B3%A8%E5%85%A5%E9%81%87%E5%88%B0%E4%BA%86Describe%E6%97%B6%E7%9A%84%E5%87%A0%E7%A7%8D%E6%83%85%E5%86%B5%E3%80%82/

最终我的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放出来了,其实要收集信息,要踩以下几个坑:

 

  1. 通过不断改变country,发现第一个点:country第一个字符会进行判断,如果是大写,不做改变,如果是非大写英文字符,则ascii码-0x20再转换成字符存入库中;

  2. Date是根据设置的时区的当前时间

  3. waf很强大,先不说过滤了什么,能使用的只有‘,@,(,),还有一些没啥用的可见字符。

 

 

第一点,对于普通的英文字符没什么用,无非是字符的大写转化,但是对于符号就不一样了,这里通过观察可以发现,数据是经过addsalashes处理的,如果我们传入‘xxx,‘通过转义变成/‘,然后经过第一点的规则变成<‘,成功闭合了单引号。

 

但是后面的语句怎么注释掉呢?#和空格都被waf拦截。

这里雨牛的博客有个tip

http://www.yulegeyu.com/2017/04/11/%E4%B8%BA%E4%BB%80%E4%B9%88-backtick-%E8%83%BD%E5%81%9A%E6%B3%A8%E9%87%8A%E7%AC%A6/

`在php-mysql里可以被自动闭合,也就是我们可以找到一个使用alias或者使用列名的地方,利用这一个tip去注释掉后面的内容。

构造出来的最终payload是

技术分享

 

country=‘and(1=2)and(1)=@`

country=‘or(1)or(1)=@`

 

是bool型注入,但是有哪里不一样呢???

这就要考验眼力了,注意到date里面,如果是使用or(1),采用是时区就是默认时区,最后的时间和中国的时间保持同步,如果是and(1=2),则采用不知道是哪国的时区,和现在时间差距很大。

这里我猜测中间有一条sql语句专门来判断选择时区的。

 

所以通过这个,一个二次注入(bool盲注)就达成了,注意不能使用空格,用括号来绕过就ok了

sql注入tips

标签:cat   一点   str1   时间   filter   利用   注入   schema   改变   

原文地址:http://www.cnblogs.com/test404/p/7128445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!