前言
概述
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/
第一行启用了Apache的URL重写引擎
第二行将以“/here/”开头的URL重定向到“http://example.com:8080/elsewhere,并将原始URL的路径部分作为查询参数传递到新的地址中(在“?”后面)。[P]标志表示使用Apache的反向代理模块进行代理转发。
第三行将在代理服务器上的URL路径“/here/”替换为“http://example.com:8080/ ”,并修改HTTP响应头中的任何相关URL路径
影响版本
2.4.0 <= Apache HTTP Server <= 2.4.55
环境搭建
直接用docker复现,相关地址https://www.yuque.com/dat0u/ctf/di8uiqg78m5kr32i
操作系统使用 WSL Ubuntu 20.04
安装依赖
包括我们编译软件所需要的build-essential,以及调试C程序所需要的gdb,以及Apache所依赖的几个第三方库
sudo apt-get install build-essential gdb
sudo apt-get install --no-install-recommends libapr1-dev libaprutil1-dev libpcre3-dev
下载源码
下载apache2.4.55版本源码,Index of /dist/httpd (apache.org)
下载apr-1.7.4(找不到1.7.2)和apr-util-1.6.3的源码, Index of /apr (apache.org)
解压
tar -xvzf httpd-2.4.55.tar.gz
tar -xvzf apr-1.7.4.tar.gz
tar -xvzf apr-util-1.6.3.tar.gz
编译安装
因为wsl上面没找到./config文件夹导致卡在这一步了,回头研究下再看看,好像也可以直接用小皮修改下配置来复现就行(
漏洞分析
利用方式
读取conf/httpd.conf
信息以得知mod_proxy中RewriteRule
和ProxyPassReverse
的配置
Apache的httpd.conf通常位于
/etc/httpd/conf/httpd.conf
,还有可能出现在/usr/local/apache2/conf/httpd.conf
然后根据RewriteRule相应的匹配语句进行CRLF注入
payload例:
/hello/abc%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aUser-Agent:%20curl/7.68.0%0d%0a%0d%0a' + hexdata + b'GET%20/flag.txt
实战
可参考