代码审计
一, 代码审计介绍
渗透测试中的代码审计是一个关键步骤,它涉及到深入检查应用程序的源代码,以发现安全漏洞、弱点或不合规的编码实践。这种审计通常由专业的安全工程师或渗透测试人员执行,并侧重于识别可能被黑客利用的安全缺陷。以下是代码审计在渗透测试中的一些重要方面:
1. 目标和重点
- 识别安全漏洞:如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等。
- 审查数据处理:如输入验证、输出编码、文件处理等。
- 检查认证和授权机制:确保它们的强度和实现的正确性。
2. 审计方法
- 静态代码分析:使用工具或手动检查源代码,寻找不安全的编码模式和已知的漏洞模式。
- 动态分析:在运行时通过测试来识别漏洞,如使用自动化扫描工具或手动测试。
3. 关注点
- 敏感数据处理:如密码、个人信息的存储和传输安全。
- 第三方库和依赖项:审查使用的库是否安全,是否存在已知的漏洞。
- 错误处理和日志记录:确保错误处理不会泄露敏感信息,日志记录要适当。
4. 常见安全漏洞
- 注入漏洞:如SQL注入、命令注入。
- 破坏会话管理:如会话劫持、固定会话。
- 不安全的直接对象引用:允许攻击者直接访问系统中的对象。
- 配置错误:如不安全的默认设置。
- 敏感数据暴露:如未加密的数据传输。
5. 自动化工具的使用
- 利用工具:例如 SonarQube、Fortify、Checkmarx 等,来自动发现代码中的一些通用漏洞。
6. 代码审计的挑战
- 复杂性:大型应用程序可能包含大量的代码,使得审计变得复杂。
- 变化的威胁模型:随着技术的发展,新的漏洞和攻击技术不断出现。
- 资源限制:需要专业的技术知识和足够的时间进行深入的代码审计。
7. 最佳实践
- 持续审计:随着应用程序的更新和发展,定期进行代码审计。
- 多层安全策略:结合其他安全实践,如防火墙、入侵检测系统和安全培训。
二, 代码审计思路总结
1. 敏感函数或对象
- 文件读写的敏感函数 :例如
file_get_contents
,fgets
,file_put_contents
,fwrite
。这些函数可能被利用来读取或写入木马,获取服务器上的敏感信息,或者泄露网站源码。审计时应确保它们不被用户输入所控制。 - 用户输入对象 :如
$_POST
,$_GET
,$_SERVER
,$_FILES
,$_COOKIE
,$_REQUEST
,以及php://input
,
其他可能的输入点,如环境变量、HTTP头部信息等。
这些是用户输入的主要来源,需要对它们进行严格的验证和过滤,以防止注入攻击。
2. 文件包含
- 函数如
include
,include_once
,require
,require_once
:需要确保这些函数中包含的文件路径不受用户控制,防止包含恶意文件。
3. 命令或代码执行
- 敏感函数如
eval
,assert
,passthru
,shell_exec
,call_user_func
,call_user_func_array
,preg_replace
,system
:这些函数可以执行命令或代码,容易被恶意利用。需要特别注意参数的来源和过滤。
4. 用户可控点的处理
- 参数来源追踪 :例如
eval($name)
中的$name
可能来源于用户输入。需要追溯变量的来源,确保其值在使用前已经得到充分的验证和过滤。
5. 附加信息
- X-Forwarded-For:了解请求经过代理时的IP地址处理方式, 验证 XFF 标头,以防止欺骗性的IP注入。
- 常用过滤条件 :例如
addslashes
,mysql_real_escape_string
,htmlspecialchars
,str_ireplace
,以及文件类型和尺寸的检查。使用预编译语句(prepared statements)防止SQL注入。 - 常用防御方式 :如通过
php.ini
设置全局开关,尽量避免使用敏感函数,必须使用时进行严格过滤,使用WAF(Web Application Firewall)等。 - 文件和网络IO :
file_get_contents
,curl_exec
,fsocketopen
等,以及数据库的 CRUD 操作。 - 数据库操作:在取数据时进行过滤处理或检查,最好在数据录入时就进行详细的安全检查。使用安全的数据库访问方法和框架,如ORMs
进行代码审计时,应该综合考虑这些方面,通过多层次的安全检查和防御机制来确保代码的安全性。同时,也需要持续关注安全领域的最新动态和漏洞信息,以便及时更新和改进审计策略。