nhttpd 从目录穿越到远程代码执行漏洞分析(CVE-2019-16278)
字数 1393 2025-08-26 22:11:34

nhttpd 目录穿越到远程代码执行漏洞分析 (CVE-2019-16278)

漏洞概述

nhttpd(也称为Nostromo Web服务器)是由Marcus Glocker设计的开源Web服务器。在1.9.6及之前版本中存在一个严重的路径穿越漏洞(CVE-2019-16278),攻击者可利用该漏洞访问Web服务器路径之外的文件,并最终实现远程代码执行。

漏洞背景

nhttpd通过select(2)处理正常的并发连接,但为了提高效率(如列目录和CGI执行),它使用fork(2)来提高性能。该服务器在处理HTTP请求头时存在逻辑缺陷,导致攻击者可以绕过安全检测,实现目录穿越。

漏洞分析

目录穿越漏洞

漏洞存在于请求头处理流程中:

  1. 初始验证流程

    • 程序首先调用http_verify函数对每个header进行有效性验证
    • 验证通过后调用http_proc处理header
  2. 验证函数http_verify

    • 验证header是否可以被URL解码(http_decode_header_uri
    • 检查method是否为GET/POST/HEAD之一
    • 检查header中是否存在"/../"字符串(防止目录穿越)
    • 如果上述任何检查失败,返回相应错误状态码(400或501)
  3. 绕过验证的关键点

    • 虽然http_verify检查了"/../",但攻击者可以构造特殊payload如"/..\r/..\r/..\r/"
    • 该payload在验证阶段不会触发"/../"检测
    • 但在后续的strcutl函数处理时,\r字符被去除,最终变为/../../../,实现目录穿越
  4. strcutl函数处理缺陷

    • 该函数本意是通过\n\r\n切分header字符串
    • 在处理Windows换行符\r\n时,会跳过\r字符
    • 但开发者没有考虑攻击者构造的\r后不跟\n的情况

远程代码执行(RCE)

http_proc方法中存在execve函数调用:

execve(rh->rq_filef, argv, envp);

通过目录穿越,攻击者可以:

  1. 控制rh->rq_filef参数
  2. 指定Web服务目录之外的可执行文件(如/../../../../bin/sh
  3. 实现任意命令执行

漏洞修复

官方修复方案改进了strcutl函数:

  1. 不仅判断当前字符是\r,还判断\r后一位字符是否是\n
  2. 只有\r\n这样的Windows换行符出现时,\r才会被去除
  3. 修复后:
    • 原payload/\r../..\r/解析后仍为/\r../..\r/
    • payload/\r\n../..\r\n/处理后变为/,无法实现目录穿越

漏洞利用

攻击者可构造如下恶意请求:

GET /..%0d/..%0d/..%0d/bin/sh HTTP/1.1
Host: target

其中%0d\r的URL编码形式,经过服务器处理后变为/../../../bin/sh,实现命令执行。

影响版本

nhttpd 1.9.6及之前版本

防护建议

  1. 升级到nhttpd最新版本
  2. 对Web服务器进行严格的目录权限控制
  3. 部署WAF等防护设备,过滤包含特殊字符的请求

总结

该漏洞展示了HTTP请求处理中边界条件检查的重要性。开发者最初考虑了正常的换行符处理,但没有考虑到攻击者可能构造的特殊情况。这种类型的漏洞在Web服务器中尤为危险,因为它可以从简单的目录遍历升级为完全的远程代码执行。

nhttpd 目录穿越到远程代码执行漏洞分析 (CVE-2019-16278) 漏洞概述 nhttpd(也称为Nostromo Web服务器)是由Marcus Glocker设计的开源Web服务器。在1.9.6及之前版本中存在一个严重的路径穿越漏洞(CVE-2019-16278),攻击者可利用该漏洞访问Web服务器路径之外的文件,并最终实现远程代码执行。 漏洞背景 nhttpd通过select(2)处理正常的并发连接,但为了提高效率(如列目录和CGI执行),它使用fork(2)来提高性能。该服务器在处理HTTP请求头时存在逻辑缺陷,导致攻击者可以绕过安全检测,实现目录穿越。 漏洞分析 目录穿越漏洞 漏洞存在于请求头处理流程中: 初始验证流程 : 程序首先调用 http_verify 函数对每个header进行有效性验证 验证通过后调用 http_proc 处理header 验证函数 http_verify : 验证header是否可以被URL解码( http_decode_header_uri ) 检查method是否为GET/POST/HEAD之一 检查header中是否存在 "/../" 字符串(防止目录穿越) 如果上述任何检查失败,返回相应错误状态码(400或501) 绕过验证的关键点 : 虽然 http_verify 检查了 "/../" ,但攻击者可以构造特殊payload如 "/..\r/..\r/..\r/" 该payload在验证阶段不会触发 "/../" 检测 但在后续的 strcutl 函数处理时, \r 字符被去除,最终变为 /../../../ ,实现目录穿越 strcutl 函数处理缺陷 : 该函数本意是通过 \n 或 \r\n 切分header字符串 在处理Windows换行符 \r\n 时,会跳过 \r 字符 但开发者没有考虑攻击者构造的 \r 后不跟 \n 的情况 远程代码执行(RCE) 在 http_proc 方法中存在 execve 函数调用: 通过目录穿越,攻击者可以: 控制 rh->rq_filef 参数 指定Web服务目录之外的可执行文件(如 /../../../../bin/sh ) 实现任意命令执行 漏洞修复 官方修复方案改进了 strcutl 函数: 不仅判断当前字符是 \r ,还判断 \r 后一位字符是否是 \n 只有 \r\n 这样的Windows换行符出现时, \r 才会被去除 修复后: 原payload /\r../..\r/ 解析后仍为 /\r../..\r/ payload /\r\n../..\r\n/ 处理后变为 / ,无法实现目录穿越 漏洞利用 攻击者可构造如下恶意请求: 其中 %0d 是 \r 的URL编码形式,经过服务器处理后变为 /../../../bin/sh ,实现命令执行。 影响版本 nhttpd 1.9.6及之前版本 防护建议 升级到nhttpd最新版本 对Web服务器进行严格的目录权限控制 部署WAF等防护设备,过滤包含特殊字符的请求 总结 该漏洞展示了HTTP请求处理中边界条件检查的重要性。开发者最初考虑了正常的换行符处理,但没有考虑到攻击者可能构造的特殊情况。这种类型的漏洞在Web服务器中尤为危险,因为它可以从简单的目录遍历升级为完全的远程代码执行。