君衍.
- 一、项目环境介绍
- 二、ModSecurity介绍
- 1、Modsecurity基本概述
- 2、Modsecurity工作原理
- 3、Modsecurity功能特点
- 4、Modsecurity优点
- 5、Modsecurity缺点
- 三、Nginx介绍及配置文件
- 1、Nginx基本概述
- 2、Nginx应用场景
- 3、正向代理
- 4、反向代理
- 5、负载均衡
- 6、动静分离
- 7、主页面路径及配置文件介绍
- 三、LNMP环境介绍
- 四、安装过程
- 1、安装依赖
- 2、安装ModSecurity
- 3、安装Nginx与ModSecurity-Nginx
- 4、Nginx测试
- 5、配置Modsecurity
- 6、编辑nginx.conf
- 7、编辑modsecurity.conf
- 8、重启Nginx服务并测试
- 9、记录审计日志配置更改
- 10、PHP-FPM安装及开启服务
- 11、防御效果测试
- 四、所遇到的问题及思路
- 1、兼容性问题
- 2、PHP未解析
- 3、访问出现file not found
本文记录目的: 研究Modsecurity瑞士军刀传统WAF对于靶场网站的防护效果,以及通过规则来进行防护的原理配置,从而判断其与如今时代的新一代WAF、各大厂商的AI自学习WAF等安全产品的区别。
本文就
ModSecurity v3.0.x
在CentOS以及Nginx环境下安装、WAF规则文件配置、以及防御效果的测试,同时也包含了我在安装测试过程中遇到的一些问题以及解决方式供大家参考,所以这里简单化安装配置。
前半部分我简单说下什么是Nginx
、Modsecurity
、XSS-Labs
靶场,理解的可以在目录跳过直接看配置。
一、项目环境介绍
首先,这里我所应用到的环境有: 腾讯云服务器(操作系统为CentOS7版本)、Nginx中间件、modsecurity3.0.3以及OWASP规则库。
Linux查看系统版本命令:
# 任选其一
uname -r
cat /proc/version
hostnamectl
dmesg | grep Linux
- 腾讯云服务器: 这里也可以使用本地的虚拟机,本地的CentOS、RedHat对于本篇文章来说也可以,Ubuntu需要进行命令更改。配置完之后做一个内网穿透映射到公网上也可以来查看防御效果。
- Nginx中间件: 这里之所以使用Nginx,是因为其具有负载均衡的作用,在生产环境中经常使用。同时也可以作为反向代理、将客户端请求转发到后端服务器,在一台能力足够的服务器上配合容器可以作到更加便捷的转发给不同的服务容器环境。
- ModSecurity3.0.x: 一款开源的应用层防火墙,对WEB应用安全性进行防护。之后我们会进行详细介绍,环境下载可以在Modsecurity官网下载,这里我们作为传统WAF来进行看待。
- OWASP规则库: 主要目的是提供一个开源、经过测试的规则集,用于保护Web应用程序免受常见的Web攻击。这些规则旨在检测和防御各种类型的攻击,如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)、路径遍历、命令注入等。
- XSS-Labs靶场: 这个靶场是一个对于初学者实战练习XSS技战法的靶场,详细可见XSS-Labs靶场。
这里腾讯云服务器可以免费试用,可供学习及测试,我这里也用到了壹号DNS来搞了个DNS域名解析。
对于环境这里着重强调下ModsecurityV2版本是与Nginx无法完成兼容的,我在搭建过程中未注意到这个问题导致耗费一定时间。在后面的问题及解决思路里面包含了不兼容情况下的报错,这里需要注意。
二、ModSecurity介绍
ModSecurity是一个强大的开源Web应用防火墙(WAF),旨在保护Web应用免受各种恶意攻击。作为一个嵌入式模块,它可以集成到主流的Web服务器(如Apache、Nginx)中,有效地拦截和阻止可能导致数据泄露或服务中断的恶意HTTP请求。
1、Modsecurity基本概述
ModSecurity的设计目标是提供一个高度灵活和可配置的安全解决方案,以应对常见的Web攻击方式,包括但不限于:
- SQL注入:尝试通过恶意SQL语句来访问或篡改数据库。
- 跨站脚本(XSS):试图在用户浏览器中执行恶意脚本。
- 路径遍历:尝试访问服务器上未经授权的文件或目录。
- 请求伪造:试图伪造或篡改请求,以执行未经授权的操作等。
2、Modsecurity工作原理
- 请求检查: 当Web服务器接收到HTTP请求时,ModSecurity会对请求进行深入检查,包括请求头、请求体等内容。
- 规则匹配: ModSecurity使用预定义的或管理员自定义的规则集来检测请求中的恶意模式或行为。
- 恶意请求阻止: 一旦识别出恶意请求,ModSecurity可以执行多种操作,例如阻止请求、记录事件、重定向或发送警报。
- 响应检查: 除了检查请求外,ModSecurity还能对服务器响应进行分析,以确保不会泄露敏感信息或存在其他安全问题。
3、Modsecurity功能特点
- 攻击检测和防御: 通过实时分析HTTP流量,ModSecurity能够有效识别并防御多种Web攻击。
- 实时监控和日志记录: 详尽记录每个HTTP事务的细节,帮助管理员快速诊断和响应潜在的安全问题。
- 自定义规则引擎: 提供灵活的规则引擎,允许管理员根据具体需求编写和调整安全规则。
- 日志分析和报告: 支持输出多种日志格式,方便与常用的日志分析工具集成,如
ELK(Elasticsearch、Logstash、Kibana)
。
4、Modsecurity优点
- 完美兼容nginx,是nginx官方推荐的WAF
- 支持OWASP规则
- 3.0版本比老版本更新更快,更加稳定,并且得到了nginx、Inc和Trustwave等团队的积极支持
- 开源免费
5、Modsecurity缺点
- 不支持检查响应体的规则,如果配置中包含这些规则,则会被忽略,
nginx
的的sub_filter
指令可以用来检查状语从句:重写响应数据,OWASP
中相关规则是95X。 - 不支持OWASP核心规则集DDoS规则
REQUEST-912-DOS- PROTECTION.conf
,nginx
本身支持配置DDoS限制 - 不支持在审计日志中包含请求和响应主体
三、Nginx介绍及配置文件
1、Nginx基本概述
Nginx是一个高性能的 HTTP/反向代理的服务器及电子邮件 (IMAP/POP3)代理服务器.官方测试nginx能够支撑5万并发,并且cpu,内存等资源消耗却非常低,运行非常稳定。最重要的是开源,免费,可商用的。
Nginx还支持热部署,几乎可以做到7*
24小时不间断运行,即时运行数个月也不需要重启,还能够在不间断服务的情况下对软件进行升级维护。
2、Nginx应用场景
- 虚拟主机:一台服务器虚拟出多个网站
- 静态资源服务: 提供http资源访问服务。反向代理,负载均衡。
- 当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要哪个多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
3、正向代理
正向代理: 一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端通过配置或其他方式改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见。
图有点抽象,C表示客户端,S表示服务器端,中间为代理服务器
4、反向代理
反向代理: 对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好像它自己的一样,一次客户端并会并会不感知到反向代理后面的服务,因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
5、负载均衡
负载均衡建立在现有网络结构之上,它提供一种链家有效透明的方法扩展网络设备和服务器的宽带、增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。
6、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。一般来说,都需要将动态资源和静态资源分开,由于Nginx的高并发和静态资源缓存等特性,经常将静态资源部署在Nginx上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
7、主页面路径及配置文件介绍
(这里我只简单介绍下会用到的,对于详细的还请自行查询)
在默认的 Nginx 配置中,HTML 文件的根目录通常在 nginx.conf
文件中指定。同时,如果没有显式地指定,通常会使用系统默认的设置。以下是关于 Nginx 默认 HTML 目录的信息以及如何更改 nginx.conf
中的主页面路径的解释:
1、默认 HTML 目录
Nginx 的默认 HTML 目录一般在 nginx.conf
中的 server
配置块内指定的 root
指令。具体位置可以是以下两种情况之一:
-
全局配置下的默认设置:
- 在http配置块中,可以指定一个全局的默认根目录。例如:
http {
...
server {
...
root /usr/share/nginx/html;
...
}
...
}
在这种情况下,/usr/share/nginx/html
是默认的 HTML 文件根目录。
-
虚拟主机或特定域名配置中的设置:
- 如果有多个server配置块,每个配置块可以为不同的虚拟主机或域名指定不同的根目录。例如:
server {
...
root /var/www/example.com/html;
...
}
- 在这种情况下,
/var/www/example.com/html
将是特定域名或虚拟主机的 HTML 文件根目录。
2、更改 nginx.conf
中的主页面路径
要更改 Nginx 的默认主页面路径,你需要编辑 nginx.conf
文件并修改相应的 root
指令。下面是如何进行更改的步骤:
- 找到并编辑
nginx.conf
文件:
vim /etc/nginx/nginx.conf
-
找到或添加
server
配置块:- 如果你要修改全局的默认路径,找到
http
配置块中的server
部分。如果要修改特定域名或虚拟主机的路径,则找到相应的server
配置块。
- 如果你要修改全局的默认路径,找到
-
修改
root
指令:- 根据你的需求,修改或添加root指令来指定新的 HTML 文件根目录。例如:
server {
...
root /path/to/your/new/html/directory;
...
}
- 保存并退出编辑器
- 重启 Nginx 服务
三、LNMP环境介绍
LNMP是指Linux系统下采用Nginx、MySQL和PHP构建的网站服务器架构。这种组合因其高效、稳定和免费开源的特性而受到广泛欢迎。以下是LNMP架构的主要优势:
- Nginx作为Web服务器:
- 资源消耗低:相比Apache,Nginx使用更少的系统资源,能够处理更多的并发连接。
- 高效能:其事件驱动的架构使得处理请求更为高效,尤其擅长处理静态文件,速度快。
- 配置简洁:Nginx的配置文件简洁清晰,易于理解和维护。
- Nginx作为负载均衡服务器:
- 支持多种应用:可以作为HTTP和反向代理服务器,支持多种应用和技术栈,如Rails和PHP。
- 性能优越:用C语言编写,优于Perlbal等其他负载均衡方案,对CPU的利用率和系统资源开销更低。
- Nginx作为邮件代理服务器:
- 多功能:除了作为HTTP服务器外,Nginx也可以用作优秀的邮件代理服务器。
- 稳定性:具有高度的稳定性和可靠性,适合处理邮件服务的需求。
- 简单的安装和运维:
- 安装简单:Nginx的安装过程非常简单,配置也相对直观。
- 功能丰富:虽然配置简洁,但功能却十分丰富,支持各种高级功能和扩展。
- 运维便捷:稳定性高,运维成本低,适合长期稳定运行的服务。
LNMP架构以其高效、稳定和简单的特性,适合构建高性能、大流量的网站和应用服务。相较于其他架构如LAMP,在处理高并发和静态文件性能上具有明显优势,是许多Web开发者和运维人员的首选。
对于Nginx中间件关于PHP解析:
1、配置网页动静分离,解析PHP,有两种方法可以选择
- 使用PHP的FPM模块
- 将访问PHP页面的Web请求转交给 Apache服务器去处理
2、较新版本的PHP已经自带FPM模块,用来对PHP解析实例进行管理、优化解析效率
- FastCG将 Http Server和动态脚本语言分离开
- Nginx专门处理静态请求,转发动态请求
- PHP FPM专门解析PHP动态请求
- 单服务器的LNMP架构通常使用FPM的方式来解析PHP
而这里我们搭建的靶场是XSS-Labs,主要不涉及到数据库,这里LNMP环境的M则为数据库,所以这里我们不需要,这里不过多介绍,之后若是对于数据库有要求还需安装数据库以及PHP连接。
四、安装过程
这里仍需要注意环境,二次强调我这里使用CentOS7版本操作系统以及Modsecurity3.0.x版本来进行演示安装。
1、安装依赖
# 配置命令:
yum install -y git wget epel-release
yum install -y gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel pcre2-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake
-
yum install
: 使用yum
包管理器执行安装操作。 -
-y
: 自动应答 yes,即在安装过程中不需要手动确认。 -
git wget epel-release
: 需要安装的软件包列表包括 Git、wget 和 epel-release。Git
: 分布式版本控制系统,用于代码管理。wget
: 命令行工具,用于从 Web 下载文件。epel-release
: Extra Packages for Enterprise Linux(EPEL)是提供额外软件包的存储库,通常用于 CentOS 等 RHEL 兼容系统。
gcc-c++
: GNU C++ 编译器及工具。flex
: 用于生成词法分析器的工具。bison
: 用于生成语法分析器的工具。yajl yajl-devel
: Yet Another JSON Library,用于 JSON 数据的解析和生成。curl-devel
: CURL 开发包,提供用于 HTTP、FTP 等协议的客户端 URL 操作功能。curl
: CURL 的运行时库。GeoIP-devel
: GeoIP 数据库的开发包,用于 IP 地理位置查询。doxygen
: 用于生成软件文档的工具。zlib-devel
: Zlib 压缩库的开发包。pcre-devel pcre2-devel
: PCRE(Perl Compatible Regular Expressions)库的开发包,用于正则表达式。lmdb-devel
: Lightning Memory-Mapped Database(LMDB)的开发包,一种高效的内存映射数据库。libxml2-devel
: LibXML2 XML 解析库的开发包。ssdeep-devel
: ssdeep 模糊哈希库的开发包,用于文件比对和识别。lua-devel
: Lua 脚本语言的开发包。libtool autoconf automake
: 自动化工具链,用于软件包的自动配置和构建。
2、安装ModSecurity
# 配置命令:
cd /usr/local
wget --no-check-certificate https://github.com/owasp-modsecurity/ModSecurity/releases/download/v3.0.12/modsecurity-v3.0.12.tar.gz
tar -zxvf modsecurity-v3.0.12.tar.gz
cd /usr/local/modsecurity-v3.0.12
./configure
make -j4
make install
cd /usr/local
cd /usr/local
: 切换当前工作目录到/usr/local
。
wget --no-check-certificate https://github.com/owasp-modsecurity/ModSecurity/releases/download/v3.0.12/modsecurity-v3.0.12.tar.gz
wget --no-check-certificate https://github.com/owasp-modsecurity/ModSecurity/releases/download/v3.0.12/modsecurity-v3.0.12.tar.gz
: 使用wget
命令下载 OWASP ModSecurity 的版本为 3.0.12 的压缩包modsecurity-v3.0.12.tar.gz
。--no-check-certificate
参数表示忽略对服务器 SSL 证书的验证。
tar -zxvf modsecurity-v3.0.12.tar.gz
-
tar -zxvf modsecurity-v3.0.12.tar.gz
: 解压
modsecurity-v3.0.12.tar.gz
文件,-zxvf
参数解释如下:
z
: 使用 gzip 格式解压。x
: 解压文件。v
: 显示详细信息。f
: 指定要操作的文件。
cd /usr/local/modsecurity-v3.0.12
cd /usr/local/modsecurity-v3.0.12
: 切换当前工作目录到解压后的 ModSecurity 文件夹modsecurity-v3.0.12
。
./configure
./configure
: 运行配置脚本,通常用于检查系统环境并生成 Makefile。
make -j4
make -j4
: 使用make
命令并行编译,-j4
参数指定使用 4 个线程进行编译加速。
make install
make install
: 将编译后的程序和文件安装到系统中,通常是将可执行文件复制到/usr/local/bin
等目录。
3、安装Nginx与ModSecurity-Nginx
# 配置命令:
cd /usr/local
git clone https://github.com/SpiderLabs/ModSecurity-nginx
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -xvzf nginx-1.16.1.tar.gz
cd /usr/local/nginx-1.16.1
./configure --add-module=/usr/local/ModSecurity-nginx
make
make install
cd /usr/local
cd /usr/local
: 切换当前工作目录到/usr/local
。
git clone https://github.com/SpiderLabs/ModSecurity-nginx
git clone https://github.com/SpiderLabs/ModSecurity-nginx
: 使用 Git 克隆 SpiderLabs 维护的 ModSecurity-nginx 模块的代码仓库。这个模块是用于集成 ModSecurity Web 应用防火墙功能到 Nginx 服务器中的。
wget http://nginx.org/download/nginx-1.16.1.tar.gz
wget http://nginx.org/download/nginx-1.16.1.tar.gz
: 使用 wget 下载 Nginx 版本 1.16.1 的源代码压缩包。
tar -xvzf nginx-1.16.1.tar.gz
-
tar -xvzf nginx-1.16.1.tar.gz
: 解压 Nginx 源代码压缩包。选项
-xvzf
的解释如下:
x
: 解压文件。v
: 显示详细信息。z
: 使用 gzip 格式解压。f
: 指定要操作的文件。
cd /usr/local/nginx-1.16.1
cd /usr/local/nginx-1.16.1
: 切换当前工作目录到解压后的 Nginx 目录nginx-1.16.1
。
./configure --add-module=/usr/local/ModSecurity-nginx
./configure --add-module=/usr/local/ModSecurity-nginx
: 运行 Nginx 的配置脚本,并通过--add-module
参数指定要添加的模块,这里是 ModSecurity-nginx 模块。
make
make
: 使用 make 命令编译 Nginx 及其模块。
make install
make install
: 将编译后的 Nginx 及其模块安装到系统中。
4、Nginx测试
启动Nginx,查看IP地址并观察页面回显:
/usr/local/nginx/sbin/nginx
如果观察到Welcome to nginx!即为Nginx安装成功。
这里我们也可以模拟进行XSS攻击,查看页面回显:
http://ip地址/?param="><script>alert(1);</script>
我们可以看到这里依旧是可以进行查看的。
5、配置Modsecurity
# 配置命令:
mkdir /usr/local/nginx/conf/modsecurity
cd modsecurity-v3.0.12
cp modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity
cp unicode.mapping /usr/local/nginx/conf/modsecurity
cd /usr/local/nginx/conf/modsecurity/
mv modsecurity.conf-recommended modsecurity.conf
将modsecurity安装包中的modsecurity.conf-recommended
复制到/usr/local/nginx/conf/modsecurity
,并重命名为modsecurity.conf
;将modsecurity
安装包中的unicode.mapping
复制到/usr/local/nginx/conf/modsecurity
;下载规则文件压缩包(官网),解压后复制crs-setup.conf.example
到/usr/local/nginx/conf/modsecurity/
下并重命名为crs-setup.conf;
复制rules文件夹到/usr/local/nginx/conf/modsecurity/
下,同时修改REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example
与RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example
两个文件的文件名,将".example
"删除,可将自己写的规则放置于此两个文件中。
6、编辑nginx.conf
在http或server节点中添加以下内容(在http节点添加表示全局配置,在server节点添加表示为指定网站配置),这里个人建议在server节点后添加方便管理。
个人路径在/usr/local/nginx/conf/nginx.conf
modsecurity on;
modsecurity_rules_file /usr/local/nginx/conf/modsecurity/modsecurity.conf;
保存并退出vim编辑器
7、编辑modsecurity.conf
个人路径位于/usr/local/nginx/conf/modsecurity/modsecurity.conf
同时编辑将SecRuleEngine DetectionOnly
改为SecRuleEngine On
添加以下内容:
Include /usr/local/nginx/conf/modsecurity/crs-setup.conf
Include /usr/local/nginx/conf/modsecurity/rules/*.conf
如下图:
8、重启Nginx服务并测试
/usr/local/nginx/sbin/nginx -s reload
这里我们重启nginx服务,并测试依旧在url构造攻击语句:
http://ip地址/?param="><script>alert(1);</script>
可以看到这里已经进行了拦截:
9、记录审计日志配置更改
这里为了确保modsecurity3在记录审计日志时保存请求体,需要将SecAuditLogParts添加配置C,所以需要删除IJ,否则审计日志无法记录请求体。
具体配置更改如下图在modsecurity.conf
补充:modsecurity的日志在/var/log/modsec_audit.log
10、PHP-FPM安装及开启服务
# 配置命令:
yum install php* php-fpm -y
systemctl start php-fpm.service
同时创建Nginx与PHP的连接:
在nginx配置文件里面进行配置(这里我已经将靶场源码放在了根目录下xss目录里面,顺便一块配置):
http {
···
server {
listen 80;
server_name localhost;
modsecurity on;
modsecurity_rules_file /usr/local/nginx/conf/modsecurity/modsecurity.conf;
location / {
root /xss;
index index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root /xss;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /xss$fastcgi_script_name;
include fastcgi_params;
}
}
}
下面我对后半部分处理Nginx对于PHP处理的配置进行解读:
用来配置 Nginx 的 location
指令,用于处理以 .php
结尾的请求。
location ~ \.php$ {
location ~ \.php$ {
: 这行定义了一个location
块,使用正则表达式~ \.php$
匹配以.php
结尾的请求。在 Nginx 中,location
指令用于配置特定的请求处理规则。
root /xss;
root /xss;
: 指定了root
指令,设置请求的根目录为/xss
。这意味着所有匹配到.php
结尾的请求将从/xss
目录中寻找对应的文件。
fastcgi_pass 127.0.0.1:9000;
fastcgi_pass 127.0.0.1:9000;
: 指定了 FastCGI 后端服务器的地址和端口号。这里指定了 FastCGI 服务器位于本地主机 (127.0.0.1
) 的 9000 端口。
fastcgi_index index.php;
fastcgi_index index.php;
: 指定了当没有指定文件名时,默认使用index.php
作为索引文件。
fastcgi_param SCRIPT_FILENAME /xss$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /xss$fastcgi_script_name;
: 设置 FastCGI 参数SCRIPT_FILENAME
,将请求的文件路径设置为/xss
加上$fastcgi_script_name
的值。$fastcgi_script_name
是由 FastCGI 模块提供的变量,表示请求的文件名。
include fastcgi_params;
include fastcgi_params;
: 引入fastcgi_params
文件中定义的其他 FastCGI 参数。
作用是当收到以 .php
结尾的请求时:
- 从
/xss
目录中查找对应的 PHP 文件。 - 将请求通过 FastCGI 协议传递给本地的 PHP-FPM 服务器(监听在 127.0.0.1:9000)处理。
- 将
SCRIPT_FILENAME
设置为/xss
加上请求的文件名。
11、防御效果测试
首先在我们上一步配置好PHP解析以及源码文件目录的路径之后,仍需要进行重启Nginx服务(这里后续我们可以添加环境变量):
/usr/local/nginx/sbin/nginx -s reload
下面我们可以对已经搭建好的环境再次进行测试:
构建攻击payload:
可以看到这里已经被拦截掉了,之后我们可以去var下查看日志:
---2ZbN3m1E---F--
HTTP/1.1 403
Server: nginx/1.16.1
Date: Mon, 24 Jun 2024 00:44:47 GMT
Content-Length: 555
Content-Type: text/html
Connection: keep-alive
---2ZbN3m1E---H--
ModSecurity: Warning. detected XSS using libinjection. [file "/usr/local/nginx/conf/modsecurity/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "37"] [id "941100"] [rev ""] [msg "XSS Attack Detected via libinjection"] [data "Matched Data: XSS data found within ARGS:name: <script>alert(1);</script>"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A3"] [tag "OWASP_AppSensor/IE1"] [tag "CAPEC-242"] [hostname "10.0.8.11"] [uri "/level1.php"] [unique_id "171918988724.070416"] [ref "v21,26t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls"]
ModSecurity: Warning. Matched "Operator Rx' with parameter (?i:(?:<\w[\s\S]*[\s/]|'"?)(?:on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|d (3146 characters omitted)' against variable ARGS:name' (Value: <script>alert(1);</script>' ) [file "/usr/local/nginx/conf/modsecurity/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "205"] [id "941160"] [rev ""] [msg "NoScript XSS InjectionChecker: HTML Injection"] [data "Matched Data: <script found within ARGS:name: <script>alert(1);</script>"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A3"] [tag "OWASP_AppSensor/IE1"] [tag "CAPEC-242"] [hostname "10.0.8.11"]
[uri "/level1.php"] [unique_id "171918988724.070416"] [ref "o0,7v21,26t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls"]
ModSecurity: Access denied with code 403 (phase 2). Matched "Operator Ge' with parameter 5' against variable TX:ANOMALY_SCORE' (Value: 15' ) [file "/usr/local/nginx/conf/modsecurity/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 15)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.2.0"]
[maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "10.0.8.11"] [uri "/level1.php"] [unique_id "171918988724.070416"] [ref ""]
以上便是modsecurity告警部分,这里简单进行解读下:
ModSecurity: Warning
: 这是 ModSecurity 的警告消息。detected XSS using libinjection.
: 检测到跨站脚本(XSS)攻击,使用了 libinjection 工具。[file "/usr/local/nginx/conf/modsecurity/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"]
: 规则文件的路径和名称。[line "37"]
: 规则文件中匹配的行号。[id "941100"]
: 规则的唯一标识符。[msg "XSS Attack Detected via libinjection"]
: 警告消息的详细描述。[data "Matched Data: XSS data found within ARGS:name: <script>alert(1);</script>"]
: 被检测到的恶意数据,即包含<script>alert(1);</script>
的参数name
。[severity "2"]
: 警告的严重程度。[ver "OWASP_CRS/3.2.0"]
: 使用的 ModSecurity Core Rule Set 的版本。- 其他
[tag]
标签和相关信息指示了攻击类型、危害级别等详细信息。 ModSecurity: Access denied with code 403 (phase 2)
: ModSecurity 拦截了请求并返回了 403 状态码,指示访问被拒绝。Matched "Operator
Ge’ with parameter5' against variable
TX:ANOMALY_SCORE’ (Value:15' )
: 拦截规则匹配了异常分数(Anomaly Score),该请求的异常分数为 15,超过了规则设定的阈值。[file "/usr/local/nginx/conf/modsecurity/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"]
: 匹配的规则文件、行号和规则 ID。[msg "Inbound Anomaly Score Exceeded (Total Score: 15)"]
: 警告消息描述请求的异常分数超过了阈值。
以上便是服务器通过modsecurity检测到并拦截了一个含有XSS攻击尝试的请求,基于规则设置拒绝该请求。
四、所遇到的问题及思路
1、兼容性问题
报错内容为:
2024/06/23 16:12:12 [emerg] 6762#0: unknown directive "ModsecurityEnabled" in /usr/local/nginx/conf/nginx.conf:33
2024/06/23 16:13:16 [emerg] 7141#0: unknown directive "SecRuleEngine" in /usr/local/nginx/conf/modsecurity/modsecurity.conf:61
2024/06/23 16:15:23 [emerg] 7866#0: unknown directive "ModsecurityEnabled" in /usr/local/nginx/conf/nginx.conf:31
2024/06/23 16:15:53 [emerg] 8031#0: unknown directive "SecRuleEngine" in /usr/local/nginx/conf/modsecurity/modsecurity.conf:61
2024/06/23 16:18:16 [emerg] 8874#0: unknown directive "SecRuleEngine" in /usr/local/nginx/conf/modsecurity/modsecurity.conf:61
2024/06/23 16:19:12 [error] 15900#0: *24 open() "/usr/local/nginx/html/.env" failed (2: No such file or directory), client: 78.153.140.177, server: localhost, request: "GET /.env HTTP/1.1", host: "101.43.152.44
如产生上述报错,检查modsecurity版本是否为2版本的,以及中间件是否为Nginx,这段报错是我使用modsecurity2.9版本与Nginx搭配使用产生的报错,具体报错在重新启动加载nginx时候出现。
2、PHP未解析
页面访问出现直接或者间接下载PHP文件的情况,这里在我更换了modsecurity3版本之后发生的,上传XSS源码同时Nginx配置正确访问出现文件下载情况。
这里我的解决方式是:
yum install php* php-fpm
systemctl start php-fpm.service
3、访问出现file not found
这里我的情况是配置PHP解析以及安装之后产生的,产生这个问题主要是Nginx的配置文件的问题,所以这里先检查配置文件,我发现我的路径产生了问题。
# 原始配置:
location ~ \.php$ {
root /xss;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
include fastcgi_params;
}
在Nginx的配置中,SCRIPT_FILENAME
是一个FastCGI参数,用于指定要传递给FastCGI进程的脚本文件名。
原始配置分析
root /xss;
: 这个指令告诉Nginx在哪里查找文件。在这种情况下,它会在/xss
目录下寻找请求的文件。fastcgi_pass 127.0.0.1:9000;
: 定义FastCGI进程的地址和端口。fastcgi_index index.php;
: 指定当请求的URI以.php
结尾时,默认使用的索引文件。fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
: 这一行是关键。在原始配置中,SCRIPT_FILENAME
的设定是html$fastcgi_script_name
。这意味着Nginx将在root
指定的目录下(即/usr/share/nginx/html
)查找脚本文件。
修改后的配置分析
location ~ \.php$ {
root /xss;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /xss$fastcgi_script_name;
include fastcgi_params;
}
fastcgi_param SCRIPT_FILENAME /xss$fastcgi_script_name;
: 修改后,SCRIPT_FILENAME
的设定变为/xss$fastcgi_script_name
。这将构造一个路径,将FastCGI请求的脚本文件名添加到/xss
根目录后面。
修改成功的原因
- 根目录指定的问题:原始配置中,
SCRIPT_FILENAME
设定为html$fastcgi_script_name
,这意味着Nginx试图在/usr/share/nginx/html
目录下寻找脚本文件,这不是我的实际目录结构。 - 修改后的适应性:通过将
SCRIPT_FILENAME
设定为/xss$fastcgi_script_name
,Nginx会在/xss
目录下直接寻找请求的脚本文件。