文章目录
前言
Secure Code Warrlor是一个代码审计的练习平台,本次练习对象包含Spring框架和Spring Data Jpa框架。
一、SQL注入练习(6)
1.漏洞点为:
2.解决方案:
二、SQL注入练习(7)
1.漏洞点为:
2.解决方案:
三、SQL注入练习(8)
1.漏洞点为:
2.解决方案:
四、总结
1.Spring Data Jpa框架简介
Spring Data JPA 是spring在基于ORM框架、JPA规范的基础上封装的一套JPA框架,可以令开发者使用极简的代码实现对数据的访问和操作。其简化了对DAO层代码的编写,开发人员在DAO层中只需要写接口,就自动具有了增删改查、分页查询等方法。
存在下面代码就说明存在Spring Data Jpa框架:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.常见SQL注入场景
1)注意 Order By 因为采用预编译执行SQL语句传入的参数不能作为SQL语句的一部分,那么Order By后的字段名、或者是desc\asc也不能预编译处理,也就是说Order By场景的业务实现还是只能使用拼接。
2)注意 EntityManager,因为spring-data-jpa对复杂的动态的多表达语句支持不好需要引入EntityManager来完成,如果存在SQL语句拼接的话,就会存在注入的风险。
先引入EntityManager,然后使用entityManager.createNativeQuery()来执行原生的SQL语句:
Pageable pageable = PageUtils.getPageable(pageIndex,pageSize);
StringBuilder sql = new StringBuilder();
sql.append(" select ep.name,MAX(r.sign) from mnt_emp_rel_meeting as e ");
sql.append(" left join mnt_sign_record as r on(r.employee_id=e.employee_id) ");
sql.append(" left join mnt_employee as ep on(ep.id = e.employee_id) ");
sql.append(" where e.meeting_id ='"+meetingId"'");
sql.append(" order by r.sign desc,r.create_date asc ");
Query query = entityManager.createNativeQuery(sql.toString());
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
List<Object[]> list = query.getResultList();
可以看到这里meetingId是通过SQL拼接的方式进行查询,若meetingId用户可控的话,会存在SQL注入风险。
3.SQL注入防御
1)在执行数据库查询之前清除用户输入。此解决方案使用Spring数据存储库,提供数据访问。Spring数据存储库自动对传递给它们的任何参数执行清理,能防止SQL注入。
2)Spring Data JPA为创建安全的SQL查询提供了安全的参数清理,从而防止从用户控制的输入中包含恶意查询参数。