1.1 前言
源代码的安全审计中人的因素对实施的效果影响很大。本文档的主旨在于尽可能降低人的因素对审计效果的影响,提高工作质量,真正为客户找到问题和解决问题。
在代码审计工作中,我们常常要借助一些自动化的工具来解决部分显式的问题,而人工审计更多的是在于弥补工具的不足。下面将从认证、授权、输入/输出验证、会话管理、错误处理、加密、工作环境、日志审计及业务等方面来对相关工作进行拆解和指导。
代码审计过程中首先需要根据用户提供的测试环境、设计文档、使用手册,对应用系统的业务功能进行学习,对业务数据流进行梳理,检查关键环节是否进行了业务安全控制,检测完成后,需要从业务角度对威胁进行分析并归类。
1.2 代码审计概念
源代码安全审计是依据CVE(Common Vulnerabilities & Exposures)公共漏洞字典表、OWASP十大Web漏洞(Open Web Application Security Project),以及设备、软件厂商公布的漏洞库,结合专业源代码扫描工具对各种程序语言编写的源代码进行安全审计。能够为客户提供包括安全编码规范咨询、源代码安全现状测评、定位源代码中存在的安全漏洞、分析漏洞风险、给出修改建议等一系列服务。
自动化扫描器原理:查找关键代码–插入payload—编译运行测试
1.3 JavaWeb常见框架和分层
常见框架:
Strusts2、 Spring MVC、 SSH(Struts2+Spring+Hibernate)
常见分层:
展现层(View 视图)
控制层(Controller 控制层)
服务层(Service)
实体层(entity 实体对象、VO(value object) 值对象、模型层(bean)
业务逻辑层BO(business object)
持久层(dao-Data Access Object数据访问层、PO(persistant object)持久对象)
1.4 代码审计思路
1、按业务类型有序测试
根据Http请求跟踪到业务逻辑代码:
1、SpringMVC
在Java文件中相应的方法会有@RequestMapping(“/Login.do”)表示了直接把请求映射到业务逻辑代码上。
2、Struts
在config目录下有公共配置文件struts.xml,需要在xml配置一个action对应的处理类方法和返回的页面,通过对应的Action所在的路径找到业务逻辑代码。
2、按程序实现逆向测试
针对于特定漏洞比较有效,比如OWASP TOP10等指纹识别率较高的安全问题:
1、Ibatis、Mybatis的SQL语句可以基于注解的方式写在类方法上面,更多的是以xml的方式写到xml文件,可以直接在全局搜索${、或者”+”等关键字,找出所有拼接形式的SQL语句,然后用排除法。
2、Hibernate的HQL是对对象进行操作
String hql = "select *from user where age=";
hql.append(参数);
Query q = session.createQuery(hql);
搜索有关字符串拼接的关键字。如Concat、append、+等。
1.5 代码审计步骤
步骤 | 说明 | 详细 |
---|---|---|
1 | 准备知识 | 代码能力:熟练阅读各种代码。漏洞理解:熟练理解各种漏洞的代码层原理 |
2 | 开始审计-从配置文件开始梳理系统 | Application-context.xml、struts.xml、web.xml |
3 | 从输入开始-分析数据处理流程 | 针对于各种开源框架、商业框架、自定义框架等 |
4 | 漏洞特征定位 | 不同漏洞有不同的特征,直接定位代码并审计。包括技术性漏洞和逻辑性漏洞 |
1.6 代码审计方法
方法图如下: