前段时间研究了几天sql注入,而且经常用burp抓包分析包,于是天天和http源报文打交道,初看一大堆英文字符乱七八糟的内心就十分的恐惧.......
为了打消这种念头特地花了点时间来研究一下http报文到底是由什么东西组成的
1,什么是http报文
2,是由哪几部分组成
3,各部分含义
壹
什么是HTTP报文?
百度百科告诉我:HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。
言简意赅的说就是在网络的应用层上运行的一个协议,通过客户端和服务端一来一回,不断地请求和响应达到分享信息的目的
这里的关键就在于这一来一回,其实这样再加上burp的repeater模块去理解的话就很容易明白这个基本的原理了
贰
HTTP报文石油那几部分组成的?
上图
这里直接粘了burp里repeater模块的界面,抓了一个靶机的包来结合着分析一下HTTP报文
左半部分是请求包,右半部分是响应包
每一个HTTP报文(无论是请求包还是响应包)都拥有一个起始行(start line)和头部(header),只有响应包具有一个主体(body)
请求包结构
响应包结构
叁
起始行:在请求报文中说明要做些什么,在响应报文中说明出现了什么情况
起始行中每一部分之间间隔统一用空格(space)来分隔开
在请求报文中起始行结构均为 <method> <request-URL> <version> <请求方法> <请求的目标URL> <版本信息>
在响应报文中起始行结构均为 <version> <status> <reason-phrase> <版本信息> <状态码> <响应短语>
<请求方法>:
常用的就是POST GET HEAD三种;其中GET可以看做仅仅从服务器查看信息而不作任何改变,POST可以看做与服务器有着交互信息(例如登录表单,修改密码后台需要修改数据库内的信息等的),HEAD则是仅从服务器返回响应包的头部数据:
具体详见这个大佬博客:https://www.cnblogs.com/ldp615/archive/2012/07/27/http-get-post.html 真丶大佬
<请求目标URL>:就是服务器的URL没啥好说的,与头部中的rreferer类似
<版本信息>:在信息交互过程中各自需要标明各自的HTTP版本,以示友军而不开火,在这里版本都是HTTP/1.1
<状态码>:
100~199——信息性状态码
200~299——成功状态码
300~399——重定向状态码 <p65>
400~499——客户端错误状态码
500~599——服务器错误状态码
大家比较熟悉的404错误也就是web网页直接返回的状态码,大意就是客户端的错误(没有找到目标,真的没有找到还是假的没有找到呢?)
<响应短语>:正确返回即为OK,若要省略,也必须加一个空格(space)用以填充
头部:
请求包:
Host: 192.168.43.221 //所请求服务器主机ip地址
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0 //用户信息,前段Mozilla可以牵扯出一个很有意思的故事,这里就不引出了,有兴趣可以去这儿瞅一眼Mozilla5.0,后面的 Firefox/69.0 就是本机使用的浏览器标识
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //告诉服务器能够发送哪些媒体类型
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 //告诉服务器能够发送哪些语言
Accept-Encoding: gzip, deflate //告诉服务器能够发送哪些编码方式
Referer: http://192.168.43.221/sqli-labs/ //告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
Connection: close //链接状态
Cookie: JSESSIONID=9B6979B29B50C6DC007649A3F70DCAC2 //cookie
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
响应包:
Date: Thu, 26 Sep 2019 01:32:29 GMT //一个通用首部,在请求包中也能使用,显示收发报文的时间
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 //服务器使用的服务软件版本,以及语言版本
Connection: close //链接状态
Content-Type: text/html; charset=iso-8859-1
主体:
请求包GET中的是没有主体的,只有在POST中才有:(因为需要可能修改服务器上的数据,需要添加额外请求的信息)
响应包中的主体通常就是HTML超文本标记语言了