「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。
这一章节我们需要知道SQL注入常出现在那些功能,如何判断注入点,注入的分类有哪些以及具体的注入方式。
SQL注入的原理其实很简单:在传给后端的「参数」中构造「SQL语句」,改变原有的「SQL语法结构」,实现对数据库的操作。
SQL注入
- 1、SQL注入常出现在哪些功能?
- 2、SQL注入危害
- 3、SQL注入分类
- 4、判断是否存在SQL注入
- 5、SQL注入方式
- 6、SQL注入防御
- 6.1、预编译
1、SQL注入常出现在哪些功能?
凡是涉及「数据库操作的功能」,都有可能存在SQL注入,比如:
- 搜索框等查询功能。
- 用户注册/用户登录功能。
- 密码找回功能。
- 用户资料修改功能。
- 以及其他同质化功能。
从「流量」的角度来看,SQL注入经常出现在:
- Get请求传递的参数
- Post请求的表单里
- Cookie
- HTTP请求头的 User-Agent、X-Forworded-For、以及其他传递数据的字段。
2、SQL注入危害
SQL注入的危害主要取决于对数据的操作。
1)首先是数据的查询操作,也就是脱库,对应的危害是敏感信息泄露。
2)其次是数据的修改操作,比如把字段的值改为改成网页链接,对应的危害是网页篡改和挂马。
3)再就是数据的删除操作,删掉数据库的数据,导致系统瘫痪。
4)再就是写入后门文件,拿服务器的权限,远程控制。
3、SQL注入分类
根据输入的 「参数」类型,可以把SQL注入分为:「数值型」注入、 「字符型」注入。
- 数值型注入:数值+括号型
- 字符型注入:单引号字符型、双引号字符型、单引号字符串+括号型、双引号字符串+括号型
1)比如下面这个根据ID查询用户的功能。
后台对应的SQL如下,「字段类型」是数值型,这种就是数值型注入。
select * from user where id = 1;
2)比如下面这个登录功能,输入的用户名和密码是字符串。
后台对应的SQL如下,「字段类型」是字符型,这种就是字符型注入。
select * from user
where username = 'zhangsan' and password = '123abc';
因为值可以用单双引号、括号包裹,所以在数值型注入和字符型注入的基础上,还存在以下变种:
1)值使用「单引号」包裹时,叫做单引号字符型注入:
select * from user where username = 'zhangsan';
2)值使用「双引号」包裹时,叫做双引号字符型注入:
select * from user where username = "zhangsan";
3)值使用括号包裹数值型,叫数值+括号型注入:
select * from user where id = (1);
select * from user where id = ((1));
包裹多个括号……
4)值使用括号和单引号包包裹,叫单引号字符串+括号型注入:
select * from user where username = ('zhangsan');
select * from user where username = (('zhangsan'));
包裹多个括号……
值使用括号和双引号包裹,叫双引号字符串+括号型注入;
select * from user where username = ("zhangsan");
select * from user where username = (("zhangsan"));
包裹多个括号……
4、判断是否存在SQL注入
在参数中输入「单/双引号」,页面有报错就有可能存在注入点:
- 输入单引号报错:数值型注入 或 单引号字符型注入
- 输入双引号报错:数值型注入 或 双引号字符型注入
1)对于「数值型」注入,在参数中添加单、双引号都会报错。
2)对于「单引号字符型」注入,在参数中添加单引号会报错,而添加双引号时不会报错。
3)对于「双引号字符型」注入,在参数中添加单引号不会报错,而添加双引号时会报错。
在数值型、字符型注入的基础上,尝试不同的引号+括号组合,判断出注入点类型,就可以构造SQL语句测试了。
SQL恒成立时页面正常显示,SQL恒不成立时页面异常显示,就说明存在注入:
- ?id=1 and true – a 页面正常显示
- ?id=1 and false – a 页面异常(空)显示
5、SQL注入方式
根据利用方式可以分为:
- 联合注入:使用union关键字拼接多条查询语句。
- 报错注入:使用报错函数执行SQL语句。
- 布尔盲注:改变SQL的恒等条件,根据页面响应判断SQL执行结果。
- 时间盲注:使用延时函数,根据页面响应时间判断SQL执行结果。
6、SQL注入防御
SQL注入的防御分为三个方面::参数过滤 , 预编译 以及 限制权限和报错
- 「参数过滤」以各种厂商的WAF以及代码逻辑为主,比如替换空格、关键字、双写、大小写、特殊字符转义等。
- 「预编译」主要依赖各种框架,比如Java的mybatis框架 和 PHP的 thinkphp框架
- 限制「权限」和「报错」是指限制数据库的权限,以及控制数据库的报错信息,报错信息不要对外展示
6.1、预编译
SQL注入的核心是用户输入的参数改变了SQL的语法结构。而预编译,可以防止语法结构被改变。
SQL在执行前,需要先进行语法结构编译,正常情况下,用户输入的参数会参与语法结构编译,如果参数中包含SQL语法关键词,就会改变SQL的语法结构。
预编译的逻辑是先编译完SQL语法结构,再拼接用户的参数。用户输入的参数不参与语法编译过程,就无法改变语法结构,从而防止SQL注入。
详细原理可以查看我的另一篇文章: 预编译防止SQL注入的原理