君衍.
1. 项目环境概述2. ModSecurity 概述1. Modsecurity 基本概述2. Modsecurity 工作原理3. Modsecurity 功能特点4. Modsecurity 优点5. Modsecurity 缺点
3. Nginx 概述及配置文件1. Nginx 基本概述2. Nginx 应用场景3. 正向代理4、反向代理5、负载均衡6、动静隔离7. 主页路径及配置文件概述
3. LNMP 环境概述4. 安装流程1. 安装依赖2. 安装ModSecurity 3. 安装Nginx 和ModSecurity-Nginx4,测试Nginx 5. 配置Modsecurity6,编辑nginx.conf7,编辑modsecurity.conf8,重启并测试Nginx 服务9记录更改审核日志设置10.安装PHP-FPM并启动服务11.防御有效性测试
四、遇到的问题和思路1. 兼容性问题2. PHP 未解析3. 访问时找不到文件
本文的目的是研究Modsecurity瑞士军刀传统WAF对靶场网站的防护效果以及规则防护的原理结构,并确定与当前一代WAF、AI的关系。自学习WAF与各大厂商安全产品的区别。
本文介绍在CentOS和Nginx环境中安装ModSecurity v3.0.x、配置WAF规则文件以及测试防护有效性。我们还列出了我们在安装和测试过程中遇到的一些问题及其解决方案。这里我们将简化安装配置。
第一部分简要介绍Nginx、Modsecurity 和XSS-Labs。如果明白的话可以跳过目录直接检查配置。
一、项目环境介绍
首先,这里应用的环境是腾讯云服务器(操作系统为CentOS7版本)、Nginx中间件、modsecurity3.0.3、OWASP规则库。
Linux查看系统版本命令:
# 请选择一项
uname -r
猫/过程/版本
主机名ctl
Linux 系统
腾讯云服务器:这里也可以使用本地虚拟机。本地CentOS和RedHat也适合本文。需要更改命令。配置完成后,您还可以进行内网穿透映射到公网,以检查防护效果。 Nginx中间件:我们这里使用Nginx,因为它具有负载均衡功能,并且经常在生产环境中使用。同时,它还可以作为反向代理,将客户端请求转发到后端服务器,并且与功能齐全的服务器上的容器一起使用时,可以更轻松地转发到各种服务容器环境。 ModSecurity3.0.x:保护Web 应用程序安全的开源应用程序层防火墙。稍后我会介绍详细信息,但是您可以从Modsecurity的官网下载环境。在这里,它将被视为传统的WAF。 OWASP 规则库:其主要目的是提供一组经过测试的开源规则,用于保护Web 应用程序免受常见Web 攻击。这些规则旨在检测和防御各种类型的攻击,例如SQL 注入、跨站脚本(XSS)、跨站请求伪造(CSRF)、路径遍历和命令注入。 XSS-Labs 射击场:适合初学者的射击场,您可以在这里练习XSS 技术和战术。欲了解更多信息,请访问XSS-Labs 射击场。
腾讯云服务器在此提供免费试用,供学习和测试使用。我们还使用了1号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完全兼容,支持OWASP规则,比旧版本更快,并且是开源的。而且它是免费的。
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还支持热部署,可以不间断运行近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 中服务器配置块的root 指令中指定。特定位置可能处于以下两种情况之一:
全局配置默认设置:
http 配置块允许您指定全局默认根目录。例如:
http{
.
服务器{
.
根/usr/share/nginx/html;
.
}
.
}
在这种情况下,/usr/share/nginx/html 是默认的HTML 文件根目录。
设置虚拟主机或特定于域的配置:
如果您有多个服务器配置块,则每个配置块可以为不同的虚拟主机或域名指定不同的根目录。例如:
服务器{
.
根/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
查找或添加服务器配置块。
如果要更改全局默认路径,请在http配置块中找到server部分。如果要更改特定域名或虚拟主机的路径,请找到相应的服务器配置块。修改root命令。
如有必要,修改或添加root 指令以指定新HTML 文件的根目录。例如:
服务器{
.
根/path/to/your/new/html/目录;
.
}
保存,退出编辑器,重启Nginx服务。
三、LNMP环境介绍
LNMP是指在Linux系统上使用Nginx、MySQL、PHP构建的网站服务器架构。这种组合因其高效、稳定、免费开源的特点而广受欢迎。 LNMP架构的主要优点是:
Nginx 作为网络服务器:
资源消耗低:与Apache相比,Nginx使用更少的系统资源,并且可以处理更多的并发连接。高性能:事件驱动的架构使得处理请求更加高效,尤其是静态文件的快速处理。配置简单:Nginx配置文件简单明了,易于理解和维护。 Nginx 作为负载均衡服务器:
支持多种应用:可以作为HTTP和反向代理服务器,支持Rails、PHP等多种应用和技术栈。卓越的性能:采用C 语言编写,其性能优于Perlbal 等其他负载均衡解决方案,从而降低CPU 使用率和系统资源开销。 Nginx 作为邮件代理服务器:
多功能性:Nginx 不仅可以用作HTTP 服务器,还可以用作出色的电子邮件代理服务器。稳定性:高度稳定可靠,适合处理电子邮件服务需求。 易于安装和操作:
安装简单:Nginx的安装过程非常简单,配置也比较直观。功能丰富:尽管配置简单,但功能极其丰富,支持多种高级功能和扩展。运维便捷:稳定性高,运维成本低,适合业务长期稳定运行。
LNMP架构高效、稳定、简单,适合构建高性能、大流量的网站和应用服务。相比LAMP等其他架构,它在处理高并发和静态文件性能方面具有明显的优势,成为很多Web开发人员和运维人员的首选。
对于用于PHP 解析的Nginx 中间件:
1. 可以选择两种方式配置动静态网页分离和解析PHP。
使用PHP的FPM模块将访问PHP页面的Web请求转发到Apache服务器进行处理
2.较新版本的PHP已经自带了FPM模块,用于管理PHP解析实例并优化解析效率。
FastCG 将HTTP 服务器和动态脚本语言分开。 Nginx 专门处理静态请求,而PHP FPM 专门解析PHP 动态请求。单服务器LNMP 架构通常解析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-develcurl-develcurl GeoIP-devel doxygen zlib-devel pcre-devel pcre2-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake
yum install: 使用yum 包管理器执行安装操作。
-y: 自动回答是。这意味着在安装过程中不需要手动验证。
git wget epel-release : 您需要安装的软件包列表包括Git、wget 和epel-release。
Git:分布式版本控制系统,用于代码管理。 wget: 用于从网络下载文件的命令行工具。 epel-release: Enterprise Linux 的附加软件包(EPEL) 是一个存储库,提供RHEL 兼容系统(例如CentOS)上常用的附加软件包。
gcc-c++: GNU C++ 编译器和工具。 flex: 用于生成词法分析器的工具。 bison: 生成解析器的工具。 yajl yajl-devel: 另一个JSON 库。用于解析并生成JSON数据。 curl-devel: CURL 开发包为HTTP、FTP 和其他协议提供客户端URL 操作功能。 curl: CURL 运行时库。 GeoIP-devel: 用于IP 地理定位查询的GeoIP 数据库开发包。 doxygen: 生成软件文档的工具。 zlib-devel: Zlib压缩库开发包。 pcre-devel pcre2-devel: 用于正则表达式的PCRE(Perl 兼容正则表达式)库的开发包。 lmdb-devel: Lightning 内存映射数据库(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。 /配置、设置
使-j4
安装
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: 运行配置脚本,该脚本通常用于检查系统环境并生成Makefile。
使-j4
make -j4: 使用make命令并行编译,-j4参数指定使用四个线程来加速编译。
安装
make install: 通常通过将可执行文件复制到/usr/local/bin 等目录来在系统上安装已编译的程序和文件。
3、安装Nginx与ModSecurity-Nginx
# 配置命令:
cd /usr/local
git克隆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
制作
安装
cd /usr/local
cd /usr/local: 将当前工作目录切换到/usr/local。
git克隆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 命令编译Nginx 及其模块。
安装
make install: 在您的系统上安装编译的Nginx 及其模块。
4、Nginx测试
启动Nginx,检查IP 地址,并观察页面回显。
/usr/local/nginx/sbin/nginx
如果观察到,Welcome to nginx! 则说明Nginx已经安装成功。
您还可以在此处模拟XSS 攻击并查看页面回显。
http://ip地址/?param=\’scriptalert(1);/script
可以看到这里还是可以看到的。
5、配置Modsecurity
# 配置命令:
mkdir /usr/local/nginx/conf/modsecurity
cd modsecurity-v3.0.12
cp modsecurity.conf-推荐/usr/local/nginx/conf/modsecurity
cp unicode.mapping /usr/local/nginx/conf/modsecurity
cd /usr/local/nginx/conf/modsecurity/
mv modsecurity.conf – 推荐modsecu
rity.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 parameter 5\’ 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 目录下直接寻找请求的脚本文件。
#以上关于Modsecurity安装+Nginx+腾讯云CentOS+XSS的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91917.html