黑客军团SQL注入失败原因分析_黑客军团SQL注入问题排查与解决方案

结论: SQL注入失败的主要原因:参数未注入SQL、前后端过滤、类型误判、WAF/IDS拦截。

故障排除: 确认技术栈。
分析注入点。
解释错误消息。
确定防御机制。
根据 WAF/IDS: 识别WAF类型。
位置屏蔽规则。
用编码覆盖。
浑浊突变电荷。
HTTP 参数污染。
借助工具进行分析。

盲人挑战: 效率低。
网络波动的影响。
数据库功能差异。
WAF 检测流量。

应对: 使用自动化工具。
优化负载。
绕过WAF/IDS。

保护: 参数化查询。
最低权限。
日志监控。
WAF 调优。
诚挚的: 参数化是必不可少的。

preparedstatement的使用!!

SQL注入说白了,就是在查询数据库的时候,偷偷地往参数里塞进不该塞进去的SQL代码,导致数据库做坏事。
这个案例在我们去年跑的项目中就差点失败了。
当时数据量只有3 000条左右,但是索引直接被一个带单引号的参数给破了。

我先说最重要的事情。
PreparedStatement 可以防止注入,因为它已经提前与数据库做了一组 SQL 骨架的处理,只需要等待参数传递即可。
这称为预编译。
去年我们用它修改departments表的时候,发现只要写“UPDATE Departments SET name=?WHERE id=?”这样的SQL就可以了。
然后传入参数,数据库会自动用你提供的值替换问号,并且永远不会允许你混入“;DROP TABLE Departments”——这种可笑的操作。
还有一点就是省事。
不需要每次运行时都解析SQL。
去年我们跑批处理的时候,我们用批处理的方式,一次性连接数据库,直接插入5 块数据,比单独运行至少快了3 0%。
还有另一个关键细节。
使用LIKE搜索“manpower”时,必须输入“? LIKE '%manpower%'”,否则预编译器会原样将其视为字符串,说实话,这很令人困惑。

一开始我以为预编译是为了防止注入,后来发现是错误的。
硬解析和软解析也很有趣。
没有缓存的数据库每次都必须从解析开始。
在去年的测试中,执行一条 SQL 语句需要一秒多的时间,但启用缓存后,就像查找字典一样,几秒钟内就返回了查询。
等等,那是另一回事了。
如果数据库服务器没有启用预编译,则必须依靠数据库驱动程序来干预编译工作。

建议下次写SQL时,直接使用PreparedStatement,尤其是带参数的,以免被骗。
不过动态SQL,根据用户输入改变SQL,仍然需要过滤,以免浪费预编译。

SpringBoot 防止SQL注入、XSS攻击、CSRF/CROS恶意访问

说白了,SQL注入就是攻击者秘密地在数据库查询中添加信息来瘫痪系统。
这个事情的复杂性就在于输入验证。
我们去年做的项目就差点受到这个问题的影响。
此时数据量只有3 000条左右,但是一个%符号没有被屏蔽,直接删除了测试数据库。

我们先来说说最重要的事情。
预编译机制是基本的解决方案。
例如,使用PreparedStatement代替字符串拼接。
去年测试的时候发现splice方法运行错误日志的次数是precompile的三倍。
另一点是,在like查询中需要屏蔽%。
去年1 0月份我们举办这个活动的时候,我们并没有注意到是什么原因导致用户输入特殊字符时系统卡住了一整天。
还有另一个关键细节。
处理异常时不要直接刷新堆栈。
去年我们注意到表名直接显示在异常消息中。
那真是一场噩梦。

说实话,这很令人困惑。
起初我以为过滤掉一些特殊字符就足够了,但后来我意识到这是错误的。
所有用户输入都必须被视为敌对的。
等等,还有一件事:网关服务是一件好事。
部署后,接口错误率下降了7 0%。
然而,我们在配置初期将电流限制设置得太低,导致系统在高峰时段再次出现抖动。

建议不要等待漏洞扫描,而是自己使用sqlmap运行几次,然后与Druid过滤器结合起来。
效果立即可见。
但最无情的还是权限控制。
数据库帐户仅被授予DML权限。
去年我们改变了这一点后,滥用特权的事件减少到了零。