SQL 注入
漏洞原理
黑客通过构造包含恶意 SQL 语句的输入,而 Web 应用未对用户输入进行合法性校验,从而导致这些恶意代码被数据库正确执行所导致。
漏洞危害
敏感信息泄露、网站入侵等。
注入方式
- 显错注入
- 布尔注入
- 联合注入
- 延时注入
- 带外注入
- 宽字节注入
- 堆叠注入
防御方案
- 过滤
对所有输入进行合法性校验,过滤最基本的两个方法:黑名单、白名单。 - 转义
PHP mysqli_real_escape_string 函数或 Java MyBatis 的 # 号包裹等,但可能会被编码绕过。 - 预编译
预编译是 SQL 注入最好的防御方法,但不一定使用了预编译就能够彻底杜绝 SQL 注入漏洞,错误预编译时机同样可能存在 SQL 注入漏洞。
原因:预编译是指提前构造好 SQL 语句模板,用占位符接收输入的数据。SQL 注入只对编译过程有破坏作用,执行阶段只是把输入串作为数据处理,不需要再对输入串中的 SQL 语句进行解析,因此解决了注入问题。 - 严格控制SQL权限
最小权限原则。 - 禁止回显报错
增加攻击者注入难度,但还是能通过带外或盲注的方式进行利用。 - 密文存储数据
止损措施。
绕过手段
- 过滤绕过
编码、大小写混写、双写、空格、换行、制表符、空字节、内联注释等。 - 转义绕过
宽字节等。