环境介绍
本次实验用到的是两个docker容器,实际拓扑如下
![实验拓扑](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722103420522.png)
其中nginx的配置文件放入/root/nginx
目录下
web网站的配置放入/root/lnmp
目录下
部署代码如下
docker run -d -p 5001:80 -v /root/lnmp:/app/public --name lnmp fbraz3/lnmp:5.6
# 部署了lnmp容器作为目标网站容器
cat << 'EOF' > /root/lnmp/index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>服务器收到的内容是:</h1>
<?php
print_r($_REQUEST);
?>
</body>
</html>
EOF
# 编写一个页面,用于查看服务器实际收到的内容
docker run -d -p 5000:5000 -v /root/nginx:/etc/nginx/conf.d --link lnmp:lnmp --name nginx nginx
# 部署nginx容器
cat << 'EOF' > /root/nginx/proxy.conf
server {
listen 5000;
location / {
proxy_pass http://lnmp:80;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF
# 编写反向代理的nginx配置文件
docker restart nginx
# 重启nginx容器,使得配置文件生效
浏览器访问5000端口,查看效果
![访问效果](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722104339818.png)
拦截GET请求
nginx中$request_uri
变量是包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args
可以在nginx配置文件中加入过滤的代码
cat << 'EOF' > /root/nginx/proxy.conf
server {
listen 5000;
location / {
if ($request_uri ~* "hacker") {
return 403;
}
proxy_pass http://lnmp:80;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF
# 其中第6~8行是加入的内容
# ~*是忽略大小写
docker restart nginx
# 重启nginx容器,使得配置文件生效
再次访问网页,带上关键字,可以看到触发过滤效果
![关键字触发拦截](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722104850268.png)
可以让匹配上恶意代码后跳转到对应的页面,修改之后的nginx配置文件如下
cat << 'EOF' > /root/nginx/proxy.conf
server {
listen 5000;
location / {
if ($request_uri ~* "hacker") {
return 302 /sayno.html;
}
proxy_pass http://lnmp:80;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 第6行,将报错改成302跳转
访问效果如下
![拦截后跳转](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722105843612.png)
拦截POST等请求
Nginx并没有自带拦截POST请求的功能,所以我们需要引入第三方waf模块,需要注意引入第三方模块本身就有风险,生产环境需要谨慎!
安装开源waf
本教程推荐国产开源waf长亭雷池 WAF 社区版,官方网站为:https://waf-ce.chaitin.cn/
粘贴如下命令即可装好
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
安装好后浏览器访问https://<IP地址>:9443/
后台登录的用户名和随机密码在安装后的命令行页面
![用户名和密码](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722141746772.png)
添加站点反向代理
点击防护站点——站点管理——添加站点
![配置反向代理界面](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142010607.png)
攻击尝试
先正常访问
![正常访问](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142136689.png)
使用xss的payload进行尝试
![xss的payload](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142226181.png)
被拦截,并且可以在后台看到拦截记录
![xss拦截记录](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142300658.png)
使用sql注入的payload进行尝试
![sql注入的payload](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142332839.png)
可以看到被拦截
![sql注入拦截记录](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142410014.png)
使用xxe攻击payload
![xxe攻击payload](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142611240.png)
正常被拦截
![xxe拦截记录](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722142627479.png)
对于无参rce的拦截还是有些问题的
![无参RCE攻击成功](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722143026947.png)
反爬虫功能可以开启
![开启人机验证](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722143127894.png)
人机验证界面
![人机验证界面](/2024/07/22/lei-chi-waf-an-zhuang-yu-ce-shi/image-20240722143500518.png)
不知道是否可以反爬虫