nginx利用lua语言实现软waf的示例代码
作者:475.35
首先下载nginx的安装包:
wget http://nginx.org/download/nginx-1.14.0.tar.gz
这里下载的是nginx1.14的包,感觉安装包太老的话可以去官网下载新的版本:
官网地址:http://nginx.org/
但是我这里测试使用的不是nginx的安装包,而是使用的淘宝开发师提供的OpenResty;
其官方网站OpenResty® - Open source我们读起来是非常的方便。OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。
用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。所以本身OpenResty内部就已经集成了Nginx和Lua,所以我们使用起来会更加方便。
下载OpenResty:
wget https://openresty.org/download/openresty-1.19.3.2.tar.gz
解压缩:
tar -zxvf openresty-1.19.3.2.tar.gz && cd openresty-1.19.3.2
编译安装:
./configure && make && make install
进入OpenResty的目录,找到nginx:
cd /usr/local/openresty/nginx/
在conf目录下的nginx.conf添加如下内容:
location /lua{ default_type 'text/html'; content_by_lua 'ngx.say("<h1>HELLO,world</h1>")'; }
通过浏览器访问测试:
测试nginx没问题后,就开始本次实验:
利用XSS检测lua脚本
这里我写了一个简单XSS检测,直接上代码
local function has_xss(payload) if payload and type(payload) == "string" then if string.find(payload, "<script>") or string.find(payload, "javascript:") or string.find(payload, "onerror=") then return true end end return false end ngx.req.read_body() local args = ngx.req.get_uri_args() for key, val in pairs(args) do if has_xss(val) then ngx.exit(ngx.HTTP_FORBIDDEN) end end
可以看到,我写了一个xss的检测函数has_xss,当然规则比较简单。同时接下来,用了ngx.req.read_body()函数,当你需要处理HTTP请求时,必须优先调用该函数,随后才可以获取HTTP的请求数据。
这里调用过该函数后,我取到了uri的参数数据。当然也可以通过ngx.req.get_post_args()或者ngx.req.get_body_data()来分别获取post参数和请求数据。除此之外,更多的用法函数可以参考最上方的文档进行查询。
最后就是循环遍历参数并执行has_xss进行判断,如果发现命中匹配字符,则返回FORBIDDEN也就是403状态码。
挂载Lua
这里我的lua脚本路径为:/home/gsl/xss_check.lua
打开nginx的配置文件:
/usr/local/openresty/nginx/conf/nginx.conf
在配置文件中添加location:
error_page 403 /attack_403; location = /attack_403 { try_files $uri $uri/ /attack_403.html; internal; } location / { access_by_lua_file /home/ssremex/nginx_lua/xss_check.lua; try_files $uri $uri/ /index.html; } location /lua { default_type "text/html"; content_by_lua 'ngx.say("<h1>hello world</h1>")'; }
这里将默认的发布文件目录修改为/home/gsl,因为在这里我还有两个html文件;
接下来那就是要编写html文件了:
第一个是发现uri不正确/检测到有问题的,需要提醒被攻击,这个html文件的路径为:
/home/gsl/attack_403.html
html代码如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WARNNING</title> </head> <body> <h1>发现攻击,已禁止</h1> </body> </html>
另外一个就是如果检测到正确就访问index文件:
路径为:/home/gsl/index.html
html代码如下(我这里为了测试找了一个简单的代替):
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的网页</title> </head> <body> <h1>这是标题</h1> <p>这是段落。</p> <!-- 在此处添加其他内容 --> </body> </html>
nginx.conf的配置文件也像上边一样配置完成,那么这时就可以使用Nginx命令来检测一下nginx的语法是否正确,并且重新加载一下配置文件:
我这里是编译安装的nginx,并且也没有将nginx的可执行文件配置在/usr/sbin(已经配置的环境变量)目录下,所以我需要进入:/usr/local/openresty/nginx/sbin下执行命令
./nginx -t
nginx -s reload
然后正常访问一下:
添加xss参数模拟一下错误:
http://ip:port/?a=%3Cscript%3E
已经被检测到;
OK,本次实验结束;
以上就是nginx利用lua语言实现软waf的示例代码的详细内容,更多关于nginx lua实现软waf的资料请关注脚本之家其它相关文章!