WAF攻与防 |
您所在的位置:网站首页 › 自定义正则表达式怎么写 › WAF攻与防 |
初窥WAF攻防之道 WAF的核心原理是正则表达式,针对攻击行为的拦截也是要先定义各种攻击payload,然后针对该payload添加拦截规则。 前言攻击者(黑客)通过各种技术手段绕过WAF防护从而对目标进行攻击,防守方,通过查看WAF日志等方式,了解最新的攻击方式,从而针对性的编写新的WAF规则实施防护。攻防双方就在这互相“攻伐”过程中,不断丰富我们WAF攻防的内容,今天,我们来同时扮演双方的角色,以全局的视角深入理解一下WAF攻防。 先有矛还是先有盾?先有矛还是先有盾?这个自古以来充满争议的问题,在WAF攻防这里,却没有任何异议。先用WAF 才能有WAF绕过,因此我们的学习,也先从防守方:编写自定义的WAF规则开始。 防守|针对不同的漏洞编写不同的WAF规则基础知识:WAF主要检测的12个变量想要学习WAF自定义规则编写,除了掌握正则表达式的编写,还要知道 绕过WAF的数据主要从哪来?这就要求我们了解WAF主要检测的十二个变量。 URL--------------------http://10.67.8.118:8889/abc/shell.phpURL-path--------------------/abc/shell.phpHost--------------------10.67.8.118:8889Parameter-name--------------------id(id=123)Parameter--------------------123Header-name--------------------Accept-Encoding(举例)Header--------------------gzip,deflateCookie-name--------------------id(id=1)Cookie--------------------1Version--------------------1.1(HTTP/1.1)Method--------------------POSTRequest-Body--------------------id=123URL在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。url主要包括协议、认证、地址、端口、路径、参数、标识符等,如下是一张url的标志图。 描述的是项目或者模块中资源绝对路径(不是相对路径) Host主机地址 Parameter-name参数名 Parameter参数 Header-name头文件名 headerhttp请求头。标注请求文件类型 cookie-namecookie名(类似于键) cookiecookie值(类似于键名) version浏览器版本 Method请求类型 Request-Body请求体 WAF自定义基础|通过nginx配置文件抵御攻击验证浏览器行为简单做一个比喻。当前疫情紧张时期,假如某个地区因疫情物资紧张,居民采购蔬菜被限量。而有些贪心的人,派了一堆歪果仁(没有国籍不享受政策)来冒领蔬菜。怎么防止这种事情呢?工作人员在发蔬菜之前,会给领取者一张纸,上面写着“天王盖地虎”,如果那人能念出纸上的字,那么就是享受政策的人,给红包,如果你不能念出来,那么请自觉离开。 是的,在这个比喻中,居民就是浏览器,歪果仁就是攻击器,我们可以通过鉴别cookie功能(念纸上的字)的方式来鉴别他们。 下面是通过nginx配置cookie鉴别功能的代码 if ($cookie_say != "twgdh"){ add_header Set-Cookie "say=hbnl";rewrite .* "$scheme://$host$uri" redirect;}让我们看下这几行的意思,当cookie中say为空时,给一个设置cookie say为twgdh的302重定向包,如果访问者能够在第二个包中携带上cookie值,那么就能正常访问网站了,如果不能的话,那他就只能永远活在302中。 那假如贪心的人 发现了规律,他们发给每个歪果仁一个录音笔,重复播放”天王盖地虎,天王盖地虎“此时我们怎么办呢? 这时,工作人员的对策是这样做的,要求领取者出示有自己名字的户口本,并且念出自己的名字,“我是xxx,天王盖地虎”。于是一群只会嗡嗡叫着“天王盖地虎”的歪果仁又被撵回去了。 if ($cookie_say != "twhdjl$remote_addr"){ add_header Set-Cookie "say=twgdh$remote_addr";rewrite .* "$scheme://$host$uri" redirect;}这样的写法和前面的区别是,不同IP的请求cookie值是不一样的,比如IP是1.2.3.4,那么需要设置的cookie是say=twgdh1.2.3.4。于是攻击者便无法通过设置一样的cookie(比如CC攻击器)来绕过这种限制。 然而这似乎也不是一个万全之计,因为攻击者如果研究了网站的机制之后,总有办法测出并预先伪造cookie值的设置方法。因为我们做差异化的数据源正是他们本身的一些信息(IP、user agent等)。攻击者花点时间也是可以做出专门针对网站的攻击脚本的。那么我们就没有对策了吗? 那么要如何根据他们自身的信息得出他们又得出他们算不出的数值?答案是用salt加散列。例如md5("opencdn$remote_addr"),虽然攻击者知道可以自己IP,但是他无法得知如何用他的IP来计算出这个散列(md5不可逆)。 rewrite_by_lua 'local say = ngx.md5("opencdn" .. ngx.var.remote_addr)if (ngx.var.cookie_say ~= say) then ngx.header["Set-Cookie"] = "say=" .. sayreturn ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri) end通过这样的配置,攻击者便无法事先计算这个cookie中的say值,于是攻击流量(代理型CC和低级发包型CC)便在302地狱无法自拔了。 防扫描前人总结的知识结晶已经很完善了,可以直接用这个模块来做防护。 https://github.com/loveshell/ngx_lua_waf 自定义WAF规则预防常见攻击防止sql注入利用WAF防止sql注入可以通过过滤sql注入所需要的关键字,例如union select等来进行 #==Block SQL Injectionsset $block_sql_injections 0;if ($query_string ~ "(=.*--)|(w+(%|$|#|&)w+)|(.*||.*)|(s+(and|or)s+)|(b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)b)"){set $block_sql_injections 1;}if ( $block_sql_injections = 1){return 403;}防止xss攻击通过过滤插入xss标签的常用标点符号 进行防护 set $block_xss 0;if ($query_string ~ "(~|{|}|"|'||?)"){set $block_xss 1;}if ( $block_xss = 1){return 403;}防止ssrf最简单的方法:使用正则表达式过滤属于内网的IP地址 防止rce借鉴了 常做的ctf题目的思路,还使用了通配符防止简单绕过 set $block_rce 0;if ($query_string ~ "/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |