实战代码审计:TestLink登录流程分析
字数 1716 2025-08-03 16:50:25

TestLink登录流程安全分析与代码审计教学文档

0x00 环境搭建

安装步骤

  1. 克隆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
  1. 需要修改的关键配置路径:
  • 日志目录 ($tlCfg->log_path)
  • 上传目录 ($g_repositoryPath)
  1. 推荐环境配置:
  • 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

攻击方式

  1. 构造模糊查询(如*)耗尽LDAP服务器资源
  2. 更改LDAP查询语句逻辑,间接控制查询结果为True/False
  3. 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. 第三方认证后的设计缺陷:硬编码密码

触发条件

  1. 采用LDAP认证且配置开启ldap_automatic_user_creation
  2. 采用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);
}

用户创建逻辑

  1. $loginExists为False时(LDAP认证用户不存在于DB)
  2. 满足以下任一条件:
    • 是OAuth认证($isOauth
    • LDAP认证且开启自动用户创建(ldap_automatic_user_creation

类似案例

  • Apple Distinguished Educators Program漏洞(Sam Curry报告)
  • 开发者试图在不同认证系统间同步用户数据时引入硬编码密码

0x04 防御建议

  1. 安装后操作

    • 立即更改默认管理员密码
    • 删除/install/目录或添加安装锁定文件
  2. LDAP注入防御

    • 使用系统提供的ldap_escape_string()函数过滤输入
    • 限制LDAP查询范围和结果大小
  3. 密码策略

    • 移除硬编码密码逻辑
    • 为自动创建的用户生成随机强密码
    • 强制新用户在首次登录时更改密码
  4. 输入验证

    • 对所有输入参数实施严格类型检查
    • 避免多次解码操作
  5. 重定向防护

    • 限制重定向URL为可信域名
    • 实施严格的XSS过滤

0x05 审计经验总结

  1. 开源项目特点

    • 长期维护项目可能存在历史遗留问题
    • 开发者可能忘记已实现的安全函数(如LDAP转义函数)
  2. 审计方法

    • 从安装过程开始分析安全水位
    • 关注不同认证系统间的同步逻辑
    • 检查所有输入处理流程
  3. 心态建议

    • 不要因文化差异(如UI设计)影响审计深度
    • 坚持深入分析总能发现漏洞
    • 从简单问题入手建立信心

0x06 参考资料

  1. LDAP Injection Prevention Cheat Sheet - OWASP
  2. We Hacked Apple for 3 Months... - Sam Curry
  3. LDAP注入攻击与防御 - 腾讯云开发者社区
TestLink登录流程安全分析与代码审计教学文档 0x00 环境搭建 安装步骤 克隆TestLink源代码: 需要修改的关键配置路径: 日志目录 ( $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服务器资源耗尽 防御函数(未使用) : 3. 第三方认证后的设计缺陷:硬编码密码 触发条件 : 采用LDAP认证且配置开启 ldap_automatic_user_creation 采用OAuth认证(需在 config.inc.php 中配置) 漏洞位置 : lib/functions/doAuthorize.php#L137 漏洞代码 : 用户创建逻辑 : 当 $loginExists 为False时(LDAP认证用户不存在于DB) 满足以下任一条件: 是OAuth认证( $isOauth ) LDAP认证且开启自动用户创建( ldap_automatic_user_creation ) 类似案例 : Apple Distinguished Educators Program漏洞(Sam Curry报告) 开发者试图在不同认证系统间同步用户数据时引入硬编码密码 0x04 防御建议 安装后操作 : 立即更改默认管理员密码 删除 /install/ 目录或添加安装锁定文件 LDAP注入防御 : 使用系统提供的 ldap_escape_string() 函数过滤输入 限制LDAP查询范围和结果大小 密码策略 : 移除硬编码密码逻辑 为自动创建的用户生成随机强密码 强制新用户在首次登录时更改密码 输入验证 : 对所有输入参数实施严格类型检查 避免多次解码操作 重定向防护 : 限制重定向URL为可信域名 实施严格的XSS过滤 0x05 审计经验总结 开源项目特点 : 长期维护项目可能存在历史遗留问题 开发者可能忘记已实现的安全函数(如LDAP转义函数) 审计方法 : 从安装过程开始分析安全水位 关注不同认证系统间的同步逻辑 检查所有输入处理流程 心态建议 : 不要因文化差异(如UI设计)影响审计深度 坚持深入分析总能发现漏洞 从简单问题入手建立信心 0x06 参考资料 LDAP Injection Prevention Cheat Sheet - OWASP We Hacked Apple for 3 Months... - Sam Curry LDAP注入攻击与防御 - 腾讯云开发者社区