CTF实战从.git泄露到代码审计的深度攻防指南当你用GitHack成功获取目标网站的源代码时这场CTF竞赛才真正开始。源代码就像一座金矿但需要正确的工具和技术才能挖掘出其中的漏洞宝藏。本文将带你从零开始系统化掌握代码审计的核心方法论。1. 源代码快速定位与敏感信息收集拿到源代码后的第一件事不是盲目搜索而是建立整体认知。一个典型的Web应用通常包含以下目录结构├── config/ # 配置文件 ├── controllers/ # 业务逻辑 ├── models/ # 数据库操作 ├── static/ # 静态资源 ├── views/ # 前端模板 ├── vendor/ # 第三方库 └── index.php # 入口文件敏感信息收集四步法全局搜索硬编码凭证grep -r password . --include*.php --include*.env grep -r secret . --include*.yml --include*.json检查配置文件config/database.php- 数据库连接信息.env- 环境变量常含敏感数据application.yml- Spring应用配置扫描注释中的敏感信息grep -r TODO . --include*.js --include*.py检查版本控制历史git log -p # 查看历史提交记录 git reflog # 检查本地操作记录注意真实环境中发现的任何凭证都应按照道德准则处理CTF中则可用于进一步利用2. 数据库操作漏洞深度挖掘数据库交互是Web应用中最常见的漏洞来源之一。审计时需要重点关注以下模式SQL注入热点函数语言危险函数安全替代方案PHPmysql_query()PDO预处理JavaStatement.execute()PreparedStatementPythoncursor.execute()参数化查询典型漏洞代码示例// 危险写法 $query SELECT * FROM users WHERE id . $_GET[id]; $result mysql_query($query); // 安全写法 $stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$_GET[id]]);审计技巧搜索所有SQL拼接操作,.,format()等检查ORM配置是否开启原生查询验证输入过滤是否在服务端完成3. 文件操作类漏洞全面排查文件上传和包含漏洞是CTF中的高频考点审计时需要特别关注高危函数列表漏洞类型PHP函数Java类Python模块文件包含include()FileInputStreamopen()文件上传move_uploaded_file()MultipartFileshutil.copy()路径遍历file_get_contents()Path.normalize()os.path.join()实战检测方法上传功能白名单验证检查# 不安全示例 - 仅检查Content-Type if file.content_type image/jpeg: file.save(/uploads/ filename) # 安全示例 - 双重验证 allowed_ext [jpg, png] ext filename.split(.)[-1].lower() if ext in allowed_ext and file.content_type.startswith(image/): secure_filename generate_random_name() . ext file.save(/uploads/ secure_filename)路径遍历漏洞检测grep -r file_get_contents . --include*.php | grep \$_4. 业务逻辑漏洞的高级审计技巧比起技术漏洞业务逻辑缺陷往往更难发现但同样危险。重点关注常见业务逻辑漏洞模式顺序绕过未验证步骤顺序的注册/支付流程可跳过验证步骤的直接访问权限提升// 危险示例 - 仅前端验证角色 if (user.getRole() admin) { showAdminPanel(); } // 安全示例 - 后端双重验证 PreAuthorize(hasRole(ADMIN)) GetMapping(/admin) public String adminPanel() { return admin; }竞态条件# 余额检查与扣款不同步 if balance amount: time.sleep(1) # 攻击者可在此间隙发起并发请求 balance - amount审计工具推荐Semgrep静态分析工具预置多种漏洞规则CodeQL可编写自定义查询的高级分析工具SonarQube企业级代码质量检测平台5. 自动化辅助与手工验证结合高效审计需要工具与人工的完美配合自动化扫描# 使用工具进行初步筛查 semgrep --configp/security-audit .关键点手工验证验证所有输入点是否经过过滤检查权限验证是否贯穿整个调用链确认敏感操作是否有日志记录建立测试用例# 示例测试SQL注入的POC def test_sqli(url): payload 1 OR 11 -- response requests.get(f{url}?id{payload}) assert error in your SQL syntax not in response.text在最近的一次CTF比赛中我通过组合使用grep搜索和手工验证在看似安全的代码中发现了通过时间差触发的盲注漏洞。关键是要保持怀疑一切的态度对每个数据流都追问如果输入异常值会发生什么