自学web安全day08--SQL注入--(基础03)布尔盲注与时间盲注

188 阅读7分钟

必备知识:

自学web安全day07--SQL注入--(基础01)判断注入类型 - 掘金 (juejin.cn)

自学web安全day07--SQL注入--(基础02)获取数据库信息 - 掘金 (juejin.cn)

一.布尔盲注

1.什么是布尔盲注?

[概念1:盲注]

--在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面。

--此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。


[概念2:布尔盲注]

--SQL语句执行后,页面不返回具体数据,数据库只返回0或者1(真or假)。


2.布尔盲注的特性

在页面中:

①如果正确执行了用户构造的 SQL 语句,则返回一种页面,

②如果 SQL 语句执行错误,则执行另一种页面。

基于两种页面,来判断 SQL 语句正确与否, 达到获取数据的目的。

3.布尔盲注的基本流程

·原创作者:亚当Adam(稀土掘金作者),请注明转载!· image.png

4.布尔盲注常用函数

1.获取数据库长度时的常用函数或子句

①length() --MySql内置函数

语法:length(str)

计算单位:字节

utf8编码:一个汉字三个字节,一个数字或字母一个字节。

gbk编码:一个汉字两个字节,一个数字或字母一个字节。

常用select length(database());来获取数据库名长度


--示例:select length('亚当Adam'); --utf8编码

2个汉字,3个字符,所以长度为2x3+3x1=10(字节)

image.png


②char_length() --MySql内置函数

语法:char_length(str)

计算单位:字符

无论汉字还是数字或字母都算是一个字符

用length(str)<>char_length(str)可以判断是否含有中文字符

<>应用在sql92标准中,表示"!="不等于

<=>在MySql中表示is和=的作用,既可以判断NULL,也可以判断非NULL数据类型

--示例:select char_length('亚当');

image.png

③limit --MySql子句

limit([参数1],参数2) []内的代表可选参数,非可选即必选参数

参数1表示偏移位置,默认从0开始,0可以看成数组的0下标,实际代表第1行,如limit 0,5表示从第1行开始,返回5行

参数2表示返回记录行的最大数目,如limit 5表示返回前5行

--示例1:limit一个参数select * from users limit 4;

共有5行,只显示前4行 limit 4

image.png

--示例2:limit 两个参数 select * from users limit 1,4;

从第1+1=2行开始,显示4行(包括第2行)

image.png

2.获取数据库名时的常用函数或子句

①substr截取字符串 --MySql内置函数

语法:substr(string,start,length)

string:需要截取的字符串

start:[整数],从字符串的哪个位置开始截取,为1表示第1个字符,为-2表示从倒数第2个开始截取(包含倒数第2个)

length:截取的长度

--示例1:select substr('Adam loves Eve',6,5);

从字符串的第6个字符开始,截取长度为5的子串

image.png

--示例2:[倒着取]select substr('Adam loves Eve',-9,5);

从字符串的倒数第9个位置开始,截取长度为5的子串(截取的顺序依然是向右截取)

特性1:start为0,则函数整体返回一个空字符串

--示例3:select substr('Adam loves Eve',0,5);

无论length位置的数字怎么变,只要start为0,就返回空字符串

image.png

特性2:当start+length大于字符串的长度时,会返回从开始位置到结束位置的字串

--示例4:select substr('Adam loves Eve',5,15);

start+length为20>字符串总长度14

image.png

特性3:没有length参数时,默认返回从开始位置到结束位置的子串

--示例5:select substr('Adam loves Eve',5);

image.png

--如何遍历截取字符串的每个字符呢?

substr(database(),x,1):1<=x<=dl(database length数据库名长度)

--示例6:select substr(database(),1);

image.png

--但是要精确到每个字符具体是什么,就需要ASCII码表

ASCII表参考网站:ASCII 表 | 菜鸟教程 (runoob.com)

②ascii将字符转化为ascii值 --MySql

语法:ascii(str)返回str最左边字符的ascii码值

特性1:str为空字符串时,函数返回0

--示例1:select ascii('dvwa');

d->ascii值为:100

image.png

特性2:str为NULL时,函数返回NULL

注意:没有参数时,ascii会报错select ascii();错误的语法格式

--示例2:select ascii(NULL);

image.png

特性3:0~31和127作为控制字符,不显示,剩余的32~126则为普通字符,可显示

--因此遍历ASCII表即从32~126遍历即可

3.获取数据库表时的常用函数或子句

1.获取数据库表的数量

·count函数统计行数 --MySql

语法1:count(*)表示计算包含NULL值和非NULL值的行,即所有行

--已知identification的表如下

image.png

--示例1:select count(*) from identification;

总共有8行

image.png

语法2:count(expression)返回不包含NULL值的行

--示例2:select count(phone) from identification;

因为只有5行不为空

image.png

语法3:count(DISTINCT express)返回不包含NULL值且唯一的行

--示例3:select count(distinct phone) from identification;

因为只有4行非空且唯一(ejdj的phone与adam的phone相同,不唯一,因此合并成一条)

image.png

5.布尔盲注过程实践

参考:打靶Sqli-Labs记录--08关 - 掘金 (juejin.cn)

二.时间盲注

1.什么是时间盲注?

[概念1:盲注]

--在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面。

--此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

[概念2:时间盲注]

--在页面中,不管用户输入什么,数据交互完成以后目标网站没有错误和正确的页面回显

--这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行,当然也需要构造闭合。

2.时间盲注的特性

在页面中:

①无论输入什么,都只有一种返回页面

②从返回页面也看不出是否正确还是错误

基于正确与错误利用时间函数及if子句等等,来获取数据

3.时间盲注的基本流程

·原创作者:亚当Adam(稀土掘金作者),请注明转载!· image.png

4.时间盲注常用函数和子句

1.判断是否存在注入

sleep函数

语法:sleep(time)time表示秒

特性1:sleep函数返回的值是0

--示例1:select sleep(2);

image.png

特性2:sleep函数会作用在查询语句,表示睡眠一段时间后再查询

--示例1:select sleep(2);

image.png

特性3:当一个表中有多个字段时,查询的总睡眠时间为 time*行数 (秒)

--示例2:select *,sleep(2) from users;

总时间为2x5=10秒,因为每个字段都有5行数据

image.png

特性4:在查询语句中使用时,sleep()的持续时间取决于返回的记录。如果表不包含记录,MySQL将不会休眠。

在浏览器开发者模式下的网络中可以看到此次网页的执行时间为5000ms,说明存在注入漏洞

利用1'and sleep(5)23%1 and sleep(5)来判断是字符型注入还是数字型注入。

image.png

2.获取数据库长度

子句if

语法:if(exp1,exp2,exp3),如果表达式exp1正确,则执行表达式exp2,反之若表达式exp1错误,则执行表达式exp3

针对表达式exp1,可以设计一个绝对真值,比如'1=1'这种绝对正确的表达式。

示例1:select if(length(database())=7,sleep(3),3);

数据库本身长度为7,正确则执行睡眠3秒后再查询,结果返回0

image.png

同理,其他步骤只需要结合if子句和sleep函数即可

5.时间盲注过程实践

打靶Sqli-Labs记录--09关 - 掘金 (juejin.cn)