Modsecurity安装+Nginx+腾讯云CentOS+XSS-Labs靶场+WAF规则

君衍.

  • 一、项目环境介绍
  • 二、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规则文件配置、以及防御效果的测试,同时也包含了我在安装测试过程中遇到的一些问题以及解决方式供大家参考,所以这里简单化安装配置。

前半部分我简单说下什么是NginxModsecurityXSS-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 指令。具体位置可以是以下两种情况之一:

  1. 全局配置下的默认设置

    • 在http配置块中,可以指定一个全局的默认根目录。例如:
 http {
     ...
     server {
         ...
         root /usr/share/nginx/html;
         ...
     }
     ...
 }

在这种情况下,/usr/share/nginx/html 是默认的 HTML 文件根目录。

  1. 虚拟主机或特定域名配置中的设置

    • 如果有多个server配置块,每个配置块可以为不同的虚拟主机或域名指定不同的根目录。例如:
server {
    ...
    root /var/www/example.com/html;
    ...
}
  • 在这种情况下,/var/www/example.com/html 将是特定域名或虚拟主机的 HTML 文件根目录。

2、更改 nginx.conf 中的主页面路径
要更改 Nginx 的默认主页面路径,你需要编辑 nginx.conf 文件并修改相应的 root 指令。下面是如何进行更改的步骤:

  1. 找到并编辑 nginx.conf 文件
vim /etc/nginx/nginx.conf
  1. 找到或添加 server 配置块

    • 如果你要修改全局的默认路径,找到 http 配置块中的 server 部分。如果要修改特定域名或虚拟主机的路径,则找到相应的 server 配置块。
  2. 修改 root 指令

    • 根据你的需求,修改或添加root指令来指定新的 HTML 文件根目录。例如:
server {
    ...
    root /path/to/your/new/html/directory;
    ...
}
  1. 保存并退出编辑器
  2. 重启 Nginx 服务

三、LNMP环境介绍

LNMP是指Linux系统下采用Nginx、MySQL和PHP构建的网站服务器架构。这种组合因其高效、稳定和免费开源的特性而受到广泛欢迎。以下是LNMP架构的主要优势:

  1. Nginx作为Web服务器
    • 资源消耗低:相比Apache,Nginx使用更少的系统资源,能够处理更多的并发连接。
    • 高效能:其事件驱动的架构使得处理请求更为高效,尤其擅长处理静态文件,速度快。
    • 配置简洁:Nginx的配置文件简洁清晰,易于理解和维护。
  2. Nginx作为负载均衡服务器
    • 支持多种应用:可以作为HTTP和反向代理服务器,支持多种应用和技术栈,如Rails和PHP。
    • 性能优越:用C语言编写,优于Perlbal等其他负载均衡方案,对CPU的利用率和系统资源开销更低。
  3. Nginx作为邮件代理服务器
    • 多功能:除了作为HTTP服务器外,Nginx也可以用作优秀的邮件代理服务器。
    • 稳定性:具有高度的稳定性和可靠性,适合处理邮件服务的需求。
  4. 简单的安装和运维
    • 安装简单: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.exampleRESPONSE-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进程的脚本文件名。

原始配置分析

  1. root /xss;: 这个指令告诉Nginx在哪里查找文件。在这种情况下,它会在 /xss 目录下寻找请求的文件。
  2. fastcgi_pass 127.0.0.1:9000;: 定义FastCGI进程的地址和端口。
  3. fastcgi_index index.php;: 指定当请求的URI以.php结尾时,默认使用的索引文件。
  4. 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;
}
  1. 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 目录下直接寻找请求的脚本文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/737735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 算法:二叉树的中序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的中序遍历 难度&#xff1a;简单⭐️ 题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&…

运动蓝牙耳机哪个口碑最好?五大高口碑顶尖单品推荐

在这个快节奏时代&#xff0c;智能手机的普及使得运动开放式耳机逐渐成为我们日常出行的必备单品。运动开放式耳机凭借独特的外形设计&#xff0c;赢得了众多消费者的喜爱。它们不同于传统的入耳式设计&#xff0c;以舒适佩戴为核心&#xff0c;有效缓解了长时间佩戴对耳部造成…

Pikachu靶场--CRSF

借鉴参考 CSRF跨站请求伪造&#xff08;CTF教程&#xff0c;Web安全渗透入门&#xff09;_bilibili pikachu靶场CSRF之TOKEN绕过_csrf token绕过的原理-CSDN博客 CSRF(get) 发现需要登录 查看提示&#xff0c;获取username和password 选择一个用户进行登录 选择修改个人信息 …

哪款护眼落地灯护眼效果好?五款高品质护眼落地灯分享

哪款护眼落地灯护眼效果好&#xff1f;想要保护好宝宝视力&#xff0c;从灯光上下手可是很关键&#xff01;普通照明灯有眩光、蓝光是伤害娃视力的主要“元凶”&#xff01;现在市面上护眼大路灯炙手可热&#xff0c;哪款护眼落地灯质量好&#xff1f;护眼大路灯应该怎么选呢&a…

解决vscode运行js时突然报错

1. 问题背景 创建JavaScript文件运行&#xff0c;弹出错误&#xff1a;Can’t find Node.js binary “node”: path does not exist. Make sure Node.js is installed and in your PATH, or set the “runtimeExecutable” in your launch.json 这是由于没有配置好setting.js…

快手可灵:上线图生视频和视频续写

上次介绍的快手的 Kling 大模型上线了新功能&#xff0c;其中图生视频支持将静态图像转化为生动的 5 秒视频&#xff0c;运动幅度比 Luma 低&#xff0c;但是非常稳定。视频续写则支持单次让视频运动延续 4.5 秒&#xff0c;支持连续多次的续写&#xff0c;最长可生成 3 分钟的…

