OpenResty学习笔记03:再探WAF
我们上一篇安装的WAF来自另一位技术大神 赵舜东,花名 赵班长,一直从事自动化运维方面的架构设计工作。阿里云MVP、华为云MVP、中国SaltStack用户组发起人 、新运维社区发起人。虽然并非安全专业出身,但根据他的自述,边学边写,只用了几天的时间就将WAF写出来了,并于2016年正式发布到GitHub。赵班长的WAF参考了Kindle大神写的 ngx_lua_waf ,另一款基于 OpenResty的非常优秀的开源WAF。不得不向 章亦春(agentzh)、赵舜东(赵班长)和 Kindle 等所有开源前辈们致以最高的敬意,让我等能有这么多的学习和实践资源,respect!
(资料图片仅供参考)
二. 了解撸啊(Lua)在真正走近WAF之前,还是有必要对 Lua这个脚本语言进行一番了解,因为所有的业务逻辑都是基于 Lua实现的。推荐两个关于Lua的学习资源:
Lua基础教程与实践。菜鸟Lua教程。顺便分享本人正在使用的Lua调试工具:网盘链接解压后其中有两个文件:
LuaForWindows_v5.1.4-46.exe:适用于windows环境的Lua编译器。lua51.stx:适用于EditPlus环境的Lua语法高亮模板文件。配置完成后,在EditPlus中进行Lua的编写和测试还是很方便的:三. 配置入口我们回过头,再来看看上一篇Nginx的配置文件中关于WAF引用的几行关键代码:
lua_shared_dict limit 50m;lua_package_path "/home/my/tools/waflib/?.lua";init_by_lua_file "/home/my/tools/waflib/init.lua";access_by_lua_file "/home/my/tools/waflib/access.lua";
这四个指令都来自 lua-nginx-module,用来实现对 Nginx的每个 Worker线程中 Lua环境的配置和定义。
1. lua_shared_dict作用:声明一个共享内存区域层级:
http
格式:lua_shared_dict
由于各 Worker线程中的 Lua环境相对是独立的,无法共享数据,但在很多情况下,需要在不同的 Worker之间共享数据,此时就可以通过该指令进行声明。此例中的 limit
就是声明出来的一个共享变量,在 WAF中的作用就是在 CC攻击检测时判断当前用户的请求频次是否超限进行拦截。
作用:设置 Lua脚本文件的搜索路径。
;;
表示原始搜索路径。层级:http
格式:lua_package_path
官网描述:设置由 set_by_Lua、content_by_Lua 等指定的脚本使用的 Lua 模块搜索路径,它的默认值是LUA_PATH环境变量的内容或LUA的编译默认值。个人理解:在 Lua中引用其他文件时,比如 require "config"
,就会将 config替换掉路径中的问号并尝试查找这个文件并引入进来。配置搜索路径参数时,还可以使用 $prefix
变量来表示当前 Nginx的工作目录,该目录一般在启动时通过 -p PATH
参数进行定义。如果有多个搜索路径,可用 ;
分割。
作用:指定初始化配置文件。层级:
http
格式:init_by_lua_file
个人理解:该初始化配置文件仅在 Nginx启动时运行一次,主要用于对全局变量进行预加载或预处理。但经过实践,在对本篇的 WAF进行配置时,删除该指令并未产生任何影响。
4. access_by_lua_file作用:请求访问阶段处理。层级:
http, server, location, location if
格式:access_by_lua_file
个人理解:每个请求接入时,都会经过该文件的处理,其作用类似于前置拦截器。本篇的 WAF在对请求进行检查时,主要就是从这个文件切入的。
四. 官方文档支持lua-nginx-module模块的官方文档:https://github.com/openresty/lua-nginx-module其中最重要的两个部分:
指令(Directives):https://github.com/openresty/lua-nginx-module#directivesAPI(Nginx API for Lua):https://github.com/openresty/lua-nginx-module#nginx-api-for-lua在学习 OpenResty之前,还是需要对指令和API进行详细了解的。五. 文件说明再来看一下 waflib
的目录清单:
/usr/local/openresty/lualib/resty/
的软连接;rule-config:存放规则文件目录。再进入到 rule-config目录,查看其中的文件清单:以第一个 args.rule规则文件为例,我们查看一下具体内容:
\.\./\:\$\$\{select.+(from|limit)(?:(union(.*?)select))having|rongjitestsleep\((\s*)(\d*)(\s*)\)benchmark\((.*)\,(.*)\)base64_decode\((?:from\W+information_schema\W)(?:(?:current_)user|database|schema|connection_id)\s*\((?:etc\/\W*passwd)into(\s+)+(?:dump|out)file\s*group\s+by.+\(xwork.MethodAccessor(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(xwork\.MethodAccessor(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/java\.lang\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[\<(iframe|script|body|img|layer|div|meta|style|base|object|input)(onmouseover|onerror|onload)\=
该文件定义了 22条检测规则,一行一个,熟悉正则的话会很容易看懂。我们也可以根据实际情况添加新的规则。
六. 引用关系4个Lua文件和 8个规则文件,这12个文件就是这个WAF的全部,你就说巧妙不巧妙!
七. 简单优化赵班长向我们展示了一个迷你WAF应该具备的基本能力,从代码上也能看出来,都是点到为止。所以有必要进行一些简单的优化。本人优化之后的代码:点此下载优化说明:
一些空值的判断逻辑;各检测函数的跳出逻辑;补全POST参数注入的检测逻辑;在lib.lua中增加了get_content_type函数,用来判断请求类型;八. 本篇总结到这里,就已经对 OpenResty下的 WAF从部署到使用有了全面了解了。如果时间允许的话,真想继续对 WAF进行深层次的学习和定制。
标签:
- OpenResty学习笔记03:再探WAF
- 4月汽车销量排名:比亚迪包揽轿车 SUV冠亚军,宏光MINI排名再下滑_每日快播
- 辽篮再遭伤病,杨鸣折损悍将,透露G2打法,郭艾伦是否复出有说法_天天新消息
- 2023北京公积金缴费基数上限是多少,北京公积金最高交多少钱一个月? 每日速看
- 英伟达怕了吗?AMD Radeon RX 7600显卡偷跑,确认配备8GB显存
- 七里河区召开全区禁毒工作会暨创建全国禁毒示范城市推进会_热点在线
- 当前时讯:7股获基金调研 汤姆猫最受关注
- 无他相机去水印怎么操作 无他相机去水印教程
- 约基奇前10场季后赛300分90助历史第一,生涯10次三双中锋第一_环球播报
- 世界新消息丨聆达股份董事会提前换届收关注函 近期多位高管辞职
- 定存利率跌破“3”,有人捧着几十万跨省存钱
- 正德厚生是什么意思_正德厚生 全球通讯
- 李小鹏任交通运输部党组书记
- 帮助客户赢在起点 南方路机为河北聚总打造环保智慧混凝土解决方案|环球快看
- 广州白云表彰109名优秀护士、10个优秀护理集体
- 天天简讯:intel酷睿2双核e8400怎么样_intel酷睿2双核e8400
- 商务预报:5月1日至7日禽产品零售价格稳中略降
- Spotify删除数万首AI歌曲,环球音乐怀疑有人用机器人刷量
- 22条河流发生超警以上洪水 湖南湘江等主要河流将出现涨水过程
- 阿联酋谴责以色列袭击加沙地带
- 控规模保业绩 知名基金经理再发“限购令” 新消息
- 阿衰:大脸妹恶意打击小衰自尊,这种行为不可取!
- 全球今头条!大象牙膏原理解释 大象牙膏原理
- 成都没有社保卡能不能领电子医保凭证?
- 天天热推荐:00后小伙名为“江胡传奇”:妈妈姓胡,怀我的时候爸爸喜欢玩“传奇”游戏
- 助力公园城市建设,首批市民监督员来了!
- 队报:梅西团队与沙特达成口头协议,签约2年+年薪总额6亿欧
- 世界实时:曹峰林_对于曹峰林简单介绍
- “羊了个羊”被通报 网友:还有人玩?爆红小游戏如何避免变“月抛”?
- 今日观点!2023仙境海岸海阳马拉松医疗救护事项说明