利用Python进行Web渗透测试(五):剖析HTTP请求

本篇将会涉及:

  • URL的结构
  • HTTP头域
  • HTTP状态码
  • 一个完整的HTTPget请求

在上一篇我们简单介绍了HTTP协议的概念和知识,本篇我们来详细剖析一下HTTP的请求,将这两篇综合起来,我们就对HTTP有了基本的认识和了解了。

URL结构解析

通常情况下,我们发起一个HTTP请求都是通过访问一个URL网址来实现。
比如我们打开百度的首页(http://www.baidu.com),就是对百度的服务器发起了一个HTTP的请求。

网址在我们的互联网生活中,很常见,那网址的结构又有什么讲究呢?
我们来看一个典型的URL——百度搜索“州的先生”:

https://www.baidu.com/s?wd=州的先生

这其中:

  • https——表示HTTP请求的使用的协议,这里使用的是https;
  • www.baidu.com——表示服务器端的域名地址;
  • s——表示我们的资源的路径,这里的s应当是搜索资源的路径;
  • wd=州的先生——这就是我们发送的请求的查询字符串;

HTTP头域

HTTP的头域描述和客户端和服务器端如何相互进行通信,并且提供了相关的事务信息。HTTP的头域包括了请求头和响应头。

HTTP响应的头域。

  • Connection:表示这个HTTP连接的模式,前面我们提到,HTTP的运行模式是客户端进行请求,服务器端进行响应,默认情况下,Connection的值为close,当这个过程完成,HTTP连接便断开。如果使用了keep-alive值,Keep-Alive功能能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
  • Content-Encoding:表示响应实体的编码方式。浏览器在发送请求的时候,会通过 Accept-Encoding头域 带上自己支持的内容编码格式列表;服务器端接收到之后,会从中挑选一种用来对响应实体进行编码,并通过 Content-Encoding 响应头指明选定的格式;浏览器拿到响应正文后,依据 Content-Encoding 进行解压。
  • Content-Type:表示响应实体的类型,用于定义响应的文件类型和网页的编码,以此来决定浏览器以什么形式、什么编码来读取这个响应实体。
  • Date:表示响应的时间。
  • Server:表示响应服务器的架构。
  • Transfer-Encoding:表示响应实体的传输编码模式,图中的”chunked”代表的含义是分块传输。

HTTP请求的头域。

  • Accept:表示浏览器声明请求接收的文件类型。
  • Accept-Encoding:表示浏览器声明接受的响应内容的编码格式。
  • Accept-Language:表示浏览器声明其接受的自然语言类型。
  • Cache-Control:用于浏览器控制网页的缓存。其各类值指示的是浏览器再次请求网页的时候,是使用缓存,还是向服务器发出请求。
  • Connection:表示浏览器声明此次请求的连接模式。
  • Cookie:浏览器发出的为了声明本次请求的身份、便于进行 session 跟踪而储存在本地的数据,通常由键值对组成,常用于用户身份的持久化认证。
  • Host:表示浏览器请求的主域名。
  • User-Agent:表示浏览器的标识。不同操作系统、不同版本、不同厂商的浏览器的标识各不一致,通过修改这个参数可以达到爬虫初级伪装的效果。

HTTP的状态码

不管是使用Wireshark进行抓包,还是在浏览器console控制台的各个选项卡里,我们都能发现到HTTP的状态码。这个简短的三位数,可以很直观的告诉我们,这次HTTP的请求的结果是什么。

HTTP的状态码由三个十进制的数表示,状态码的类型由第一位数来决定。
HTTP的状态码一共分为五种类型:

  • 1xx:表示服务器收到请求,需要客户端继续执行操作。
  • 2xx:表示请求成功,并且服务器对请求做出了响应。
  • 3xx:表示重定向。
  • 4xx:表示客户端请求错误。
  • 5xx:表示服务器错误。

在实际的应用当中,我们经常遇到的状态码有以下几种:

  • 200:请求成功
  • 304:重定向
  • 400:客户端请求语法错误
  • 403:客户端请求被拒绝,可能是权限问题
  • 404:请求的资源没有找到
  • 500:服务器内部错误
  • 502:网关或代理服务器错误
  • 504:网关超时,服务器没有及时从上游服务器接获取到全球

一个GET请求

GET请求方法是显式的请求方法,通过URL参数,将需要的所有信息发送给URL。例如上一节我们通过百度搜索“州的先生”就是向百度的服务器发送了一个GET请求。

下面,我们以www.httpbin.org这个网站作为测试示例。
httpbin.org是一个测试HTTP请求和响应的网站,基于Python + Flask 平台,能够测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。

一个成功的请求

我们点击www.httpbin.org页面上的/ip链接,页面会跳转到返回一个服务器的IP地址:

我们打开浏览器控制台的网络选项卡看看,其中:

  • Headers:表示的就是头域了,其中包含了请求头和响应头。
  • Preview:表示预览请求资源的响应实体。
  • Response:请求资源的响应实体。
  • Cookies:记录浏览信息或者用于认证的数据
  • Timing:请求这个资源所花费的时间

里面详细的显示了整个HTTP的请求和响应的信息。

我们看看Headers选项卡里面

General部分:概述本次HTTP请求的信息。

  • Request URL,表示请求的URL地址;
  • Request Method,表示请求的方法;
  • Status Code,表示响应的状态码;
  • Remote Address,表示响应服务器的IP地址

其余的Response Headers部分和Requests Headers部分就是我们之前介绍的请求头域和响应头域。

基本上,我们就完成了对一个HTTP请求的剖析。
如果有疑问,欢迎留言提问。

猜你也喜欢

发表评论

邮箱地址不会被公开。