数据类型 运算符

基本数据类型与引用数据类型的区分 存储内容&#xff1a; 基本数据类型&#xff1a;直接存储实际的数据值&#xff0c;如整数、浮点数、字符等。引用数据类型&#xff1a;存储对象的引用&#xff08;内存地址&#xff09;&#xff0c;而不是对象本身。 内存分配&#xff1a; 基…

[JS]函数

介绍 函数就是用来执行特点任务的代码块, 目的是实现代码复用, 提高开发效率 使用 1.0函数的声明 function 函数名 () {//函数体 } 2.0函数的调用 3.0命名规范 和变量命名规则基本一致尽量小驼峰式命名前缀应该为动词 传参 函数的参数可以极大提高函数的灵活性 1.0参数…

HTTP3(QUIC)详解

文章目录 一、HTTP3简述二、为什么不升级改造TCP而使用UDP&#xff1f;三、QUIC的实现四、HTTP3改进详解1. 快速连接建立(1-RTT初次建立&#xff0c;0-RTT恢复&#xff09;2. 无队头阻塞&#xff08;Head-of-Line Blocking&#xff09;重传机制HTTP/2 中的流HTTP/3 中的流 3. 移…

PyTorch LSTM模型深度解析:参数设置全指南

本文主要依据 Pytorch 中LSTM官方文档 &#xff0c;对其中的 模型参数 、 输入 、 输出 进行详细解释。 目录 基本原理 模型参数 Parameters 输入Inputs: input, (h_0, c_0) 输出Outputs: output, (h_n, c_n) 变量Variables 备注 基本原理 首先我们看下面这个LSTM图&am…

应届毕业之本科简历制作

因为毕设以及编制岗位面试&#xff0c;最近好久没有更新了&#xff0c;刚好有同学问如何制作简历&#xff0c;我就准备将我自己制作简历的流程分享给各位&#xff0c;到此也算是一个小的结束&#xff0c;拿了工科学位证书毕业去做&#x1f402;&#x1f40e;了。 简历主要包含内…

# Kafka_深入探秘者(3):kafka 消费者

Kafka_深入探秘者&#xff08;3&#xff09;&#xff1a;kafka 消费者 一、kafka 消费者、消费组 1、Kafka 消费者是消费组的一部分&#xff0c;当多个消费者形成一个消费组来消费主题时&#xff0c;每个消费者会收到不同分区的消息。假设有一个 T1 主题&#xff0c;该主题有…

Spring+SpringMVC+MyBatis整合

目录 1.SSM介绍1.1 什么是SSM&#xff1f;1.2 SSM框架1.2.1 Spring1.2.2 SpringMVC1.2.3 MyBatis 2.SSM框架整合2.1 建库建表2.2 创建工程2.3 pom.xml2.4 log4j.properties2.5 db.properties2.6 applicationContext-dao.xml2.7.applicationContext-tx.xml2.8 applicationContex…

移远通信SC200L(展锐SL8541E)Linux系统修改分区大小

一、确定大小 由于默认的根文件分区大小仅500M&#xff0c;/lib目录移植个app都放不进去&#xff0c;这谁受得了&#xff1f; userdata分区却有6G&#xff0c;匀一点。 在 prebuilts/pac-binary/sl8541e/ 下有分区信息表 sl8541e-emmc-marlin2.xml&#xff1a; 找到system项&a…

MyBatis-Plus常用注解详解与实战应用

MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。它提供了大量的常用注解&#xff0c;使得开发者能够更方便地进行数据库操作。 MyBatis-Plus 提供的注解可以帮我们解决一些数据库与实体之间相…

高校新生如何选择最优手机流量卡?

一年一度的高考已经结束了&#xff0c;愿广大学子金榜题名&#xff0c;家长们都给孩子准备好了手机&#xff0c;那么手机流量卡应该如何选择呢&#xff1f; 高校新生在选择手机流量卡时&#xff0c;需要综合考量流量套餐、费用、网络覆盖、售后服务等多方面因素&#xff0c;以下…

怎么用Excel生成标签打印模板,自动生成二维码

环境&#xff1a; EXCEL2021 16.0 问题描述&#xff1a; 怎么用excel生成标签打印模板自动生成二维码 解决方案&#xff1a; 在Excel中生成标签打印模板并自动生成二维码&#xff0c;可以通过以下几个步骤完成&#xff1a; 1. 准备数据 首先&#xff0c;确保你的Excel表…

【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(上)

文章目录 0. 前言1. 剪枝prune主要功能分类2. torch.nn.utils.prune中的方法介绍3. PyTorch实例3.1 BasePruningMethod3.2PruningContainer3.3 Identity3.4RandomUnstructured3.5L1Unstructured 4. 总结 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学…

【AI大模型】驱动的未来:穿戴设备如何革新血液、皮肤检测与营养健康管理

文章目录 1. 引言2. 现状与挑战3. AI大模型与穿戴设备概述4. 数据采集与预处理4.1 数据集成与增强4.2 数据清洗与异常检测 5. 模型架构与训练5.1 高级模型架构5.2 模型训练与调优 6. 个性化营养建议系统6.1 营养建议生成优化6.2 用户反馈与系统优化 7. 关键血液成分与健康状况评…

Win11最适合打游戏的版本推荐:畅玩游戏,告别卡顿!

在Win11电脑操作中&#xff0c;用户不仅可以进行办公、学习等操作&#xff0c;也可以畅玩喜欢的游戏。如果喜欢打游戏的用户&#xff0c;就可以安装上适合打游戏的系统版本。但许多新手用户不知道去哪里找到最适合打游戏的Win11系统版本&#xff1f;以下小编就给大家带来这样的…