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

news2024/10/5 12:57:38

君衍.

  • 一、项目环境介绍
  • 二、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 目录下直接寻找请求的脚本文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LinuxC语言】深入理解IP地址与端口号

文章目录 前言端口号IP地址IP地址的分类主机地址与网络地址多播是什么子网掩码特殊的地址与私有的地址总结前言 在计算机网络中,IP 地址和端口号是两个非常重要的概念。IP 地址用于标识网络上的设备,而端口号则用于在同一设备上区分不同的服务或应用。在 Linux C 语言编程中…

一文学会用RKE部署高可用Kubernetes集群

k8s架构图 RKE简介 RKE全称Rancher Kubernetes Engine,是一个快速的,多功能的 Kubernetes 安装工具。通过RKE,我们可以快速的安装一个高可用K8S集群。RKE 支持多种操作系统,包括 MacOS、Linux 和 Windows。 K8S原生安装需要的先决条件较多,比如说需要预安装kubeadm,kub…

GPT-5大幅推迟?OpenAI CTO称将在2025年底到2026年初推出

GPT-5大幅推迟&#xff1f;OpenAI CTO称将在2025年底到2026年初推出 OpenAI CTO同时透露&#xff0c;GPT-5性能将有巨大飞跃&#xff0c;在某些特定任务中达到“博士水平”智能&#xff0c;此前市场曾预测GPT-5可能在2023年底或2024年夏季发布。 一再跳票的GPT-5可能大幅推迟…

基于matlab的SVR回归预测

1 原理 SVR&#xff08;Support Vector Regression&#xff09;回归预测原理&#xff0c;基于支持向量机&#xff08;SVM&#xff09;的回归分支&#xff0c;其核心思想是通过寻找一个最优的超平面来进行回归预测&#xff0c;并处理非线性回归问题。以下是SVR回归预测原理的系统…

腾讯 MOFA-Video: 可控制图转视频

腾讯 MOFA-Video: 可控制图转视频 MOFA-Video 它支持运动轨迹、人脸关键点并支持将其混合控制图像转换为视频。 混合控制: 结合图像、控制信号和关键点生成动画。 运动画笔: 结合图像、轨迹和画笔生成动画。 控制比例: 调整动画的控制比例&#xff0c;从纯 SVD 到完全控制。 通…

实验七:了解可编辑网格与多边形实战

如果文章有写的不准确或需要改进的地方&#xff0c;还请各位大佬不吝赐教&#x1f49e;&#x1f49e;&#x1f49e;。朱七在此先感谢大家了。&#x1f618;&#x1f618;&#x1f618; &#x1f3e0;个人主页&#xff1a;语雀个人知识库 &#x1f9d1;个人简介&#xff1a;大家…

情感搞笑聊天记录视频:AI自动化生成技术,操作简单,教程+软件

在数字化时代&#xff0c;内容创作已成为吸引观众、传递信息的重要手段。随着人工智能技术的飞速发展&#xff0c;AI自动生成视频为创作者提供了新的工具和可能性。本文将介绍如何利用AI技术&#xff0c;通过情感搞笑聊天记录视频&#xff0c;在视频号上实现内容的自动化生成&a…

什么样的落地台灯比较好?五款宝藏可靠护眼大路灯推荐

现代家庭中&#xff0c;落地台灯也逐渐的代替传统台灯&#xff0c;成为许多孩子在读写时的照明神器&#xff0c;它已经被许多家长认可&#xff0c;宽广的光线光线清晰&#xff0c;视觉上舒适了不少。然而&#xff0c;目前市场上有许多品牌未经过充分的技术、材质和工艺研究&…

中国车牌检测数据集VOC+YOLO格式2001张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2001 标注数量(xml文件个数)&#xff1a;2001 标注数量(txt文件个数)&#xff1a;2001 标注…

“论云原生架构及其应用”写作框架,系统架构设计师

