一、SQL 注入简介与危害
1、什么是SQL注入
SQL 注入是一种常见的网络安全漏洞和攻击方式,它利用应用程序对用户输入数据的处理不 当,使得攻击者能够在执行 SQL 查询时插入恶意的 SQL 代码。通过成功注入恶意代码,攻击者可以执行未经授权的数据库操作,获取敏感信息、篡改数据甚至完全破坏数据库。
2、危害
【环球网科技 记者林迪】11月30日,万豪国际集团官方微博发布声明你,其旗下喜达屋酒店的客房预订教据库被黑客入優侵,在2018年9月10日或之前曾在该洒店预定的最多约5亿名客人的信息或被泄露。据悉,本次黑客攻去是自雅虎宜布大约30亿用户的信息被黑客窃取以来规模最大的一次。
二、SQL 注入分类
1、Union注入
- 概念
union查询注入是最基础的注入。在 SQL 中, UNION 操作符用于合并两个或多个SELECT 语句的结果。union 查询注入利用 UNION 关键字可以追加一条或者多条额外的 SELECT 查询,并将结果追加到原始查询中。联合查询会“纵向”拼接两个或多个 SELECT 语句的结果。
- 适用条件
(1)网页存在注入点,有回显。
(2)需要满足 union 语句要求,即:
union 前后两个 select 的结果集应具有相同列数;
union 前后两个 select 的结果集对应列应是相同数据类型
- 注入步骤
(1)首先判断是否存在注入点及注入的类型。
(2)使用 ORDER BY 查询列数、观察回显的位置。
(3)获取数据库名。
(4)获取数据库中的所有表名。
(5)获取数据库的表中的所有字段名。
(6)获取字段中的数据。
2、报错注入
- 概念
报错注入是利用网站的报错信息来带出我们想要的信息,就是在错误信息中执行 sql 语句 使用条件 考虑到成功率和时间成本比 union 成本高,需要数据库有错误信息,一般在 union 条 件不能实施的时候,在查询,新增,修改能都使用。
- 常用报错注入命令
(1)group by 重复键冲突
( count()+floor()+rand()+group by 组合)就是利用 count()、rand()、floor()、 group by 这几个特定的函数结合在一起产生的注入漏洞。
#列:
?id=1 and (select 1 from (select count(*),concat(0x5e,(select version() from
information_schema.tables limit 0,1) ,0x5e,floor(rand(0)*2))x from
information_schema.tables group by x)a)
(2)xpath 报错
输入命令报错并带回当前用户名。?
id=1 and extractvalue(1, concat(0x5c, (select version()),0x5c))
其中 extractvalue()函数语法、参数定义及作用如下:
从目标 XML 中返回包含所查询值的字符串第一个参数:XML_document 是 String 格式, 为 XMIL 文档对象的名称 。
第二个参数:XPath_string (Xpath 格式的字符串)
SELECT extractvalue('<root><username>luojie</username><age>18</age></root>', '//username')
(3)updatexml 报错
?id=1 and updatexml(1,concat(0x5e,(select version()),0x5e),1)
updatexml(xml_document,xpath_string,new_value)
第一个参数:XML_document 是 String 格式,为 XML 文档对象的名称,文中为 Doc1。
第二个参数: XPath_string (Xpath 格式的字符串),如果不了解 Xpath 语法,可以在网上查找教程。
第三个参数: new_value,String 格式,替换查找到的符合条件的数据。
SELECT updatexml('<root><username>luojie</username><age>18</age></root>',
'//username','<name>luojiejie</name>')
3、布尔盲注
- 概念
当改变浏览器传给后台 SQL 的参数后,浏览器没有显示对应内容也没有显示报错信息时,无法 使用 union 联合查询注入与报错注入,这时候可以试试看能否使用布尔注入。
- 使用条件
一般情况下,当带入参数为真和假时,页面会有不同的反映,比如有无显示也是一种不同,布 尔盲注就是根据这种不同来反推我们输入的条件是真还是假。
4、延迟盲注
- 概念
也称延时注入、时间注入等,这种注入方式在传给后台的参数中,设置了一个 if 语句,当条件为真时执行 sleep 语句,条件为假时无执行语句,然后根据浏览器的响应时间来推测 sleep 语句是否被执行,进而推测 if 条件是否为真。 延时盲注与布尔盲注的核心思想都是通过浏览器两种不同的响应来推测输入的条件的真假,布尔盲注是条件真假时页面会有不同显示,延时盲注则是显示结果真假只能从响应时间上进行推测。
- 使用条件
union,报错、布尔等搞不定的时候才考虑,效率极低。
5、DNSlogs 盲注
- 概念
DNSlog 盲注就是通过 load_file 函数发起请求,然后去 DNSlog 平台接收数据,需要用到 load_file 函数就是需要用到 root 用户读写文件的功能。
- 读写文件
开启读写文件功能
(1)、查看配置
show VARIABLES like 'secure_file_priv'
secure_file_priv参数配置 | 含义 |
ure_file_priv=null | 表示限制mysqld 不允许导入或导出 |
secure_file_priv='/tmp/' | 表示限制mysqld 的导入或导出只能发生在/tmp/目录下 |
当secure_file_priv= | 表示不对mysqld 的导入或导出做限制 |
(2)、修改配置文件,并重启
路径:\phpStudy\PHPTutorial\MySQL\my.ini
secure_file_priv=
#查看
show VARIABLES like 'secure_file_priv'
6、DNSlog 盲注
- 概念
回到 DNSlog 知识,这个需要有文件读取的权限,如果有着权限又不需要使用 DNSLOGS 来完成注入的 。dnslog
7、二次注入
- 概念
二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
8、堆叠注入
- 概念
在 SQL 数据库中,每条语句是以;分开的,堆叠注入就是一次性注入并执行多条语句(多语句 之间以分号隔开)的注入方式。 与 union 对比 union 联合查询注入执行的语句类型是有限的,可以用来执行查询语句。堆叠注入可 以执行的是任意的语句,如增删改等。