基于Nginx+lua实现简单的XSS攻击拦截
作者:银空飞羽
Lua
关于Lua,它是一个脚本语言,因为它极其轻量级,所以一般广泛应用于游戏脚本等高性能的领域。Nginx也有专门对Lua脚本支持的模块,后续的软WAF实现主要就是依赖于Nginx挂载Lua脚本,关于Lua的语法比较简单,可以参考上述文档,不过多赘述。
Nginx的Lua支持
Nginx本身就是模块化的,可以针对模块进行增加修改。那么对于lua的能力支持,主要就是 ngx_http_lua_module 模块来提供的。
location /lua { default_type "text/html"; content_by_lua 'ngx.say("<h1>hello world</h1>")'; }
如果发现不能成功执行,这里便用如下命令,手动安装一下扩展再试试
sudo apt update sudo apt install nginx-extras
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()获取post参数,也可以通过ngx.req.get_body_data()来获取请求数据,更多的用法函数可以参考最上方的文档进行查询。
最后就是循环遍历参数并执行has_xss进行判断,如果发现命中匹配字符,则返回FORBIDDEN也就是403状态码。
挂载Lua
这里我的lua脚本路径为:/home/ssremex/nginx_lua/xss_check.lua
打开nginx的配置文件 /etc/nginx/nginx.conf
http{ ... server { ... location / { access_by_lua_file /home/ssremex/nginx_lua/xss_check.lua; try_files $uri $uri/ /index.html; } ... } ... }
通过access_by_lua_file来使lua脚本挂载到根路由下。
同时,因为咱们定义了拦截返回状态码403,所以希望拦截的时候能够返回这个页面,先简单写个403页面 attack_403.html,
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>WARNNING</title> </head> <body> <h1>发现攻击,已禁止</h1> </body> </html>
在nginx.conf中配置上error_page,因为之前我已经设定了web的全局跟路径root,所以我直接将attack_403.html文件放到根路径下也就是home_demo下,路径为/home/ssremex/home_demo/attack_403.html
nginx相关配置如下
http { ... server { listen 8088; # 更换成自己像监听的端口 server_name 0.0.0.0; root /home/ssremex/home_demo; 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>")'; } } ... }
查看效果
本次我们实现的是GET请求的xss检测
nginx -t
通过该命令,测试配置文件没啥问题。
随后,重启nginx服务
systemctl restart nginx
访问WEB服务
一切正常,添加xss参数:http://ip:port/?a=%3Cscript%3E
可以看到直接跳转到403界面,完美实现一个简单的拦截。
到此这篇关于基于Nginx+lua实现XSS攻击拦截的文章就介绍到这了,更多相关Nginx+lua实现XSS攻击拦截内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!