WAF攻与防

您所在的位置:网站首页 自定义正则表达式怎么写 WAF攻与防

WAF攻与防

2024-07-12 23:16| 来源: 网络整理| 查看: 265

初窥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的标志图。

image-20220527235220362

URL-Path

描述的是项目或者模块中资源绝对路径(不是相对路径)

Host

主机地址

Parameter-name

参数名

Parameter

参数

Header-name

头文件名

header

http请求头。标注请求文件类型

cookie-name

cookie名(类似于键)

cookie

cookie值(类似于键名)

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 Injections​set $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