本专栏旨在发现一个问题,解决一个问题,欢迎评论区提出一个问题,欢迎订阅,持续更新。
1:写一段代码
Mapper
@Mapper
public interface SqlIngMapper {
@Select("select * from app_user where user_name = ${userName} ")
List<Map<String,Object>> query(@Param("userName") String params);
}
Rest
@RestController
public class SqLinjectionRest {
@Resource
SqlIngMapper sqlIngMapper;
@RequestMapping("sqlIngTest")
public List<Map<String,Object>> sqlTest(@RequestParam String params){
return sqlIngMapper.query(params);
}
}
2: 测试程序注入
http://localhost:8080/sqlIngTest?params=1%20or%201%20=%201
访问URL:
程序sql执行为
select * from app_user where user_name = 1 or 1 = 1
可以看出,这个sql的语句执行在我们的控制中。这种执行方式,把一些用户敏感信息暴露出来了。 黑客就是利用这种技术,成功登陆后台,最后通过拿到webshell + 提权 获取服务器权限。
关于密码的彩虹表解析,我们可以使用cmd5网站进行查询。
md5在线解密破解,md5解密加密
3: 如何防范类似攻击?
代码千万行,安全第一行。
防御的方式很多
1: 增加sql注入的过滤器
2: ${xxx}改为#{}
3: 不要使用List<Map<String,Object>> 接受sql返回结果
4: 避免使用简单的加密方式 ,如 md5 sha256 sha512 sha1 加盐 等。加盐也并不安全。