vlambda博客
学习文章列表

SQL注入防御技术之Java预编译

    


本文作者:无名安全团队-w蛇皮怪怪w


    学完基础的sql注入以及相关绕过。对比之前听说过的 java预防注入的预编译,尝试分析预编译的原理以及如果绕过的可能性。

SQL注入概念

通过控制前端的可控变量,向后端数据库传递恶意语句,达到查看后端数据库中信息。包括但不限制于管理员登录密码、普通用户登录密码、网站用户登录密码等。

SQL注入必要条件

1)网页存在可控参数

post、get、cookie等

2)传入参数可以拼接到sql语句

3)sql语句能够正确执行

4)根据网页能够判断传入的SQL语句是否正确执行

直接显示数据库内容、网页正确或错误显示、网页响应延时、错误sql产生的报错等

java预编译预防注入

预编译原理

1)将sql语句通过prepareStatement方法进行预处理,并将处理结果存储

2)设置该sql语句所需的参数类型

3)接受参数时,判断该参数是否存在于定义的类型范围内,如果与定义类型不同,将编译不通过,并且不会插入到数据库执行

预编译代码
String sql = "select * from table where id = ?";
Connection con = .....///数据库连接
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1,id);//设置对应的参数的类型
产生的疑问

如果指定的参数类型是字符串的话,那么是否存在绕过的可能?

    首先预处理是用 “?” 来当做标志符,杜绝了用 “+” 来链接恶意sql语句操作的余地。

PreparedStatement所具有的功能是将前端传来的参数做到  真正的参数化  ,以传参的形式传递给处理函数,进行验证类型,以及相关权限约束。由于sql语句格式

是已经规定好的,用户只能提供数据,还必须是sql所需数据内容,缺的只是具体的那几个数据,用户无法用可控参数作出越界操作,也就达到恶意代码无效化  。

由此来看,在java预编译的防护下,产生注入的可能性很低。

并且一个网站还有可能人为的过滤,以及web相关的防护应用。

或者PreparedStatement接口方法中,本身就存在对sql关键字的过滤等操作。(个人猜测,毕竟该接口就是为了防范sql注入)



以上仅为学习参考,具体需要读者自行甄别。