在java中,sql注入的类型分别是对应连接数据库的最主要的几种方式,最主要的类型有jdbc注入和mybatis注入和Hibernate注入
首先如果是代码审计的话就可以从源码中查看类可以看出是哪种连接数据库方式,再根据数据库方式来测试注入。
JDBC:
JDBC(Java Database Connectivity)是Java提供对数据库进行连接、操作的标准API。Java自身并不会去实现对数据库的连接、查询、更新等操作而是通过抽象出数据库操作的API接口(JDBC),不同的数据库提供商必须实现JDBC定义的接口从而也就实现了对数据库的一系列操作
JDBC定义了一个叫java.sql.Driver
的接口类负责实现对数据库的连接,所有的数据库驱动包都必须实现这个接口才能够完成数据库的连接操作。java.sql.DriverManager.getConnection(xxx)
其实就是间接的调用了java.sql.Driver
类的connect
方法实现数据库连接的。数据库连接成功后会返回一个叫做java.sql.Connection
的数据库连接对象,一切对数据库的查询操作都将依赖于这个Connection
对象
下面这种就是存在漏洞的代码:
GET的注入和POST的其实差不多,只是获取值的地方不一样。
String sql = "select * from users where id = '"+id+"' ";
Statement statement = connection.createStatement();
ResultSet rssultSet = statement.executeQuery(sql);
安全的代码是:代码占位符号(?)+预编译(PreparedStatement)
String sql = "SELECT * FROM users WHERE name= ? ";
PreparedStatement ps = connection.prepareStatement(sql);
如果在预编译之前拼接了sql语句也是不行的
String sql = "SELECT * FROM users WHERE name ='"+ name + "'";
PreparedStatement ps = connection.prepareStatement(sql);
所以安全的方式一定是占位符(?)+预编译预编译(PreparedStatement)这种格式
Mybatis :
Mybatis是一款优秀的持久层框架。 它支持定制化SQL、存储过程以及高级映射。 Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。 Mybatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Object,普通老式Java对象)为数据库中的记录。 Mybatis本是Apache的一个开源项目Ibatis,2010年这个项目由Apache software foundation迁移到了Google Code,并改名为Mybatis。 2013年11月迁移到Github。
Mybatis获取值的方式有两种,分别是${} 和 #{}。
#{}:解析的是占位符问号,可以防止SQL注入,使用了预编译。
${}:直接获取值 –-这个获取参数就是会出现漏洞
不安全代码:
select id="getByName" resultType="org.example.User"> SELECT * FROM user WHERE name = '${name}' limit 1</select>
安全的代码:
“select * from user where name like #{name}” 或者是"select * from user where name like concat('%',#{name},'%')"
HQL:
Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),并包含一些高级特性,包括缓存以及继承,通常在Java与.NET中使用,但在java中用的比较常见
在 Hibernate 中,支持 HQL (Hibernate Query Language) 和 native sql 查询,前者存在 HQL 注入,后者和之前 JDBC 存在相同的注入问题,来具体看一下。
不安全代码:
Query<User> query = session.createQuery("from User where name = '" + name + "'", User.class);User user = query.getSingleResult();
安全的代码就HQL的参数类型就有好几种,这里就给位置参数的一种吧
Query<User> query = session.createQuery("from User where name = ?", User.class);query.setParameter(0, name);
Native SQL:
不安全的代码:
String sql = "select * from user where name = '" + name + "'";// deprecated// Query query = session.createSQLQuery(sql);Query query = session.createNativeQuery(sql);
安全的代码:这里是用到了参数绑定来设置参数值
String sql = "select * from user where name = :name";
Query query = session.createSQLQuery(sql);
Query query = session.createNativeQuery(sql);
query.setParameter("name", name);
总结:
其实总结下来,SQL语句安全的代码的格式大部分都是遵循占位符(?)后面跟着PreparedStatement函数或者参数绑定,其实mybatis也是一样就将这种预编译的作用结合成了参数的取值方式中,让代码更简洁和轻量化,在进行java代码审计时,首先先去查看配置文件,确定是什么框架和数据库连接方式,在去搜索对应的sql语句或者关键字,比如如果是mybatis,就搜“$”就没必要说搜“#”了,因为#是安全的你搜来也没必要,除非你要确认啥的,希望这篇文章能给你带来帮助。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)