本文记录目的: 研究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
这里腾讯云服务器可以免费试用,可供学习及测试,我这里也用到了壹号DNS来搞了个DNS域名解析。
对于环境这里着重强调下ModsecurityV2版本是与Nginx无法完成兼容的,我在搭建过程中未注意到这个问题导致耗费一定时间。在后面的问题及解决思路里面包含了不兼容情况下的报错,这里需要注意。
ModSecurity是一个强大的开源Web应用防火墙(WAF),旨在保护Web应用免受各种恶意攻击。作为一个嵌入式模块,它可以集成到主流的Web服务器(如Apache、Nginx)中,有效地拦截和阻止可能导致数据泄露或服务中断的恶意HTTP请求。
ModSecurity的设计目标是提供一个高度灵活和可配置的安全解决方案,以应对常见的Web攻击方式,包括但不限于:
ELK(Elasticsearch、Logstash、Kibana)
。nginx
的的sub_filter
指令可以用来检查状语从句:重写响应数据,OWASP
中相关规则是95X。REQUEST-912-DOS- PROTECTION.conf
,nginx
本身支持配置DDoS限制Nginx是一个高性能的 HTTP/反向代理的服务器及电子邮件 (IMAP/POP3)代理服务器.官方测试nginx能够支撑5万并发,并且cpu,内存等资源消耗却非常低,运行非常稳定。最重要的是开源,免费,可商用的。
Nginx还支持热部署,几乎可以做到7*
24小时不间断运行,即时运行数个月也不需要重启,还能够在不间断服务的情况下对软件进行升级维护。
正向代理: 一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端通过配置或其他方式改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见。
图有点抽象,C表示客户端,S表示服务器端,中间为代理服务器
反向代理: 对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好像它自己的一样,一次客户端并会并会不感知到反向代理后面的服务,因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
负载均衡建立在现有网络结构之上,它提供一种链家有效透明的方法扩展网络设备和服务器的宽带、增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。一般来说,都需要将动态资源和静态资源分开,由于Nginx的高并发和静态资源缓存等特性,经常将静态资源部署在Nginx上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
(这里我只简单介绍下会用到的,对于详细的还请自行查询)
在默认的 Nginx 配置中,HTML 文件的根目录通常在 nginx.conf
文件中指定。同时,如果没有显式地指定,通常会使用系统默认的设置。以下是关于 Nginx 默认 HTML 目录的信息以及如何更改 nginx.conf
中的主页面路径的解释:
1、默认 HTML 目录
Nginx 的默认 HTML 目录一般在 nginx.conf
中的 server
配置块内指定的 root
指令。具体位置可以是以下两种情况之一:
全局配置下的默认设置:
http {
...
server {
...
root /usr/share/nginx/html;
...
}
...
}
在这种情况下,/usr/share/nginx/html
是默认的 HTML 文件根目录。
虚拟主机或特定域名配置中的设置:
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
指令:
server {
...
root /path/to/your/new/html/directory;
...
}
LNMP是指Linux系统下采用Nginx、MySQL和PHP构建的网站服务器架构。这种组合因其高效、稳定和免费开源的特性而受到广泛欢迎。以下是LNMP架构的主要优势:
LNMP架构以其高效、稳定和简单的特性,适合构建高性能、大流量的网站和应用服务。相较于其他架构如LAMP,在处理高并发和静态文件性能上具有明显优势,是许多Web开发者和运维人员的首选。
对于Nginx中间件关于PHP解析:
1、配置网页动静分离,解析PHP,有两种方法可以选择
2、较新版本的PHP已经自带FPM模块,用来对PHP解析实例进行管理、优化解析效率
而这里我们搭建的靶场是XSS-Labs,主要不涉及到数据库,这里LNMP环境的M则为数据库,所以这里我们不需要,这里不过多介绍,之后若是对于数据库有要求还需安装数据库以及PHP连接。
这里仍需要注意环境,二次强调我这里使用CentOS7版本操作系统以及Modsecurity3.0.x版本来进行演示安装。
# 配置命令:
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
: 自动化工具链,用于软件包的自动配置和构建。# 配置命令:
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
等目录。# 配置命令:
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 及其模块安装到系统中。启动Nginx,查看IP地址并观察页面回显:
/usr/local/nginx/sbin/nginx
如果观察到Welcome to nginx!即为Nginx安装成功。
这里我们也可以模拟进行XSS攻击,查看页面回显:
http://ip地址/?param="><script>alert(1);</script>
我们可以看到这里依旧是可以进行查看的。
# 配置命令:
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
"删除,可将自己写的规则放置于此两个文件中。
在http或server节点中添加以下内容(在http节点添加表示全局配置,在server节点添加表示为指定网站配置),这里个人建议在server节点后添加方便管理。
个人路径在/usr/local/nginx/conf/nginx.conf
modsecurity on;
modsecurity_rules_file /usr/local/nginx/conf/modsecurity/modsecurity.conf;
保存并退出vim编辑器
个人路径位于/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
如下图:
/usr/local/nginx/sbin/nginx -s reload
这里我们重启nginx服务,并测试依旧在url构造攻击语句:
http://ip地址/?param="><script>alert(1);</script>
可以看到这里已经进行了拦截:
这里为了确保modsecurity3在记录审计日志时保存请求体,需要将SecAuditLogParts添加配置C,所以需要删除IJ,否则审计日志无法记录请求体。
具体配置更改如下图在modsecurity.conf
补充:modsecurity的日志在/var/log/modsec_audit.log
# 配置命令:
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 文件。SCRIPT_FILENAME
设置为 /xss
加上请求的文件名。首先在我们上一步配置好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: "] [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: "] [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: "]
: 被检测到的恶意数据,即包含
的参数 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攻击尝试的请求,基于规则设置拒绝该请求。
报错内容为:
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时候出现。
页面访问出现直接或者间接下载PHP文件的情况,这里在我更换了modsecurity3版本之后发生的,上传XSS源码同时Nginx配置正确访问出现文件下载情况。
这里我的解决方式是:
yum install php* php-fpm
systemctl start php-fpm.service
这里我的情况是配置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
目录下直接寻找请求的脚本文件。