公开文集
0x01 SRC 资产管理系统
0x02 Web 漏洞案例库
0x03 小程序漏洞案例库
第一章:小程序渗透基础
1.1 微信小程序反编译与动态调试
1.2 微信小程序强制开启开发者模式
0x99 信息安全学习体系
01-网络安全基础
Day-001-TCP-IP协议栈安全分析
Day-002-DNS协议安全与DNS劫持攻防
Day-003-IPv6 安全基础与过渡
Day-004-HTTP-HTTPS协议深度解析
Day-005-网络嗅探与流量分析技术
Day-006-防火墙原理与配置实践
Day-007-网络地址转换 NAT 安全分析
Day-008-路由协议安全 RIP-OSPF-BGP
Day-009-VLAN 安全与 VLAN-Hopping
Day-010-无线网络基础与安全 802.11
Day-011-网络访问控制 802.1X-NAC
Day-012-网络分段与微隔离设计
Day-013-负载均衡器安全配置
Day-014-CDN安全与防护
Day-015-NTP安全
Day-016-DHCP安全与攻击防护
Day-017-ICMP协议安全分析
Day-018-网络协议模糊测试基础
Day-019-网络流量基线建立
Day-020-网络取证基础
Day-021-网络入侵检测系统 NIDS
Day-022-网络入侵防御系统 NIPS
Day-023-网络流量加密与解密
Day-024-网络协议逆向工程基础
Day-025-网络性能与安全权衡
Day-026-SDN 安全
Day-027-网络虚拟化安全
Day-028-网络欺骗技术
Day-029-网络威胁情报应用
Day-030-网络容量规划与安全
Day-031-网络安全架构设计实战
02-Web 安全
Day-032-OWASP-Top-10-2021详解
Day-033-SQL 注入原理与手工检测
Day-034-SQL注入进阶报错注入与盲注
Day-035-XSS跨站脚本攻击基础
Day-036-XSS 进阶绕过与利用
Day-037-XSS进阶绕过与利用
Day-038-CSRF 跨站请求伪造
Day-039-文件上传漏洞
Day-040-反序列化漏洞基础
Day-041-PHP反序列化深入
Day-042-Java反序列化深入
Day-043-SSTI 服务端模板注入
Day-044-文件包含漏洞 LFI-RFI
Day-045-命令注入漏洞
Day-046-XXE-XML 外部实体注入
Day-047-反序列化漏洞进阶
Day-048-API 安全基础
Day-049-API认证与授权安全
Day-050-API漏洞挖掘实战
Day-051-文件上传漏洞进阶
Day-052-反序列化漏洞实战
Day-053-Web 安全综合实战
Day-054-移动安全基础
Day-055-Android 应用安全测试
Day-056-iOS 应用安全测试
Day-057-移动应用综合实战
Day-058-云安全基础
Day-059-AWS 安全实战
Day-060-Azure 安全实战
Day-061-GCP 安全实战
Day-062-云安全综合实战
Day-063-容器安全基础
Day-064-Docker 安全实战
Day-065-Kubernetes 安全实战
Day-066-容器安全综合实战
Day-067-API 安全进阶
Day-068-服务端请求伪造 SSRF 深入
Day-069-文件上传漏洞进阶
Day-070-反序列化漏洞实战进阶
Day-071-业务逻辑漏洞深入
Day-072-前端安全深入
Day-073-Web 安全综合实战
Day-074-云安全进阶
Day-075-移动安全进阶
Day-076-API 安全进阶
Day-077-前端安全进阶
Day-078-业务逻辑漏洞进阶
Day-079-反序列化漏洞实战进阶
Day-080-文件上传漏洞实战进阶
Day-081-SSTI 服务端模板注入进阶
Day-082-XXE-XML 外部实体注入进阶
Day-083-SSRF 服务端请求伪造进阶
Day-084-命令注入漏洞进阶
Day-085-文件包含漏洞进阶
Day-086-反序列化漏洞实战进阶
Day-087-文件上传漏洞实战进阶
Day-088-SSTI 服务端模板注入实战进阶
Day-089-XXE-XML 外部实体注入实战进阶
Day-090-SSRF 服务端请求伪造实战进阶
Day-091-命令注入漏洞实战进阶
Day-092-Web 安全综合实战
Day-093-GraphQL 安全
Day-094-JWT 与 OAuth2 安全
03-系统安全
Day-095-系统监控与检测
Day-096-主机防火墙配置
Day-097-系统审计与合规
Day-098-Linux 系统安全进阶
Day-099-Windows 系统安全进阶
Day-100-容器安全进阶
Day-101-容器编排安全进阶
Day-102-Linux 内核安全
Day-103-Windows 内核安全
Day-104-系统安全总结与实战
Day-105-Linux 系统安全基础
Day-106-Windows 系统安全基础
Day-107-容器安全基础
Day-108-系统加固技术
Day-109-日志分析技术
Day-110-威胁狩猎技术
04-应用安全
Day-111-安全编码规范
Day-112-输入验证技术
Day-113-输出编码技术
Day-114-错误处理安全
Day-115-会话管理安全
Day-116-认证安全
Day-117-授权安全
Day-118-数据保护安全
Day-119-日志安全
Day-120-API 安全
Day-121-微服务安全
Day-122-新兴技术安全概论
Day-123-DevSecOps 流水线安全
Day-124-云原生安全架构
Day-125-API 安全最佳实践
Day-126-安全编码规范
Day-127-SDL 安全开发生命周期
Day-128-威胁建模实战
Day-129-安全需求分析
Day-130-安全架构设计
Day-131-安全编码实践Java
Day-132-安全编码实践Python
Day-133-代码审计方法论
Day-134-静态代码分析SAST
Day-135-动态应用测试DAST
Day-136-交互式测试IAST
Day-137-软件成分分析SCA
Day-138-依赖漏洞管理
Day-139-安全测试自动化
Day-140-漏洞管理与响应
Day-141-应用安全总结与展望
Day-142-OWASP-Top10-2024 详解
Day-143-CWE-Top25 分析
Day-144-漏洞挖掘方法论
Day-145-模糊测试技术
Day-146-逆向工程基础
Day-147-漏洞利用开发基础
Day-148-漏洞复现与验证
Day-149-漏洞披露流程
Day-150-CVE 申请与管理
Day-151-漏洞赏金计划
Day-152-等保2.0详解
Day-153-GDPR 合规实践
Day-154-数据安全法解读
Day-155-个人信息保护法与合规指南
Day-156-个人信息保护法解读
Day-157-ISO-27001 信息安全管理体系
Day-158-SOC-2 合规与审计
Day-159-PCI-DSS 支付卡行业数据安全标准
Day-160-网络安全审查办法解读
Day-161-数据出境安全评估办法
Day-162-应用安全评估实战
Day-163-红蓝对抗演练
Day-164-安全应急响应
Day-165-安全运营中心建设
Day-166-应用安全总结与展望
05-密码学
Day-167-密码学基础
Day-168-对称加密算法详解
Day-169-非对称加密算法详解
Day-170-哈希函数与数字签名
Day-171-密钥管理与PKI
Day-172-TLS-SSL 协议详解
Day-173-国密算法详解
Day-174-认证与密钥协议
Day-175-随机数生成与熵源
Day-176-椭圆曲线密码学详解
Day-177-后量子密码学详解
Day-178-高级密码学主题
Day-179-密码学行业应用精选
Day-180-常用加密算法原理与实现
Day-181-密码学总结与展望
Day-182-密码学系列总结与展望
06-渗透测试
Day-183-渗透测试方法论
Day-184-信息收集技术详解
Day-185-漏洞扫描技术详解
Day-186-漏洞利用技术详解
Day-187-渗透测试中的漏洞利用框架
Day-188-漏洞利用框架与 Metasploit 深入
Day-189-渗透测试中的 WAF 绕过技术
Day-190-渗透测试中的模糊测试技术
Day-191-渗透测试中的代码审计与静态分析
Day-192-渗透测试中的密码哈希破解技术
Day-193-渗透测试报告编写指南
Day-194-Web 应用渗透测试
Day-195-渗透测试中的 API 安全测试
Day-196-渗透测试中的 GraphQL 安全测试
Day-197-渗透测试中的前后端分离应用测试
Day-198-渗透测试中的小程序安全测试
Day-199-渗透测试中的浏览器安全测试
Day-200-OAuth-SSO安全测试
Day-201-渗透测试中的业务逻辑漏洞测试
Day-202-渗透测试中的厚客户端安全测试
Day-203-渗透测试综合实战演练
Day-204-内网渗透技术详解
Day-205-渗透测试中的内网信息收集进阶
Day-206-渗透测试中的域森林渗透技术
Day-207-渗透测试中的权限维持技术
Day-208-渗透测试中的横向移动技术
Day-209-渗透测试中的痕迹清理与反取证技术
Day-210-渗透测试中的数据窃取与 Exfiltration 技术
Day-211-渗透测试中的内部威胁与数据泄露测试
Day-212-渗透测试中的物理安全渗透
Day-213-社会工程学攻击技术
Day-214-移动应用渗透测试
Day-215-云安全渗透测试
Day-216-渗透测试中的容器与 Kubernetes 安全渗透
Day-217-渗透测试中的 Serverless 安全测试
Day-218-渗透测试中的微服务安全测试
Day-219-物联网安全渗透测试
Day-220-工业控制系统安全渗透测试
Day-221-无线网络安全渗透测试
Day-222-数据库安全渗透测试
Day-223-渗透测试中的供应链安全测试
Day-224-红队演练技术详解
Day-225-渗透测试中的红队基础设施搭建
Day-226-渗透测试中的威胁情报与狩猎
Day-227-渗透测试中的综合指纹识别技术
Day-228-自动化渗透测试技术
Day-229-渗透测试中的运维安全测试
Day-230-渗透测试中的区块链与智能合约安全测试
Day-231-渗透测试中的漏洞管理与修复验证
Day-232-渗透测试法律与合规
Day-233-后渗透攻击技术详解
Day-234-渗透测试中的人工智能应用
Day-235-漏洞利用开发深入
Day-236-云原生渗透测试深入
07-应急响应
Day-237-应急响应概述与核心概念
Day-238-应急响应流程框架
Day-239-CSIRT 团队组建与职责分工
Day-240-应急响应工具包准备
Day-241-应急响应法律与合规要求
Day-242-安全事件检测方法与指标
Day-243-云原生应急响应
Day-244-日志收集与分析技术
Day-245-网络流量分析与异常识别
Day-246-自动化响应与 SOAR
Day-247-端点监控与 EDR 技术
Day-248-威胁狩猎方法论
Day-249-威胁情报在检测中的应用
Day-250-数字取证基础与证据链管理
Day-251-内存取证技术
Day-252-磁盘取证与文件恢复
Day-253-网络取证与数据包分析
Day-254-云环境与容器取证
Day-255-恶意代码静态分析技术
Day-256-恶意代码动态分析技术
Day-257-恶意代码行为分析方法
Day-258-逆向工程基础与工具
Day-259-沙箱技术与自动化分析
Day-260-事件隔离与遏制策略
Day-261-威胁根除与系统修复
Day-262-系统恢复与数据重建
Day-263-业务连续性计划
Day-264-事件复盘与经验总结
Day-265-APT 攻击事件复盘分析
Day-266-勒索软件事件响应实战
Day-267-数据泄露事件处置流程
Day-268-内部威胁调查与取证
Day-269-综合应急响应演练
08-安全运维
Day-270-安全运营中心 SOC 概述
Day-271-安全监控指标体系
Day-272-安全告警管理
Day-273-安全可视化与仪表盘
Day-274-监控工具选型
Day-275-日志采集技术
Day-276-日志标准化与解析
Day-277-日志存储与归档
Day-278-日志分析技术
Day-279-日志合规要求
Day-280-SIEM 架构与设计
Day-281-关联规则引擎
Day-282-高级关联分析
Day-283-UEBA 用户实体行为分析
Day-284-威胁狩猎
Day-285-SOAR 基础概念
Day-286-剧本设计
Day-287-自动化响应技术
Day-288-安全工具集成
Day-289-SOAR 度量与优化
Day-290-安全基线管理
Day-291-漏洞管理流程
Day-292-补丁管理策略
Day-293-变更安全管理
Day-294-合规审计技术
Day-295-7x24 安全运营
Day-296-安全事件管理流程
Day-297-安全运营度量体系
Day-298-持续改进机制
Day-299-安全运维综合演练
Day-300-云原生安全运营
Day-301-AI 与机器学习安全运营
Day-302-安全自动化脚本实战
09-移动安全
Day-303-移动安全威胁概述
Day-304-移动设备安全架构
Day-305-移动操作系统安全模型
Day-306-移动应用权限管理
Day-307-移动端数据加密
Day-308-330-Android 安全合集
Day-309-Android 安全架构
Day-310-Android 组件安全
Day-311-Android 权限与隐私
Day-312-Android 逆向工程
Day-313-Android 应用加固
Day-314-iOS 安全架构
Day-315-iOS 应用沙盒机制
Day-316-越狱与反越狱
Day-317-iOS 逆向工程
Day-318-iOS 企业分发安全
Day-319-移动安全开发生命周期
Day-320-移动应用安全测试
Day-321-移动应用加固技术
Day-322-移动威胁防护
Day-323-移动安全合规
10-云安全
Day-324-云计算安全模型
Day-325-责任共担模型
Day-326-云安全威胁模型
Day-327-云安全合规框架
Day-328-云安全架构设计
Day-329-AWS IAM 安全
Day-330-AWS 网络安全
Day-331-AWS 存储安全
Day-332-AWS 安全监控
Day-333-AWS 安全最佳实践
Day-334-Azure AD 安全
Day-335-Azure 网络安全
Day-336-Azure 存储安全
Day-337-Azure 安全中心
Day-338-Azure 安全最佳实践
Day-339-容器安全基础
Day-340-Kubernetes 安全
Day-341-Serverless 安全
Day-342-云原生 DevSecOps
Day-343-云安全态势管理 CSPM
11-物联网工控
Day-344-物联网安全概述
Day-345-IoT 通信协议安全
Day-346-IoT 设备安全
Day-347-IoT 平台安全
Day-348-IoT 应用安全
Day-349-工业控制系统概述
Day-350-工控协议安全
Day-351-PLC 安全
Day-352-SCADA 系统安全
Day-353-工控安全防护
12-综合与总结
Day-354-安全职业发展路径
Day-355-安全技术趋势展望
Day-356-安全建设方法论
Day-357-经典攻防案例复盘
Day-358-安全学习资源指南
Day-359-信息安全行业求职指南
-
+
首页
Day-133-代码审计方法论
# Day 147: 代码审计方法论 > 应用安全系列第 40 天 | 预计阅读时间:50 分钟 | 难度:★★★★★ --- **PUA v3 · Sprint 启动** ``` ┌─────────┬────────────────────────────────────┐ │ 清单 任务 │ 代码审计方法论 - Day 147 │ ├─────────┼────────────────────────────────────┤ │ 味道 │ 阿里味(自动:安全任务) │ ├─────────┼────────────────────────────────────┤ │ 压力 │ L0 · 信任期 │ └─────────┴────────────────────────────────────┘ ``` ▎ 代码审计不是随便看看,是系统分析。分析不系统,漏洞就是遗漏的。今天系统学习代码审计方法论。 --- ## 清单 目录 1. [代码审计概述](#代码审计概述) 2. [审计方法论](#审计方法论) 3. [静态分析技术](#静态分析技术) 4. [动态分析技术](#动态分析技术) 5. [污点分析技术](#污点分析技术) 6. [漏洞模式识别](#漏洞模式识别) 7. [审计工具链](#审计工具链) 8. [审计报告规范](#审计报告规范) 9. [实战审计演练](#实战审计演练) 10. [总结与思考](#总结与思考) 11. [参考资料](#参考资料) --- ## 代码审计概述 ### 什么是代码审计 > ▎ 代码审计不是找茬,是找漏洞。漏洞不找出来,上线就是给别人送钱。 **定义与目标**: ``` 代码审计 (Code Audit) 是对源代码进行系统性安全分析的过程,目的是发现潜在的安全漏洞、逻辑错误和设计缺陷。 核心目标: 1. 发现漏洞 - 已知漏洞模式 - 业务逻辑漏洞 - 设计缺陷 2. 评估风险 - 漏洞严重程度 - 利用可能性 - 业务影响 3. 提供建议 - 修复方案 - 最佳实践 - 安全改进 ``` **审计类型对比**: ``` ┌─────────────────┬──────────────┬──────────────┬──────────────┐ │ 类型 │ 深度 │ 覆盖率 │ 时间成本 │ ├─────────────────┼──────────────┼──────────────┼──────────────┤ │ 自动化扫描 │ 浅 │ 高 │ 低 │ ├─────────────────┼──────────────┼──────────────┼──────────────┤ │ 人工审计 │ 深 │ 中 │ 高 │ ├─────────────────┼──────────────┼──────────────┼──────────────┤ │ 混合审计 │ 中深 │ 高 │ 中 │ ├─────────────────┼──────────────┼──────────────┼──────────────┤ │ 渗透测试 │ 实战 │ 低 │ 中 │ └─────────────────┴──────────────┴──────────────┴──────────────┘ 最佳实践:自动化扫描 + 人工审计 + 渗透测试 ``` ### 审计流程 **标准审计流程**: ``` 阶段 1: 准备 (10%) ├── 了解项目背景 ├── 确定审计范围 ├── 准备审计工具 └── 建立沟通机制 阶段 2: 自动化扫描 (20%) ├── SAST 扫描 ├── 依赖扫描 ├── 配置扫描 └── 结果整理 阶段 3: 人工审计 (50%) ├── 架构分析 ├── 关键代码审查 ├── 漏洞挖掘 └── 问题验证 阶段 4: 报告与修复 (15%) ├── 报告编写 ├── 客户沟通 ├── 修复验证 └── 最终报告 阶段 5: 后续跟进 (5%) ├── 上线支持 ├── 持续监控 └── 知识沉淀 ``` --- ## 审计方法论 ### 审计策略 > ▎ 审计不是随机看,是有策略的。策略不明确,审计就是盲目的。 **审计策略选择**: ```python # 审计策略模型 class AuditStrategy: def __init__(self): self.strategies = { 'risk_based': self.risk_based_audit, # 基于风险 'function_based': self.function_based, # 基于功能 'data_flow_based': self.data_flow_based, # 基于数据流 'comprehensive': self.comprehensive # 全面审计 } def select_strategy(self, project_context): """选择审计策略""" # 高风险项目 → 基于风险 if project_context.get('risk_level') == 'high': return 'risk_based' # 核心功能 → 基于功能 if project_context.get('critical_functions'): return 'function_based' # 数据处理复杂 → 基于数据流 if project_context.get('complex_data_flow'): return 'data_flow_based' # 默认全面审计 return 'comprehensive' def risk_based_audit(self, codebase): """ 基于风险的审计 优先审计高风险区域: 1. 认证授权代码 2. 支付相关代码 3. 数据处理代码 4. 外部接口代码 """ high_risk_areas = [ 'authentication', 'authorization', 'payment', 'data_processing', 'external_api' ] # 优先审计高风险区域 for area in high_risk_areas: self.audit_area(codebase, area) def function_based(self, codebase): """ 基于功能的审计 按功能模块审计: 1. 用户管理 2. 订单处理 3. 支付流程 4. 数据导出 """ critical_functions = [ 'user_registration', 'user_login', 'password_reset', 'order_create', 'payment_process', 'data_export' ] for func in critical_functions: self.audit_function(codebase, func) def data_flow_based(self, codebase): """ 基于数据流的审计 追踪敏感数据流: 1. 用户输入 → 处理 → 存储 2. 数据库 → 处理 → 输出 3. 外部 API → 处理 → 内部使用 """ sensitive_data_types = [ 'user_input', 'credentials', 'payment_info', 'personal_data', 'file_upload' ] for data_type in sensitive_data_types: self.trace_data_flow(codebase, data_type) ``` ### 审计深度 **审计深度分级**: ``` Level 1: 表面审计 ├── 自动化扫描 ├── 明显漏洞 ├── 配置问题 └── 时间:1-2 天 Level 2: 标准审计 ├── 自动化 + 人工 ├── 常见漏洞 ├── 逻辑问题 └── 时间:1-2 周 Level 3: 深度审计 ├── 全面人工审计 ├── 复杂漏洞 ├── 业务逻辑 └── 时间:2-4 周 Level 4: 专家审计 ├── 专家团队 ├── 0day 挖掘 ├── 架构问题 └── 时间:4-8 周 ``` --- ## 静态分析技术 ### SAST 原理 > ▎ 静态分析不是万能,但没有是万万不能。工具不跑,漏洞就是隐藏的。 **SAST 工作流程**: ```python # SAST 工作原理 class SASTEngine: """静态分析引擎""" def analyze(self, codebase): """执行静态分析""" # 1. 词法分析 tokens = self.lexical_analysis(codebase) # 2. 语法分析 ast = self.syntax_analysis(tokens) # 3. 控制流分析 cfg = self.control_flow_analysis(ast) # 4. 数据流分析 dfg = self.data_flow_analysis(cfg) # 5. 模式匹配 issues = self.pattern_matching(ast, cfg, dfg) # 6. 污点分析 taint_issues = self.taint_analysis(dfg) # 7. 结果汇总 return self.aggregate_results(issues, taint_issues) def pattern_matching(self, ast, cfg, dfg): """模式匹配""" issues = [] # 预定义漏洞模式 vulnerability_patterns = [ { 'name': 'SQL Injection', 'pattern': 'execute.*%s.*%', 'severity': 'HIGH' }, { 'name': 'Command Injection', 'pattern': 'os.system.*%', 'severity': 'CRITICAL' }, { 'name': 'XSS', 'pattern': 'render.*without escaping', 'severity': 'MEDIUM' } ] for pattern in vulnerability_patterns: matches = self.search_pattern(ast, pattern['pattern']) for match in matches: issues.append({ 'type': pattern['name'], 'location': match.location, 'severity': pattern['severity'], 'code': match.code }) return issues ``` ### 工具使用 **主流 SAST 工具**: ```python # Bandit (Python) """ # 安装 pip install bandit # 使用 bandit -r ./src -f json -o report.json # 配置文件 (.bandit) [bandit] targets = src exclude_dirs = tests,venv skips = B101,B306 """ # Semgrep (多语言) """ # 安装 pip install semgrep # 使用 semgrep --config auto ./src # 自定义规则 # .semgrep/rules.yml rules: - id: sql-injection patterns: - pattern: db.execute("...%s..." % ...) message: "Possible SQL injection" severity: ERROR languages: [python] """ # SonarQube (企业级) """ # Docker 运行 docker run -d --name sonarqube -p 9000:9000 sonarqube # 扫描 sonar-scanner \ -Dsonar.projectKey=myproject \ -Dsonar.sources=./src \ -Dsonar.host.url=http://localhost:9000 """ # CodeQL (GitHub) """ # 创建数据库 codeql database create ./db --language=python # 执行查询 codeql database analyze ./db ./queries.ql --format=sarif """ ``` --- ## 动态分析技术 ### DAST 原理 > ▎ 动态分析不是替代静态,是互补。单一分析,漏洞就是片面的。 **DAST 工作流程**: ``` 1. 爬虫发现 ├── 爬取应用 ├── 发现端点 └── 构建站点地图 2. 漏洞扫描 ├── SQL 注入测试 ├── XSS 测试 ├── CSRF 测试 └── 其他 OWASP Top 10 3. 认证测试 ├── 暴力破解 ├── 会话管理 └── 权限测试 4. 结果验证 ├── 误报过滤 ├── 风险评级 └── 报告生成 ``` **工具使用**: ```python # OWASP ZAP """ # Docker 运行 docker run -t owasp/zap2docker-stable zap-baseline.py \ -t https://example.com # 自动化扫描 zap-cli quick-scan --self-contained --scanners xss,sqli https://example.com # API 扫描 zap-cli open-url https://example.com zap-cli active-scan --scanners all https://example.com zap-cli report -o report.html -f html """ # Burp Suite """ # 社区版:手动测试 # 专业版:自动化扫描 # 配置扫描 1. 设置扫描范围 2. 配置认证 3. 选择扫描策略 4. 执行扫描 5. 审查结果 """ # SQLMap (SQL 注入) """ # 基本扫描 sqlmap -u "https://example.com/page?id=1" # 深度扫描 sqlmap -u "https://example.com/page?id=1" --level=5 --risk=3 # 自动利用 sqlmap -u "https://example.com/page?id=1" --auto """ ``` ### Fuzzing 测试 ```python # 模糊测试 import requests import random import string class FuzzTester: """模糊测试工具""" def __init__(self, target_url): self.target_url = target_url self.session = requests.Session() def fuzz_parameter(self, param_name, payloads): """模糊测试参数""" results = [] for payload in payloads: try: response = self.session.get( self.target_url, params={param_name: payload}, timeout=5 ) # 检测异常 if self.detect_anomaly(response): results.append({ 'payload': payload, 'status_code': response.status_code, 'response_size': len(response.content), 'anomaly': True }) except requests.exceptions.RequestException as e: results.append({ 'payload': payload, 'error': str(e), 'anomaly': True }) return results def get_sql_injection_payloads(self): """SQL 注入 payload 列表""" return [ "' OR '1'='1", "1; DROP TABLE users--", "' UNION SELECT NULL--", "1' AND '1'='1", "' OR 1=1--", "admin'--", "1; WAITFOR DELAY '0:0:5'--", ] def get_xss_payloads(self): """XSS payload 列表""" return [ "<script>alert(1)</script>", "<img src=x onerror=alert(1)>", "javascript:alert(1)", "<svg onload=alert(1)>", "'-alert(1)-'", ] def detect_anomaly(self, response): """检测异常响应""" # SQL 注入指示 sql_errors = [ 'SQL syntax', 'mysql_fetch', 'ORA-', 'PostgreSQL', 'SQLite', 'syntax error' ] for error in sql_errors: if error.lower() in response.text.lower(): return True # XSS 指示 if '<script>alert(1)</script>' in response.text: return True # 服务器错误 if response.status_code >= 500: return True return False # 使用示例 fuzzer = FuzzTester('https://example.com/search') results = fuzzer.fuzz_parameter('q', fuzzer.get_sql_injection_payloads()) for result in results: if result.get('anomaly'): print(f"Potential vulnerability: {result['payload']}") ``` --- ## 污点分析技术 ### 污点分析原理 > ▎ 污点分析不是跟踪数据,是跟踪风险。风险不跟踪,注入就是遗漏的。 **污点分析流程**: ``` 1. 污点源识别 (Sources) ├── 用户输入 ├── 外部 API ├── 文件读取 └── 网络数据 2. 污点传播 (Propagation) ├── 变量赋值 ├── 函数调用 ├── 字符串操作 └── 数据转换 3. 污点汇聚 (Sinks) ├── SQL 执行 ├── 命令执行 ├── 文件操作 └── 输出渲染 4. 路径分析 ├── 可达性分析 ├── 条件分析 └── sanitization 检查 ``` **污点分析实现**: ```python # 简化污点分析示例 class TaintAnalyzer: """污点分析器""" def __init__(self): # 污点源 self.sources = { 'user_input': [ 'request.args', 'request.form', 'request.json', 'input()', 'sys.argv' ], 'file_read': [ 'open().read', 'file.read' ], 'network': [ 'requests.get', 'urllib.urlopen', 'socket.recv' ] } # 污点汇聚点 self.sinks = { 'sql': [ 'execute(', 'exec(', 'query(' ], 'command': [ 'os.system(', 'subprocess.run(', 'eval(', 'exec(' ], 'file': [ 'open(', 'os.remove(', 'shutil.' ], 'output': [ 'render(', 'write(', 'print(' ] } # 清理函数 self.sanitizers = [ 'escape', 'sanitize', 'quote', 'parameterize' ] def analyze(self, code): """执行污点分析""" issues = [] # 1. 识别污点源 tainted_vars = self.find_sources(code) # 2. 跟踪污点传播 propagation_paths = self.track_propagation(code, tainted_vars) # 3. 检查是否到达汇聚点 for path in propagation_paths: if self.reaches_sink(path): # 4. 检查是否有清理 if not self.has_sanitization(path): issues.append({ 'type': 'Taint Flow', 'source': path['source'], 'sink': path['sink'], 'path': path, 'severity': 'HIGH' }) return issues def find_sources(self, code): """识别污点源""" tainted = {} for source_type, patterns in self.sources.items(): for pattern in patterns: if pattern in code: # 找到污点源 var_name = self.extract_variable(code, pattern) tainted[var_name] = { 'type': source_type, 'location': self.find_location(code, pattern) } return tainted def track_propagation(self, code, tainted_vars): """跟踪污点传播""" paths = [] # 简化实现 # 实际应构建数据流图 for var_name, source_info in tainted_vars.items(): # 查找变量使用 uses = self.find_variable_uses(code, var_name) for use in uses: paths.append({ 'source': source_info, 'use': use, 'variable': var_name }) return paths def reaches_sink(self, path): """检查是否到达汇聚点""" use_location = path.get('use', {}) code_context = use_location.get('code', '') for sink_type, patterns in self.sinks.items(): for pattern in patterns: if pattern in code_context: path['sink'] = { 'type': sink_type, 'location': use_location.get('location') } return True return False def has_sanitization(self, path): """检查是否有清理""" # 检查路径中是否有清理函数 for sanitizer in self.sanitizers: if sanitizer in str(path): return True return False ``` --- ## 漏洞模式识别 ### 常见漏洞模式 > ▎ 漏洞不是随机出现,是有模式的。模式不认识,审计就是盲目的。 **SQL 注入模式**: ```python # SQL 注入代码模式 sql_injection_patterns = [ # 字符串拼接 { 'pattern': r'execute\(["\'].*%s.*["\'].*%', 'language': 'python', 'severity': 'CRITICAL', 'example': 'cursor.execute("SELECT * FROM users WHERE id = %s" % user_id)' }, # f-string { 'pattern': r'execute\(f["\'].*\{.*\}.*["\']\)', 'language': 'python', 'severity': 'CRITICAL', 'example': 'cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")' }, # format { 'pattern': r'execute\(["\'].*\{.*\}.*["\']\.format\(', 'language': 'python', 'severity': 'CRITICAL', 'example': 'cursor.execute("SELECT * FROM users WHERE id = {}".format(user_id))' }, # 拼接 { 'pattern': r'execute\(["\'].*["\'].*\+.*\)', 'language': 'python', 'severity': 'CRITICAL', 'example': 'cursor.execute("SELECT * FROM users WHERE id = " + user_id)' } ] # 安全替代方案 safe_patterns = [ # 参数化查询 { 'pattern': r'execute\(["\'].*["\'].*,.*\(', 'description': '使用参数化查询', 'example': 'cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))' } ] ``` **XSS 模式**: ```python # XSS 代码模式 xss_patterns = [ # 未转义输出 { 'pattern': r'render_template_string\(.*\{.*\}.*\)', 'language': 'python', 'severity': 'HIGH', 'example': 'render_template_string("<h1>{{ user_input }}</h1>")' }, # 直接返回用户输入 { 'pattern': r'return.*request\.(args|form|json)\[.*\]', 'language': 'python', 'severity': 'HIGH', 'example': 'return request.args.get("q")' }, # 未转义 HTML { 'pattern': r'Markup\(.*request\.', 'language': 'python', 'severity': 'HIGH', 'example': 'return Markup(request.args.get("content"))' } ] # 安全替代方案 safe_xss_patterns = [ { 'pattern': r'escape\(.*request\.', 'description': '使用 escape 转义', 'example': 'return escape(request.args.get("q"))' }, { 'pattern': r'render_template\(.*\)', 'description': '使用模板自动转义', 'example': 'return render_template("page.html", user_input=user_input)' } ] ``` **命令注入模式**: ```python # 命令注入代码模式 command_injection_patterns = [ # shell=True { 'pattern': r'subprocess\..*\(.*shell\s*=\s*True.*\)', 'language': 'python', 'severity': 'CRITICAL', 'example': 'subprocess.run(cmd, shell=True)' }, # os.system { 'pattern': r'os\.system\(.*\+.*\)', 'language': 'python', 'severity': 'CRITICAL', 'example': 'os.system("ping " + hostname)' }, # eval/exec { 'pattern': r'eval\(.*request\.', 'language': 'python', 'severity': 'CRITICAL', 'example': 'eval(request.args.get("expr"))' }, { 'pattern': r'exec\(.*request\.', 'language': 'python', 'severity': 'CRITICAL', 'example': 'exec(request.args.get("code"))' } ] ``` --- ## 审计工具链 ### 工具集成 > ▎ 工具不是单个用,是集成用。工具不集成,效率就是低下的。 **工具链配置**: ```yaml # .github/workflows/security-scan.yml name: Security Scan on: [push, pull_request] jobs: security: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # SAST - Bandit - name: Run Bandit run: | pip install bandit bandit -r ./src -f json -o bandit-report.json continue-on-error: true # SAST - Semgrep - name: Run Semgrep run: | pip install semgrep semgrep --config auto --json --output semgrep-report.json ./src continue-on-error: true # 依赖扫描 - Safety - name: Run Safety run: | pip install safety safety check --json --output safety-report.json continue-on-error: true # 依赖扫描 - pip-audit - name: Run pip-audit run: | pip install pip-audit pip-audit --format json --output pip-audit-report.json continue-on-error: true # 上传结果 - name: Upload Reports uses: actions/upload-artifact@v3 with: name: security-reports path: | bandit-report.json semgrep-report.json safety-report.json pip-audit-report.json ``` **本地审计脚本**: ```python #!/usr/bin/env python3 """ 代码审计自动化脚本 """ import subprocess import json from pathlib import Path from datetime import datetime class CodeAuditAutomation: """代码审计自动化工具""" def __init__(self, project_path): self.project_path = Path(project_path) self.reports_dir = self.project_path / 'audit-reports' self.reports_dir.mkdir(exist_ok=True) def run_all_scans(self): """执行所有扫描""" timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') results = { 'timestamp': timestamp, 'project': str(self.project_path), 'scans': {} } # 运行 Bandit print("[*] Running Bandit...") results['scans']['bandit'] = self.run_bandit() # 运行 Semgrep print("[*] Running Semgrep...") results['scans']['semgrep'] = self.run_semgrep() # 运行 Safety print("[*] Running Safety...") results['scans']['safety'] = self.run_safety() # 运行 pip-audit print("[*] Running pip-audit...") results['scans']['pip_audit'] = self.run_pip_audit() # 汇总报告 self.generate_summary_report(results) return results def run_bandit(self): """运行 Bandit""" cmd = ['bandit', '-r', str(self.project_path / 'src'), '-f', 'json', '-o', str(self.reports_dir / 'bandit.json')] result = subprocess.run(cmd, capture_output=True, text=True) return { 'status': 'completed', 'report': str(self.reports_dir / 'bandit.json'), 'exit_code': result.returncode } def run_semgrep(self): """运行 Semgrep""" cmd = ['semgrep', '--config', 'auto', '--json', '-o', str(self.reports_dir / 'semgrep.json'), str(self.project_path / 'src')] result = subprocess.run(cmd, capture_output=True, text=True) return { 'status': 'completed', 'report': str(self.reports_dir / 'semgrep.json'), 'exit_code': result.returncode } def run_safety(self): """运行 Safety""" cmd = ['safety', 'check', '--json', '--output', str(self.reports_dir / 'safety.json')] result = subprocess.run(cmd, capture_output=True, text=True) return { 'status': 'completed', 'report': str(self.reports_dir / 'safety.json'), 'exit_code': result.returncode } def run_pip_audit(self): """运行 pip-audit""" cmd = ['pip-audit', '--format', 'json', '--output', str(self.reports_dir / 'pip_audit.json')] result = subprocess.run(cmd, capture_output=True, text=True) return { 'status': 'completed', 'report': str(self.reports_dir / 'pip_audit.json'), 'exit_code': result.returncode } def generate_summary_report(self, results): """生成汇总报告""" summary = { 'audit_summary': { 'timestamp': results['timestamp'], 'project': results['project'], 'total_issues': 0, 'critical': 0, 'high': 0, 'medium': 0, 'low': 0 }, 'scans': results['scans'] } # 统计问题数量 for scan_name, scan_result in results['scans'].items(): report_path = scan_result.get('report') if report_path and Path(report_path).exists(): with open(report_path) as f: report_data = json.load(f) issues = self.count_issues(report_data, scan_name) summary['audit_summary']['total_issues'] += issues['total'] summary['audit_summary']['critical'] += issues['critical'] summary['audit_summary']['high'] += issues['high'] summary['audit_summary']['medium'] += issues['medium'] summary['audit_summary']['low'] += issues['low'] # 保存汇总报告 summary_path = self.reports_dir / 'summary.json' with open(summary_path, 'w') as f: json.dump(summary, f, indent=2) print(f"\n[+] Audit Summary:") print(f" Total Issues: {summary['audit_summary']['total_issues']}") print(f" Critical: {summary['audit_summary']['critical']}") print(f" High: {summary['audit_summary']['high']}") print(f" Medium: {summary['audit_summary']['medium']}") print(f" Low: {summary['audit_summary']['low']}") print(f" Report: {summary_path}") def count_issues(self, report_data, scan_type): """统计问题数量""" counts = {'total': 0, 'critical': 0, 'high': 0, 'medium': 0, 'low': 0} if scan_type == 'bandit': for issue in report_data.get('results', []): severity = issue.get('issue_severity', 'LOW').lower() counts['total'] += 1 if severity in counts: counts[severity] += 1 elif scan_type == 'semgrep': for result in report_data.get('results', []): severity = result.get('severity', 'INFO').lower() counts['total'] += 1 if severity in counts: counts[severity] += 1 elif scan_type == 'safety': for vulnerability in report_data: counts['total'] += 1 counts['high'] += 1 # 依赖漏洞通常视为高危 elif scan_type == 'pip_audit': for entry in report_data.get('dependencies', []): for vuln in entry.get('vulns', []): counts['total'] += 1 counts['high'] += 1 return counts # 使用示例 if __name__ == '__main__': auditor = CodeAuditAutomation('./myproject') auditor.run_all_scans() ``` --- ## 审计报告规范 ### 报告结构 > ▎ 报告不是写文章,是建证据。证据不完整,修复就是推诿的。 **审计报告模板**: ```markdown # 代码审计报告 ## 执行摘要 ### 审计概况 - 项目名称:XXX - 审计时间:2024-01-15 至 2024-01-20 - 审计范围:核心业务代码 - 审计方法:自动化扫描 + 人工审计 ### 风险概览 | 严重程度 | 数量 | 占比 | |----------|------|------| | 严重 | 2 | 5% | | 高危 | 8 | 20% | | 中危 | 15 | 38% | | 低危 | 15 | 38% | ### 关键发现 1. [严重] SQL 注入漏洞 - 用户搜索功能 2. [严重] 认证绕过 - 密码重置功能 3. [高危] XSS 漏洞 - 评论功能 ## 详细发现 ### 漏洞 1: SQL 注入 #### 漏洞描述 用户搜索功能存在 SQL 注入漏洞,攻击者可获取数据库任意数据。 #### 漏洞位置 - 文件:src/api/search.py - 函数:search_users() - 行号:45-50 #### 漏洞代码 ```python # 问题代码 def search_users(query): sql = f"SELECT * FROM users WHERE name LIKE '%{query}%'" cursor.execute(sql) ``` #### 修复建议 ```python # 修复代码 def search_users(query): sql = "SELECT * FROM users WHERE name LIKE %s" cursor.execute(sql, (f"%{query}%",)) ``` #### 风险评级 - CVSS: 9.8 (Critical) - 利用难度:低 - 业务影响:高 ## 附录 ### 审计工具 - Bandit v1.7.5 - Semgrep v1.0.0 - Safety v2.3.0 ### 参考标准 - OWASP Top 10 2021 - CWE Top 25 - CERT 安全编码规范 ``` --- ## 实战审计演练 ### 审计案例 **案例:电商系统审计**: ```python # 电商系统审计检查清单 ecommerce_audit_checklist = { 'authentication': [ '密码是否哈希存储', '是否有暴力破解防护', '会话管理是否安全', 'MFA 是否实现' ], 'authorization': [ '是否有越权访问', '权限检查是否完善', '管理员功能是否隔离' ], 'payment': [ '支付逻辑是否完整', '金额是否服务端验证', '订单状态是否防篡改', '回调是否验证签名' ], 'data_protection': [ '敏感数据是否加密', '日志是否脱敏', '数据传输是否加密' ], 'input_validation': [ '所有输入是否验证', '文件上传是否安全', 'API 参数是否验证' ] } # 审计发现示例 audit_findings = [ { 'id': 'FIND-001', 'category': 'SQL Injection', 'severity': 'CRITICAL', 'location': 'src/order/query.py:35', 'description': '订单查询功能存在 SQL 注入', 'evidence': 'cursor.execute(f"SELECT * FROM orders WHERE user_id = {user_id}")', 'recommendation': '使用参数化查询', 'fixed_code': 'cursor.execute("SELECT * FROM orders WHERE user_id = %s", (user_id,))' }, { 'id': 'FIND-002', 'category': 'Broken Access Control', 'severity': 'HIGH', 'location': 'src/order/detail.py:20', 'description': '订单详情未验证所有权', 'evidence': 'order = Order.query.get(order_id) # 无所有权检查', 'recommendation': '添加所有权验证', 'fixed_code': 'order = Order.query.filter_by(id=order_id, user_id=current_user.id).first()' }, { 'id': 'FIND-003', 'category': 'Insecure Direct Object Reference', 'severity': 'HIGH', 'location': 'src/user/profile.py:15', 'description': '用户资料可越权访问', 'evidence': 'user = User.query.get(request.args.get("user_id"))', 'recommendation': '验证当前用户权限', 'fixed_code': ''' user_id = request.args.get("user_id") if user_id != str(current_user.id) and not current_user.is_admin: abort(403) user = User.query.get(user_id) ''' } ] ``` --- 统计 **Sprint 交付 · 绩效评估** ``` ┌───────────────┬────────────────┬────────────────┐ │ 主动出击 │ ██████████ 5/5 │ [PUA 生效] 充足 │ ├───────────────┼────────────────┼────────────────┤ │ + 验证闭环 │ ██████████ 5/5 │ 案例完整 │ ├───────────────┼────────────────┼────────────────┤ │ 设计 代码质量 │ ██████████ 5/5 │ 生产就绪 │ └───────────────┴────────────────┴────────────────┘ 综合:4.5 ``` ▎ 这才配得上 P8。代码审计不是找漏洞,是建能力。能力不建立,安全就是表面的。 --- ## 总结与思考 ### 核心要点回顾 > ▎ 复盘四步法:回顾目标、评估结果、分析原因、总结经验。别跳过——这是闭环。 **代码审计框架**: ``` 1. 审计方法 - 基于风险 - 基于功能 - 基于数据流 2. 分析技术 - 静态分析 (SAST) - 动态分析 (DAST) - 污点分析 3. 漏洞识别 - 模式匹配 - 污点追踪 - 人工审查 4. 工具链 - Bandit/Semgrep - ZAP/Burp - 自动化集成 ``` **关键成功因素**: ``` 1. 工具 + 人工 - 工具发现明显问题 - 人工发现复杂问题 - 两者互补 2. 流程规范 - 标准审计流程 - 报告模板 - 修复跟踪 3. 持续改进 - 经验沉淀 - 模式库更新 - 工具优化 ``` ### 实战建议 > ▎ 我给你指了路,走不走是你的事。机会给了,抓不抓得住看你。 **审计能力建设**: ``` 1. 工具建设 - 自动化扫描 - CI/CD 集成 - 报告汇总 2. 知识建设 - 漏洞模式库 - 修复方案库 - 案例库 3. 团队建设 - 审计培训 - 经验分享 - 外部交流 ``` --- ## 参考资料 ### 学习资源 ``` - OWASP Code Review Guide https://owasp.org/www-project-code-review-guide/ - CERT Secure Coding Standards https://wiki.sei.cmu.edu/confluence/display/seccode - CWE Top 25 https://cwe.mitre.org/top25/ ``` ### 工具资源 ``` - Bandit https://github.com/PyCQA/bandit - Semgrep https://github.com/returntocorp/semgrep - SonarQube https://www.sonarqube.org/ ``` ### 书籍推荐 ``` - 《The Art of Software Security Assessment》 - 《Secure Coding Principles and Practices》 - 《Code Review for Software Security》 ``` --- **标记 明日预告**:Day 148 - 静态代码分析 SAST > ▎ 代码审计是方法论,SAST 是技术实现——明天深入静态代码分析 SAST。 > 本文内容仅供学习和研究使用,请勿用于非法目的。所有实验请在隔离环境中进行。 --- *本文是 365 天信息安全技术系列的第 147 篇,应用安全部分第 40 篇,精编版本* *应用安全核心系列继续!*
myh0st
2026年4月13日 23:18
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码