实战代码审计:TestLink登录流程分析
字数 1716 2025-08-03 16:50:25
TestLink登录流程安全分析与代码审计教学文档
0x00 环境搭建
安装步骤
- 克隆TestLink源代码:
git clone https://github.com/TestLinkOpenSourceTRMS/testlink-code
git branch -a
git checkout -b testlink_1_9_20_fixed origin/testlink_1_9_20_fixed
- 需要修改的关键配置路径:
- 日志目录 (
$tlCfg->log_path) - 上传目录 (
$g_repositoryPath)
- 推荐环境配置:
- Apache 2.4.39
- PHP 7.4.3 nts
- MySQL 5.7.26
- 启用LDAP扩展(非默认)
0x01 初始风险评估
1. 默认密码问题
- 安装后默认管理员凭据:
- 用户名:
admin - 密码:
admin
- 用户名:
- 登录后不强制要求更改密码
2. 默认重装漏洞
- 安装完成后不会自动删除
/install/文件夹 - 没有
.lock等文件记录安装状态 - 只要
/install/目录存在,攻击者就可以重新安装系统
0x02 基础架构分析
路由机制
- 系统不涉及路由转换,直接访问文件
- 参数处理方式:
- 使用
init_args()方法定义参数类型和范围 - 大多数参数定义为String类型,基本无有效校验
- 存在
urldecode()操作(151-152行),可能导致二次编码绕过
- 使用
0x03 安全漏洞分析
1. 开放重定向导致XSS
漏洞位置:login.php
漏洞原理:
redirect_url参数限制不当导致任意重定向- 重定向通过
<SCript>标签实现 - XSS过滤不当最终导致XSS攻击
2. LDAP注入漏洞
前置条件:
- 启用LDAP扩展
- 正确配置LDAP认证服务器
漏洞位置:lib/functions/ldap_api.php#161
攻击方式:
- 构造模糊查询(如
*)耗尽LDAP服务器资源 - 更改LDAP查询语句逻辑,间接控制查询结果为True/False
- Heavy Query攻击:将用户名设为
*,匹配当前cn下所有用户
影响:
- 服务器处理时间可能长达40多秒(取决于LDAP用户规模)
- 可能导致LDAP服务器资源耗尽
防御函数(未使用):
function ldap_escape_string($p_string) {
$t_find = array("\\", "*", "(", ")", "/", "\x00");
$t_replace = array('\5c', '\2a', '\28', '\29', '\2f', '\00');
$t_string = str_replace($t_find, $t_replace, $p_string);
return $t_string;
}
3. 第三方认证后的设计缺陷:硬编码密码
触发条件:
- 采用LDAP认证且配置开启
ldap_automatic_user_creation - 采用OAuth认证(需在
config.inc.php中配置)
漏洞位置:lib/functions/doAuthorize.php#L137
漏洞代码:
if($forceUserCreation) {
// ...其他代码...
$fake = md5('the quick brown fox jumps over the lazy dog'); // 默认密码!
$fake = md5(md5($fake));
$user->setPassword($fake);
$doLogin = ($user->writeToDB($db) == tl::OK);
}
用户创建逻辑:
- 当
$loginExists为False时(LDAP认证用户不存在于DB) - 满足以下任一条件:
- 是OAuth认证(
$isOauth) - LDAP认证且开启自动用户创建(
ldap_automatic_user_creation)
- 是OAuth认证(
类似案例:
- Apple Distinguished Educators Program漏洞(Sam Curry报告)
- 开发者试图在不同认证系统间同步用户数据时引入硬编码密码
0x04 防御建议
-
安装后操作:
- 立即更改默认管理员密码
- 删除
/install/目录或添加安装锁定文件
-
LDAP注入防御:
- 使用系统提供的
ldap_escape_string()函数过滤输入 - 限制LDAP查询范围和结果大小
- 使用系统提供的
-
密码策略:
- 移除硬编码密码逻辑
- 为自动创建的用户生成随机强密码
- 强制新用户在首次登录时更改密码
-
输入验证:
- 对所有输入参数实施严格类型检查
- 避免多次解码操作
-
重定向防护:
- 限制重定向URL为可信域名
- 实施严格的XSS过滤
0x05 审计经验总结
-
开源项目特点:
- 长期维护项目可能存在历史遗留问题
- 开发者可能忘记已实现的安全函数(如LDAP转义函数)
-
审计方法:
- 从安装过程开始分析安全水位
- 关注不同认证系统间的同步逻辑
- 检查所有输入处理流程
-
心态建议:
- 不要因文化差异(如UI设计)影响审计深度
- 坚持深入分析总能发现漏洞
- 从简单问题入手建立信心