javaseccode4SQL_0">java-sec-code学习4-SQL注入
case1
URL: http://127.0.0.1:8080/sqli/mybatis/vuln01?username=joychou%27%20or%20%271%27=%271
直接来看源代码:
直接获取请求参数username并且通过直接拼接的方式连接到SQL查询语句,随后再statement.executeQuery()方法中执行SQL语句。
因此,实际上sql语句就变成了select * from users where username='joychou' or '1'='1'
这使得后面的where条件始终为真,查询出了所有的用户信息。
修复案例
修复案例是通过预编译方式来防止SQL注入攻击的,主要的做法就是通过prepareStatement来实现预编译,同时设置参数填充位置。
预编译错误案例
这是预编译的错误使用案例,简单的通过使用预编译方法来执行sql是不够的,因为传入预编译处理时就已经是恶意的SQL语句了,而不是等待占位填充的语句。
因此,使用预编译,需要结合SQL语句占位和赋值实现,例如上面的修复案例。
mybatis案例一
路由对应/mybatis/vuln01
可以看到这里时利用了mybatis中的mapper来实现sql查询。具体可以查看一下UserMapper类:
相关的sql查询方法都已经在里面了,可以看到SQL查询语句为select * from users where username = '${username}'
,这里漏洞点在于mybatis中的占位符用的是$
符号
正确的使用方法应该是使用#
号来进行占位,如果是order by后的占位,则最好根据情况通过if-elseif-else来分情况实现。