本示例仅做测试使用,进行学习交流,请自觉遵守法律法规!
本文中将 Web 应用防火墙简称为WAF
问题描述
想使用 WAF 的访问管控功能,如何配置。
问题分析
WAF 的访问管控可以将特定 IP 添加到网络访问白名单或黑名单中,该 IP 下的相关访问行为将不受所有检测拦截规则的影响直接放行或将会被直接拦截,并且可以针对 IP 的归属地,针对特定国、国内省份进行网络访问控制,可以指定特定的拦截响应。
解决方案
本文在 WAF 搭建成功,通过 WAF 可以访问到后端服务基础上,WAF环 境的搭建,您可以参考此链接。
1.正常访问后端
使用 curl 发送 Get 请求测试。
┌──(rootkali)-[~/Test/waf]
└─# curl -I shodan.xxxx.cn/sql/
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 01 Mar 2022 08:39:49 GMT
Content-Type: text/html
Content-Length: 7933
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Fri, 31 Oct 2014 19:10:23 GMT
ETag: "1efd-506bcbfada5c0"
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Access-Control-Request-Method: GET,POST,PUT
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: X-Custom-Heade
Vary: Accept-Encoding
可以看到在没有配置访问管控时,请求正常发送,返回码为 200。
2.开启访问管控-访问白名单
白名单配置如下: 白名单会将此 ip 请求全部放行,不受任何规则检测。 使用此 ip 发送非法请求:
┌──(rootkali)-[~/Test/waf]
└─# curl -X POST http://shodan.xxxx.cn/sql/Less-2/ -d "id=1%20union%20select%201,2,3" -v
....
> POST /sql/Less-2/ HTTP/1.1
> Host: shodan.xxxx.cn
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 01 Mar 2022 08:48:09 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< X-Powered-By: PHP/5.6.9
< Access-Control-Allow-Origin: *
< Access-Control-Request-Method: GET,POST,PUT
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: X-Custom-Heade
< Vary: Accept-Encoding
可以看到使用白名单内 IP 发送非法请求可以访问成功。 使用非白名单 IP 发送非法请求。
root:~# curl -I http://shodan.xxxx.cn/sql/Less-2/?id=1%20union%20select%201,2,3
HTTP/1.1 403 Forbidden
Server: nginx
Date: Tue, 01 Mar 2022 09:02:34 GMT
Content-Length: 0
Connection: keep-alive
可以看到当非白名单中 IP 发送非法请求,会被拦截。
3.开启访问管控-访问黑名单
黑名单如下: 黑名单中相关 IP 的行为将会直接被拦截。 使用黑名单内的 IP 发送请求。
┌──(rootkali)-[~/Test/waf]
└─# curl -I shodan.xxxx.cn/sql/
HTTP/1.1 403 Forbidden
Server: nginx
Date: Tue, 01 Mar 2022 09:07:01 GMT
Content-Length: 0
Connection: keep-alive
可以看到请求被拦截。 查看访问日志,如下: 可以看到请求被黑名单拦截。
4.开启访问管控-自定义拦截响应
当满足条件的请求被 WAF 拦截(CC拦截除外)时返回,返回自定义的响应码和响应页面。 规则如下: 使用 curl 发送 POST 请求测试。
┌──(rootkali)-[~/Test/waf]
└─# curl -X POST http://shodan.xxxx.cn/sql/Less-2/ -d "id=1%20union%20select%201,2,3" -vv
...
> POST /sql/Less-2/ HTTP/1.1
> Host: shodan.xxxx.cn
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 403 Forbidden
< Server: nginx
< Date: Tue, 01 Mar 2022 10:34:26 GMT
< Content-Length: 98
< Connection: keep-alive
< Content-Type: text/html
<
* Connection #0 to host shodan.five-time.cn left intact
<!DOCTYPE html> <html> <meta charset="utf-8"> <body> <p> !!! 非法访问 !!! </p> </body> </html>
可以看到请求被拦截,显示了自定义拦截响应。 如果您有其他问题,欢迎您联系火山引擎技术支持服务