Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
lighttpd-win32-dotdot-space — lighttpd 1.4.85 - 高危 - 远程 - 路径 - 原生 Win32 GET /..%20/ 读取文档根目录之外的文件 | Kitploit
工具/GitHubGitHub/abraxas/lighttpd-win32-dotdot-space
漏洞分析漏洞利用Web应用程序漏洞利用Web安全渗透测试实验室与实践
GitHubabraxas/lighttpd-win32-dotdot-space

lighttpd-win32-dotdot-space

lighttpd 1.4.85 - 高危 - 远程 - 路径 - 原生 Win32 GET /..%20/ 读取文档根目录之外的文件

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
查看仓库
46天前尚未审核
分享

Abraxas Labs - lighttpd-win32-dotdot-space

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  lighttpd-win32-dotdot-space

技术分析文章:https://abraxaslabs.tech/research/lighttpd-win32-dotdot-space

lighttpd-win32-dotdot-space

类别: 文件读取 可达性: 远程

lighttpd 1.4.85(4852959)- lighttpd

原生 _WIN32 的 staticfile 在 buffer_path_simplify 之后将 document-root 与 rel_path 拼接。Simplify 仅在第三个字节为 / 时才折叠 ../。http_response_prepare_physical 仅从整个路径中剥离末尾的空格和点。因此 GET /..%20/windows/win.ini 会保持为 /.. /windows/win.ini。随后,不带 \\?\ 前缀的 _wstati64 / _wopen 会让 Win32 按路径组件剥离空格,并将该段视为 ..。

在原生 Windows lighttpd 上,未经身份验证的 GET/HEAD 请求可读取 document-root 之外、worker 账户能够打开的常规文件。 Unix/Linux 不存在此遗留问题。属于文件读取,而非 RCE。

该实验环境是这些 pin 函数的 gadget 实现。它并非真实的原生 Win32 worker。最后一行使用 how=gadget。

ID暂无 CVE
类别文件读取(路径遍历,原生 Win32 ..%20/)
可达性远程(未经身份验证的 GET/HEAD)
CWECWE-22
CVSS高危:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
产品lighttpd1.4
受影响版本1.4.85(4852959e67ef51ea68084984400d3264b854c97d)原生 _WIN32
认证无。默认 mod_staticfile
许可证GNU Affero GPL v3.0
实验环境仅 127.0.0.1,how=gadget

攻击者能做什么

需要原生 Windows lighttpd 提供静态文件服务。worker 账户必须能够打开目标常规文件。

权限方法 / 汇聚点实验验证或推断
读取 document-root 之外的文件未经身份验证的 GET /..%20/<name>实验验证(gadget)。HTTP 200 响应体即为上级目录中的机密文件
对非末尾 .. 组件上的其他末尾 ASCII 空格/点采用同类手法url 解码后 simplify 保留 .. %20 已实验验证。其他末尾空格/点属推断
对同一路径发起 HEAD 请求staticfile HEAD推断。实验使用 GET
反例:真实的 /../buffer_path_simplify 折叠 ../实验验证。返回 404,简化后为 /windows/win.ini,无见证
反例:Unix POSIX 打开未简化的物理字符串open("/srv/htdocs/.. /windows/win.ini")实验验证。ENOENT

此遗留问题已排除:Unix/Linux staticfile;Cygwin(相同的剥离逻辑,POSIX 打开);1.4.85 %5C parseopt;CVE-2018-19052 alias;CVE-2014-2324 Host。非 RCE。非写入。

我是如何发现的

我固定了标签 lighttpd-1.4.85。进行了二十次排查。默认 Unix/Linux staticfile、FastCGI、代理、TLS、认证、HTTP/2、alias/rewrite:在此标准下均无发现。1.4.81-1.4.85 的解析器浪潮已修复了 trailers、CGI 头部冲突以及无效的后端 Content-Length。

buffer_path_simplify 仅在 walk[2] == '/' 时折叠 ../。http_response_prepare_physical(src/response.c 334-360)中的 WIN32 剥离针对的是整个路径的尾部。_wstati64 / _wopen(src/fs_win32.c 24-77)传递 UTF-16 时不带 \\?\,因此 Win32 按组件剥离末尾空格,.. 变为 ..。物理拼接为 doc_root + rel_path,且没有基于 stat 之后的 basedir 检查。

已记录的错误转向:将 Unix ENOENT 视为“不是 bug”(它是对照组);称 Cygwin 为原生 Win32;声称 1.4.85 的 %5C 是本次遗留问题;将文件读取夸大为 RCE。作秀:一个反向 shell。判定依据是来自 document-root 父目录的 200 响应体。

实验环境

python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py

或

cd lab
./run.sh

该实验忠实复现了 buffer_urldecode_path、buffer_path_simplify(Win32 '\\' 映射)、response.c 尾部剥离,以及不带 \\?\ 的 _wstati64 这一组合。Unix POSIX open 作为阴性对照。Win32 解析的实现方式是:先按组件剥离尾部空格,再处理 . / ..,然后对解析后的路径执行 POSIX open。回环 HTTP 为 127.0.0.1:19400。

  1. GET /index.html -> 200 public-index,无见证。
  2. GET /../windows/win.ini -> 404,简化后为 /windows/win.ini。
  3. GET /..%20/windows/win.ini -> 解码为 /.. /windows/win.ini,简化保留了空格,Unix 返回 ENOENT,Win32 解析为 /srv/windows/win.ini,200 见证。
SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS

修复方案

在 simplify 之前,按路径组件去除末尾的空格和点,或者为 Win32 打开操作加上 \\?\ 前缀,并拒绝不位于 document-root 之下的物理路径。

参考资料

  • github.com/lighttpd/lighttpd1.4 标签 lighttpd-1.4.85(4852959e67ef51ea68084984400d3264b854c97d)
  • src/buffer.c · src/response.c · src/fs_win32.c
  • 附近已修补(并非此遗留问题):CVE-2025-12642 trailers · 1.4.85 %5C parseopt · CVE-2018-19052 alias · CVE-2014-2324 Host
  • CWE-22

许可证

GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。

下载工具