SQL注入学习笔记

SQL注入基础

SQL注入介绍:

SQL注入漏洞是由于SQL语句的调用方法不完善而产生的安全隐患。一旦应用中存在SQL注入漏洞,就可能造成如下影响。值得注意的是,以下影响中攻击者都能够直接对服务器实施主动攻击,而不需要用户参与。

  • 数据库内的信息全部被外界窃取
  • 数据库中的内容被篡改
  • 登录认证绕过(应用程序登录不需要用户名和密码)
  • 其他,例如服务器上的文件被读取或修改、服务器上的程序被执行等。

SQL注入的威胁:

  • 错误查询导致信息泄露。

  • 联合查询导致信息泄露。

  • 绕过认证。

  • 篡改数据。

  • 读取文件。

根据数据库引擎的不同,通过SQL注入攻击还可能会达到下列效果。

  • 执行OS命令。
  • 读取文件
  • 编辑文件
  • 通过HTTP请求攻击其他服务器。

SQL注入安全隐患产生原因:

SQL注入攻击能够以开发者意想不到的方式改变SQL语句的构造,其中很大程度上都是因为字面量的缘故。字面量指的是SQL语句中的固定值。SQL中每种数据类型都有相应的字面量,其中最常用的字符串字面量和数值字面量。

字符串字面量的问题:

SQL标准规格中规定字符串字面量必须用单引号括起来。而若要在字符串字面量内使用单引号,就需要使用连续的两个单引号来表示。这被称为单引号转义。

例如: abc’de字符串,需要使用两个单引号来转义。 ‘abc’’de’

针对数值的SQL注入攻击:

Web开发中普遍使用的脚本语言(PHP,Perl,Puby等)多为动态类型语言,不限制变量类型。因此,理应填入数值的地方就有可能会被填入其他类型的字符。比如,假设一下SQL语句中南age列的类型为整型,存储的是年龄。

1
2
3
4
SELECT * FROM employees WHERE age < $age;
隐患:
SELECT * FROM employees WHERE age < 1DELETE
FROM employees;

由于数值字面量没有用单引号围住,所以,当出现非数值的字符时即被视为数值字面量终止。此例中,分号; 不是数值,因此分号以后的值就被排除了数值字面量,而被解释为SQL语句的一部分。

安全对策:

产生SQL注入漏洞的根本原因为,被指定为参数的字符串的一部分被排除出字面量,导致SQL语句发生了变化。因此,要防止SQL注入漏洞,就必须防止SQL语句在拼接过程中被更改。具体可采取如下两种方法:

  1. 使用占位符拼接SQL语句。
  2. 在应用程序中拼接SQL语句时,要确保字面量被正确处理,SQL语句不可被更改。

由于第二种方法的实施非常困难,因此常用第一种方式。

使用静态占位符。

静态占位符的绑定变量操作在数据库引擎中执行。含有占位符的SQL语句被直接发送至数据库引擎,数据库引擎执行编译等准备工作后确定SQL。岁后绑定值也被发送至数据库引擎,数据库引擎将收到的值填充进SQL语句后将其执行。

由于SQL语句是在包含占位符的状态下编译的,因此从理论上来说,之后SQL语句就不可能再被改变。

动态占位符:

动态占位符的方式为,首先在处理SQL的程序库中执行绑定变量操作,然后再将SQL语句发送给数据库引擎处理。绑定变量是字面量会被妥善处理,因此只要处理中没有Bug就不会遭受SQL注入攻击。

静态和动态占位符:

无论使用静态还是动态占位符都能消除SQL注入漏洞。但就理论上来说,静态占位符能够完全消除SQL注入漏洞出现的可能性,所以应当尽可能地采用静态占位符。

SQL注入的辅助性对策:

  • 不显示详细错误消息

    display_error=Off

  • 检验输入值得有效性

  • 设置数据库权限

手工SQL注入


学习过程中笔记的记录与资料整理。


坚持原创技术分享,您的支持将鼓励我继续创作!