1.原理
注入攻击的本质,是把用户输入的数据当成代码执行。两个关键条件:一是用户能够控制输入;二是原本程序要执行的代码,拼接了用户输入的数据。当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄露。
2.分类
- 按注入点的参数类型:数字型、字符型
当注入点的参数为整数时,如id、num、page等,这种形式为数字型注入漏洞
当注入点的参数为字符串时,则为字符型注入,字符型注入需要用引号来闭合 - 按数据库返回结果:回显注入、报错注入、盲注
回显注入:可以直接在存在注入点的页面返回结果
报错注入:如果Web服务器开启了错误回显,而当查询语句有语法错误,服务器会返回错误信息且直接显示在页面中,然没有返回数据库的查询结果,但是可以构造一些报错语句从错误信息中获取想要的结果。
盲注:很多时候,Web服务器关闭了错误回显,盲注就是在服务器没有错误回显时完成的注入攻击,由于“调试信息”,攻击者必须找到一个方式来验证注入的sql语句是否得到执行。有based boolen和based time两种盲注…详解 - 按照注入位置及方式:post注入,get注入,cookie注入等
漏洞利用例子(dvwa):
https://www.freebuf.com/articles/web/120747.html
3.防御
- 一般来说,防御sql注入的最佳方式就是使用预编译语句,绑定变量。
- 使用安全的存储过程,即先将sql语句定义在数据库中,但是存储过程也可能存在注入问题,因此应该尽量避免在存储过程内使用动态的sql语句,如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。
- 检查输入的数据类型
- 使用安全函数