SQL注入

SQL 注入原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。


SQL注入攻击会导致出现拖库、撞库等数据库安全风险。它是数据库安全攻击手段之一,可以通过数据库安全防护技术实现有效的防护。


拖库是指黑客盗取了网站的数据库。

撞库是指黑客用拖库获得的用户名和密码在其它网站批量尝试登陆,进而盗取更有价值的东西。


SQL 注入分类

1. 数字型注入
2. 字符型注入
3. 其他类型

其实我觉得 SQL 注入只有两种类型:数字型与字符型。很多人可能会说还有如:Cookie 注入、POST 注入、延时注入等。
的确如此,但这些类型的注入归根结底也是数字型和字符型注入的不同展现形式或者注入的位置不同罢了。

以下是一些常见的注入叫法:

  • POST注入:注入字段在 POST 数据中
  • Cookie注入:注入字段在 Cookie 数据中
  • 延时注入:使用数据库延时特性注入
  • 搜索注入:注入处为搜索的地方
  • base64注入:注入字符串需要经过 base64 加密


SQL注入检测

如何判断有没有被SQL注入漏洞,通常有以下方法:

单引号判断法

在参数后面加上单引号,比如:http://xxx/abc.php?id=1‘。如果页面返回错误,则存在 SQL注入。

数字型判断

当输入的参 x 为整型时,通常 abc.php 中 SQL语句类型大致如下:select * from <表名> where id = x。

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此SQL 注入为数字型注入。

字符型判断

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:select * from <表名> where id = ‘x‘。

这种类型我们同样可以使用 and ‘1‘=‘1 和 and ‘1‘=‘2来判断:

Url 地址中输入 http://xxx/abc.php?id= x‘ and ‘1‘=‘1 页面运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x‘ and ‘1‘=‘2 页面运行错误,则说明此 SQL注入为字符型注入。



① 不要轻易信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

② 不要使用动态拼装sql,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。

③ 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

④ 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

⑤ 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

⑥ SQL注入的检测方法一般采取辅助软件或网站平台来检测。


举一个栗子:

  1.用户登录时,后台执行的数据库查询操作(SQL语句)是:

     【Select user_id,user_type,email From users Where user_id=’用户名’ And password=’密码’】
      2.由于网站后台在进行数据库查询的时候没有对单引号进行过滤,当输入用户名【admin】和万能密码【1’or’1】时,执行的SQL语句为:
     【Select user_id,user_type,email From users Where user_id=’admin’ And password=’1’or’1’】

      3.由于SQL语句中逻辑运算符具有优先级,【=】优先于【and】,【and】优先于【or】,且适用传递性。因此,此SQL语句在后台解析时,分成两句:

     【Select user_id,user_type,email From users Where user_id=’admin’ And password=’1’】和【’1’】两句bool值进行逻辑or运算,恒为真
       SQL语句的查询结果为TRUE,就意味着认证成功,也可以登录到系统中。输入用户名【admin】,密码【1’or’1】,即可登录成功。

SQL注入

上一篇:Redis持久化 - RDB和AOF


下一篇:MYSQL 全局锁和表锁