利用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 开发和测试很有帮助。
![](https://img2020.cnblogs.com/blog/2525040/202109/2525040-20210924111609335-260919058.png)
一个成功的请求
我们点击www.httpbin.org页面上的/ip链接,页面会跳转到返回一个服务器的IP地址:
![](https://img2020.cnblogs.com/blog/2525040/202109/2525040-20210924111633885-561352312.png)
我们打开浏览器控制台的网络选项卡看看,其中:
- Headers:表示的就是头域了,其中包含了请求头和响应头。
- Preview:表示预览请求资源的响应实体。
- Response:请求资源的响应实体。
- Cookies:记录浏览信息或者用于认证的数据
- Timing:请求这个资源所花费的时间
![](https://img2020.cnblogs.com/blog/2525040/202109/2525040-20210924111712752-1480195540.png)
里面详细的显示了整个HTTP的请求和响应的信息。
我们看看Headers选项卡里面
General部分:概述本次HTTP请求的信息。
- Request URL,表示请求的URL地址;
- Request Method,表示请求的方法;
- Status Code,表示响应的状态码;
- Remote Address,表示响应服务器的IP地址
其余的Response Headers部分和Requests Headers部分就是我们之前介绍的请求头域和响应头域。
基本上,我们就完成了对一个HTTP请求的剖析。
如果有疑问,欢迎留言提问。
文章版权所有:州的先生博客,转载必须保留出处及原文链接