SQL注入原理


SQL注入漏洞(SQL injection)

仅供学习交流,谨记国家网络安全法。

Ax_概述


为了更好的研究SQL注入,必须深入每种数据库的SQL语法及特性。

!!! 是Web层面最高危的漏洞之一。

在2005年前后,SQL漏洞随处可见,用户在搜索时,输入一个单引号就可以检测出这种漏洞。

2008年-2010年期间,SQL注入漏洞连续3年在OWASP年度十大漏洞排行中排名第一。

定义:

绕过程序限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。

原理:

SQL注入形成的原因就是:用户输入的数据被SQL解释器执行。

在一个表单中:

账号: 密码:

输入用户名“ `or 1=1– ” ,密码随意,也可不填,点击登入,发现可以正常登入,这是为什么呢?

select count(*) from admin where username=’admin’ and password=’password’

在数据库中,存在admin用户,并且密码为password,所以此时返回结果为“1”。显然,1大于0,所以通过验证,用户可以成功登陆。

select count(*) from admin where username=’’ or 1=1–’ and password=’’

终于找到问题的根源了,SQL语句的本义是:

username=‘账户’ and password=‘密码’

而现在变为:

username=‘账户’ or 1=1–’ and password=‘’

此时的password被注释!,而username=‘账户’ or 1=1 这句话永远为真,最终执行相对于:

select count(*)from admin //查询admin表所有数据条数

很显然,条数大于1,验证通过,这就是一次简单的SQL注入,虽然简单,但是危害很大。可以对专门的靶场进行试验。

利用以下语句可以直接把admin表直接删除,危害极大,请勿随意对网站进行测试,仅供学习交流

`or 1=1; drop table admin –

PS1:在SQL注入前,要判断该数据库类型。

注入漏洞分类

明白了概念,对注入的作用是事半功倍滴效果呀!

常见的SQL注入类型有数字型和字符型。也有更细的分类,不管分类如何,攻击者的目的只有一点—>绕过程序限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。

数字型注入

​ 当输入的参数为整型时,则可以认为是数字型注入。

比如:ID、年龄、页码等等。

假设URL为http://www.xxx.com/test.php?id=8

可以猜测SQL语句为:

select * from table where id=8

测试步骤

①HTTP://www.xxx.com/test.php?id=8'

使页面报错,无法从数据库获取数据,使页面出现异常。

②HTTP://www.xxx.com/test.php?id=8 and 1=1

语句执行正常,返回数据与原始数据无任何差异。

③HTTP://www.xxx.com/test.php?id=8 and 1=2

语句执行正常,但无法查询出数据,因为“and 1=2”始终为假。返回数据与原始请求有差异。

以上三个步骤全部满足则程序可能存在SQL注入漏洞。

  1. 数据型注入最多出现在ASP、PHP等弱语言中。 #弱类型语言会自动推导变量类型。

字符型注入

当输入的参数为字符串时,称为字符型。字符型一般需要单引号来闭合。

  • 数字型

    select * from table where id = 8
    
  • 字符型

    select * from table where username='admin'
    

字符型的关键在于:如何闭合SQL语句以及注释多余的代码。

当查询字符串时,SQL代码如下

select * from table where username ='admin'

①输入“admin and 1=1”,无法进行注入。被数据库当作字符串查询

select * from table where username ='admin and 1=1'

②输入“admin’ and 1=1 –”,继续注入。

select * from table where username ='admin' and 1=1 --'

③闭合单引号及注释多余代码。例如update语句:

update Person set username='username',set password='password' where id=1

在username处或password处插入” ‘+(select @@version)+’ “,最终执行SQL语句:

update person set username='username',set password=''+(select @@version)+''where id=1

利用两次单引号闭合才完成SQL注入。

SQL Server 连接符为“+”

Oracle连接符为“||”

而Mysql连接符为空格

④例如Insert语句,对title字段注入:

Insert into users(username,password,title) values('username','password','title')

对title字段注入,和Update一样。

Insert into users(username,password,title) values('username','password',''+(select @@version)+'')

SQL注入分类

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

常见数据库注入

  • 查询数据
  • 读写文件
  • 执行命令

Bx_目标


  • 执行数据库语句
  • 获取数据库信息
  • 利用数据库信息
  • 登入后台
  • 获取权限,shell

Cx_方法


Yx_附:术语

  • SQL Structured Query Language 结构化查询语言
  • SQL injection SQL注入

Zx_附:参考文献

[1]《安全测试》

[2]《Web 安全深度剖析》 张炳帅


文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录