IIS: 对大量响应的 Content-Length 头部已损坏或被截断(printf 格式错误 + 缓冲区大小不正确)
作者: A13501350创建于 2026年8月27日更新于 2026年9月15日
标签Platform - IIS2.x
摘要
在 iis/mymodule.cpp 中,StringCchPrintfA 用于构建 Content-Length 头部值,但它存在两个缺陷,会破坏大响应的头部: 1. 错误的格式指定符用于 64 位值。 在响应路径中,ulTotalLength 是一个 ULONGLONG,但它使用 "%d" 来打印(预期是 32 位的 int)。printf 只读取低 32 位,因此在响应主体超过 ~2 GiB 时,生成的 Content-Length 会出错。另外两个调用位置也使用 "%d" 格式化 unsigned int length(应该是 %u)。 2. 目标大小偏差。 StringCchPrintfA 的 cchDest 参数被传递为 sizeof(szLength)/sizeof(CHAR) - 1 (= 20)。由于此参数必须包括空终止符,缓冲区只能容纳 19 位数。一个 64 位值可能有 20 个十进制位(例如 18446744073709551615),因此它会被默认截断/调用失败。
内容来源: owasp-modsecurity/ModSecurity