java源代码审计sql注入

怎样预防儿童白癜风 http://pf.39.net/bdfyy/bdfal/160420/4829678.html
SQL注入是一种常见Web漏洞。所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。sql注入产生的原因是由于程序没有经过任何过滤就将外部可控的参数拼接进入SQL语句,直接放入数据库执行,导致欺骗服务器执行攻击者恶意SQL命令的目的。1SQL注入常见类型

在渗透测试的范围内,sql注入通常分为数字型和字符型,由于利用技巧的原因,也可以区分为堆注入,布尔盲注,时间盲注等等,但是对于源代码审计,sql注入的分类可以归纳总结为两种类型,一种是直接拼接,另一种是sql注入防护措施绕过。

1.1输入的参数直接动态拼接

在一些早期的系统中没有成熟的框架处理数据库业务,连接数据库使用了jdbc的方式进行连接,如果采用了拼接的方式直接将参数拼接到了sql语句当中,如果传入的参数未进行过滤或者预编译处理,就会产生sql注入。

1.2预编译使用不当

在部分代码审计的项目当中,我们发现部分研发人员虽采用了预编译的方式对数据进行查询,但是使用的方式不对,仍然存在sql注入风险。

下面代码就是典型的预编译有误:

Stringquery="SELECT*FROMusersWHEREuserid="+userid+""+"ANDpassword="+password+"";PreparedStatementstatement=connection.prepareStatement(query);ResultSetresultSet=statement.executeQuery();对已经拼接完成的sql语句调用预编码方法进行处理,已无实际用途,仍然存在sql注入风险。正确的方法如下:

Connectionconn=JDBCUtils.getConnection();Stringsql="select*fromuserswhereusername=?andpassword=?";PreparedStatementpstmt=conn.prepareStatement(sql);//用预编译传入sql语句pstmt.setString(1,username);//设置第一个参数为usernamepstmt.setString(2,password);//设置第二个参数为passwordpstmt.executeQuery();1.3持久层框架注入–Mybatis

当前主流研发框架通常使用Mybatis或者Hiberate持久层框架来处理sql事务,如果配置不当,可导致sql注入。

Mybatis获取参数的方式有两种,分别是{}和#{}。

#{}:解析为一个JDBC预编译语句(preparedstatement)的参数标记符。{}:仅仅为一个纯碎的string替换,在动态SQL解析阶段将会进行变量替换

使用{}语法,MyBatis不会进行安全检查和转义,直接拼接到最终的语句中执行,可导致sql注入。

审计案例如下:

selectid="getBlogById"resultType="Blog"parameterType=”int”SELECTid,title,author,contentFROMblogWHEREid={id}/select1.4持久层框架注入–Hiberate

在Hibernate中,其中HQL查询存在HQL注入,原生SQL查询和之前JDBC存在相同的注入问题

Hiberate查询方式如下图:

HQL注入

HQL原生sql查询注入

1.5



转载请注明地址:http://www.gongjingmilanagjml.com/glzx/8000.html
  • 上一篇文章:
  • 下一篇文章: 没有了
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章