一.简介:
-
对于 Web 应用程序而言,用户核心数据存储在数据库中,例如:MySQL、SQL Server、Oracle 等。
-
通过 SQL 注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制 Web 服务器等其他操作。
-
SQL 注入由研究员 Rain Forest Puppy 发现,在 1998 年对外发表文章 《NT Web Technology Vulnerabilities》。
-
漏洞产生的主要原因是服务器对用户输入的信息没有做过滤。
-
攻击者通过构造特殊的 SQL 语句,入侵目标系统,致使后台数据库泄露数据的过程。
二.影响
-
用户信息被泄露,甚至被非法倒卖。
-
危害企业、政府、国家等组织安全。
-
注入后
-
查询数据
-
读写文件
-
需要高权限(root 权限)。
-
需要有文件写入权限 secure_file_priv 不是 NULL。
-
查看方法:show VARIABLES LIKE '%secure%'
-
-
需要知道绝对路径。
-
魔术引号 gbc 是关闭的,即 magic_quotes_gpc = Off。
-
-
执行敏感命令
-
三.攻击方式:
-
QL 注入即攻击者通过构造特殊的 SQL 语句,入侵目标系统,致使后台数据库泄露数据的过程。
-
将 SQL 代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的 SQL 服务器加以解析并执行。
四、分类:
按照注入的技术分类:
-
普通注入(union 联合注入)
-
概述
-
普通注入是根据后台数据库提示有价值的错误信息,进行注入操作,一般可以把攻击者需要获得的信息直接查询显示在页面中。
-
-
核心方法
-
使用 union 合并两个或多个 SELECT 语句的结果集,第二个语句中就包含我们想要查询的语句。
-
-
-
盲注
-
概述
-
当我们输入的注入语句被带入数据库查询,页面却不能回显结果时,如:应用程序只会返回一个通用的(对错信息或什么信息都不显示)页面或特定的语句,我们不能以此来判断注入是否成功,这种情况下就要用到 SQL 盲注的技巧。
-
目标网站的数据库是 Access,系统中没有类似 MySQL 的 Information_schema 库。
-
攻击者运用脚本通过仅有的判断信息对表中每个字段进行探测,从而实现注入。
-
-
分类
-
布尔型
-
概述
-
目标页面上没有显示数据内容的功能,仅有显示对错或有无(布尔值)的提示。
-
-
攻击方法
-
通过构造特殊 SQL 语句,观察页面返回的对错来判断 SQL 语句是否成立。
-
-
-
时间型
-
概述
-
对于某些页面,可能任何信息都不返回,甚至连记录是否存在都不告诉你,此时布尔型就失效了。
-
通过构造条件语句,条件语句判断为真则立即执行,否则延时执行。
-
-
攻击方法
-
通过 sleep() 函数,观察页面返回是否有延时来判断 SQL 语句是否成立。
-
-
-
-
-
报错注入
-
概述
-
当数据库的函数被传入错误参数时,会发生语法错误,正常情况下这类错误不应该回显到前端页面,但当中间件或程序未正常屏蔽时导致错误信息输出到屏幕上,就能用来进行报错注入了。
-
select/insert/update/delete 都可以进行报错注入。
-
-
报错注入条件
-
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
-
运维人员设置中间件的时候,错误输出没有屏蔽。
-
程序员写网站代码的时候,没有屏蔽错误信息输出。
-
-
-
宽字节注入
-
漏洞产生和后端编码有关,如后端采用 GBK 编码。
-
数据库使用 GBK 编码时,两个字符为一个汉字。
-
ASCII 码只有 128 个,大于 128 的就会和第二个字符组成一个汉字。
-
-
二次注入
-
有些程序在进行数据库插入的时候,仅仅对特殊字符进行了转义,但仍然将数据写入了数据库,如果插入的数据包含恶意内容,此时在其他地方查询该数据时,如果没有对取出的数据做校验处理(即认为写入即可信),直接使用该数据,就会造成 SQL 二次注入。
-
-
二次编码注入
-
php 代码中用了 urldecode() 等编码函数,对 url 中的特殊字符进行转码,可以利用此函数与 php 自身编码转换,产生漏洞。
-
以注入的位置分类:
-
GET 注入
-
可通过安装浏览器插件(hackbar)或直接通过浏览器地址栏提交。
-
-
POST 注入
-
可通过安装浏览器插件(hackbar)或 Burpsuite 来完成。
-
-
Cookie 注入
-
GET 和 POST 如果被过滤,可以试试。
-
一般通过 Burpsuite 来完成,修改 Cookie 进行注入。
-
-
UA 注入
-
一般通过 Burpsuite 来完成,修改 UA 进行注入。
-
以注入的参数类型分类:
-
数字注入
-
当输入的参数为整型时,如 ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。
-
-
字符注入
-
当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要引号闭合,而字符串类型一般要使用引号或其他符号来闭合。
-
-
搜索注入
-
当在搜索框注入的时候,称为搜索型。搜索类型一般要使用百分号进行闭合。
-