论文真题 近年来&#xff0c;随着数字化转型不断深入&#xff0c;科技创新与业务发展不断融合&#xff0c;各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下&#xff0c;以容器和微服务架构为代表的云原生技术作为云计算服务的新…

【耐水好】强耐水UV胶水是怎样的?

【耐水好】强耐水UV胶水是怎样的&#xff1f; 强耐水UV胶水是一种特殊的胶水&#xff0c;其设计重点在于其出色的耐水性能。以下是关于强耐水UV胶水的特点&#xff1a; 优异的耐水性能&#xff1a;这种胶水能在水环境下保持稳定的粘接强度&#xff0c;不易被水分解或削弱。因…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4241(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、SPI接口配置: 2)、时钟配置 四、软件代码部分: 1)、初始化部分: void Task0_Init(void) { lcd1602_Init(); LCD1602_write_string(0,0,"POT0 value:"); LCD1602_write_string(1,0,"POT…

Langchain实战:构建高效的知识问答系统

引言 知识问答系统&#xff08;KQA&#xff09;是自然语言处理领域的核心技术之一&#xff0c;它能够帮助用户从大量数据中快速准确地检索到所需信息。知识问答系统成为了帮助个人和企业快速获取、筛选和处理信息的重要工具。它们在很多领域都发挥着重要作用&#xff0c;例如在…

“人工智能+”带来新变化

以生成式人工智能&#xff08;AIGC&#xff09;为代表的新一代人工智能技术创新加速演进&#xff0c;相关商业化应用成果也不断涌现&#xff0c;行业应用范围不断拓展&#xff0c;深度赋能实体经济&#xff0c;为行业提质增效与实现减排提供助力。 自主航运初创公司OrcaAI于6月…

AI 大模型企业应用实战(06)-初识LangChain

LLM大模型与AI应用的粘合剂。 1 langchain是什么以及发展过程 LangChain是一个开源框架&#xff0c;旨在简化使用大型语言模型构建端到端应用程序的过程&#xff0c;也是ReAct(reasonact)论文的落地实现。 2022年10月25日开源 54K star 种子轮一周1000万美金&#xff0c;A轮2…

光泽正在褪去,所以我们又回到了人工智能领域。

光泽正在褪去&#xff0c;所以我们又回到了人工智能领域。 人工智能冬天将被私有化 自从“人工智能”这个流行词在20世纪50年代被创造出来以来&#xff0c;人工智能经历了几次繁荣和萧条周期。 一种新的技术方法看起来很有趣&#xff0c;并取得了一些成果。它被荒谬地炒作并获…

夏季高压电环境下,工厂如何高效检测可燃气体报警器?

近日&#xff0c;美光台中工厂因高压气体泄漏引起火灾的事件引发了广泛关注。这起事件不仅让人们看到了工厂安全管理的紧迫性&#xff0c;更让可燃气体报警器这一安全设备成为了焦点。 在这篇文章中&#xff0c;佰德将从美光台中工厂火灾案例出发&#xff0c;深入探讨可燃气体…

【Java算法】滑动窗口 下

​ ​ &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f98c;一.水果成篮 题目链接&#xff1a;904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”&#xff08;Sliding Window&#xff09;策略&#xff0c;结…

element-plus的Tour 漫游式引导怎么去绑定Cascader 级联选择器或者它的内容 popper

首先官方例子是用的button 官方.$el这个log出来是&#xff1a; 知道是以元素为准就拿对应的元素就行 级联选择器.$el是这样的&#xff1a; 你可以移入这个元素部分去看看是哪个要用的&#xff08;好像谷歌还是狐火直接放上去就可以看到元素表示&#xff0c;但是我有时用谷歌只…

环境安装-oracle11g

目录 下载 安装 下载 oracle官网下载 http://www.oracle.com/ https://www.oracle.com/cn/ 找了一下官网&#xff0c;没找到oracle11g 在百度上查询得知&#xff1a;Oracle官方已经将11g的安装包从下载区下架了。如图所示未找到11g版本&#xff1a; 从搜索引擎下载资源包&a…