一、JDBC拼接不当造成SQL注入:
1、执行SQL注入的两种方法:
a、Statement:
b、PrepareStatement:
错误的:
正确的:
二、框架使用不当造成SQL注入:
1、MyBatis框架:
#{Parameter}:
${Parameter}:
2、Hibernate框架:
HQL:
参数绑定:
位置参数(Positional parameter):
命名参数(named parameter):
命名参数列表(named parameter list):
类实例(JavaBean):
执行原生SQL:
拼接:
参数:
三、防御不当造成SQL注入:
实例1:jdbc
@RequestMapping("/jdbc/vuln")
public String jdbc_sqli_vul(@RequestParam("username") String username) {
StringBuilder result = new StringBuilder();
try {
Class.forName(driver);
Connection con = DriverManager.getConnection(url, user, password);
if (!con.isClosed())
System.out.println("Connect to database successfully.");
// sqli vuln code
Statement statement = con.createStatement();
String sql = "select * from users where username = '" + username + "'";
logger.info(sql);
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
String res_name = rs.getString("username");
String res_pwd = rs.getString("password");
String info = String.format("%s: %sn", res_name, res_pwd);
result.append(info);
logger.info(info);
}
rs.close();
con.close();
} catch (ClassNotFoundException e) {
logger.error("Sorry,can`t find the Driver!");
} catch (SQLException e) {
logger.error(e.toString());
}
return result.toString();
}
实例2:jdbc
@RequestMapping("/jdbc/sec")
public String jdbc_sqli_sec(@RequestParam("username") String username) {
StringBuilder result = new StringBuilder();
try {
Class.forName(driver);
Connection con = DriverManager.getConnection(url, user, password);
if (!con.isClosed())
System.out.println("Connecting to Database successfully.");
// fix code
String sql = "select * from users where username = ?";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, username);
logger.info(st.toString()); // sql after prepare statement
ResultSet rs = st.executeQuery();
while (rs.next()) {
String res_name = rs.getString("username");
String res_pwd = rs.getString("password");
String info = String.format("%s: %sn", res_name, res_pwd);
result.append(info);
logger.info(info);
}
rs.close();
con.close();
} catch (ClassNotFoundException e) {
logger.error("Sorry, can`t find the Driver!");
e.printStackTrace();
} catch (SQLException e) {
logger.error(e.toString());
}
return result.toString();
}
实例3:mybatis
@GetMapping("/mybatis/vuln01")
public List<User> mybatisVuln01(@RequestParam("username") String username) {
return userMapper.findByUserNameVuln01(username);
}
实例4:mybatis
@GetMapping("/mybatis/vuln02")
public List<User> mybatisVuln02(@RequestParam("username") String username) {
return userMapper.findByUserNameVuln02(username);
}
实例5:orderby
public List<User> mybatisVuln03(@RequestParam("sort") String sort) {
return userMapper.findByUserNameVuln03(sort);
}
ps:不能用参数化,那要如何修复注入?
id—— 1
name—— 2
money—— 3
正序—— 1
倒序—— 2
实例6:mybatis安全1
public User mybatisSec01(@RequestParam("username") String username) {
return userMapper.findByUserName(username);
}
实例7:mybatis安全2
public User mybatisSec02(@RequestParam("id") Integer id) {
return userMapper.findById(id);
}
实例8:orderby安全1
public User mybatisSec03() {
return userMapper.OrderByUsername();
}
实例9:orderby安全2
public List<User> mybatisOrderBySec04(@RequestParam("sort") String sort) {
return userMapper.findByUserNameVuln03(SecurityUtil.sqlFilter(sort));
}
MCMS
https://gitee.com/mingSoft/MCMS/issues/I5X1U2
1.黑盒发现sqlWhere再白盒审:
2.经验:
后续:
小结:
原文始发于微信公众号(千寻安服):Java代码审计-sql注入篇
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论