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