夯实基础 | HTTP协议

admin 2024年10月21日12:20:18评论14 views字数 20095阅读66分59秒阅读模式

安全君呀设为"星标️"

第一时间收到文章更新

声明: 安全君呀 公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。

文章声明:本篇文章内容部分选取网络,如有侵权,请告知删除。

简要铺垫

网络通信的流程

重点关注一下域名、IP地址和端口号即可。

OSI七层模型和TCPIP5层模型

夯实基础 | HTTP协议

每层中的协议

如下我们是按照 TCPIP 5层模型来给大家列举协议:

应用层的协议:HTTP协议,HTTPS协议,DNS协议,TELNET协议,FTP协议,SMB协议,RDP协议
传输层的协议:例如TCP、UDP、RTP、SCTP、SPX、ATP、IL
网络层的协议:例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25
数据链路层的协议:主要是一些MAC子层协议,例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE
802.11、FDDI、PPP
物理层:这一层主要说的是电信号,例如线路、无线电、光纤、信鸽

重点关注TCP和UDP协议

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。
使用UDP的应用:域名系统

(DNS);视频流;IP语音(VoIP)。

每次协议其实都是按照自己协议对应的消息格式来给网络请求数据包加工和封装了相应的数据部分

夯实基础 | HTTP协议

用户产生的数据,比如输入的查询数据是封装在了应用层的,不管是测试服务端程序功能也好,还是担心用户输入恶意数据也好,所以我们要重点关注应用层的数据

什么是端口

在网络技术中,端口包括逻辑端口和物理端口两种类型。

物理端口是用于连接物理设备之间的接口,如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口。

逻辑端口是指逻辑意义上用于区分服务的端口,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。我们这里讲的是逻辑端口。

端口的作用

端口号的主要作用是表示一台计算机中的特定进程所提供的服务。网络中的计算机是通过IP地址来代表其身份的,它只能表示某台特定的计算机,但是一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务、Web服务等,我们就通过端口号来区别相同计算机所提供的这些不同的服务,如常见的端口号21表示的是FTP服务,端口号23表示的是Telnet服务,端口号25指的是SMTP服务等。

端口的分类

TCP与UDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号。

按照端口号分类

公认端口:0~1023。应与HTTP通信,2它们紧密绑定于一些服务,通常这些端口的通讯明确表明了某种服务的协议,如:80端口对1端口绑定与FTP服务,25端口绑定于SMTP服务,135端口绑定与RPC(远程过程调用)服务。

注册端口:1024~49151。它们松散的绑定于一些服务,也就是说有许多服务绑定于这些端口,这些端口同样用于其他许多目的,如:许多系统处理端口从1024开始

动态或私有端口:49152~65535。理论上,不应为服务分配这些端口,通常机器从1024开始分配动态端口。例外:SUN的RPC端口从32768开始。

按照协议类型分类:按协议类型划分可分为TCP端口、UDP端口、IP端口、ICMP。

TCP端口:即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP的21端口,Telnet的23端口,SMTP的25端口,HTTP的80端口。

UDP端口:即用户数据报协议端口,无需在客户端和服务器端建立连接,安全性得不到保障。常见的DNS的53端口,SNMP(简单网络管理协议)的161端口,QQ使用的8000和4000端口。

保留端口:UNIX有保留端口号的概念,只有超级用户特权的进程才允许给它自己分配一个保留端口号。这些端口号介于1~1023之间,一些应用程序将它作为客户与服务器认证的一部分。

端口使用的注意事项

不要使用端口号小于1024的端口。

端口号一般习惯为4位整数,在同一台计算机上端口号不能重复,否则,会产生端口号冲突。

客户端端口号因存在时间很短暂又称临时端口号,大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的 。

常用端口

应用层常见的端口和对应传输层协议:
HTTP 80 使用TCP
DNS 53 使用TCP和UDP
HTTPS 443 使用TCP
SMB 445 使用TCP
TELNET 23 使用TCP
FTP 20/21 使用TCP

图解:

夯实基础 | HTTP协议

网络编程socket抽象层

我们使用的应用程序,比如各类浏览器、qq、wechat、网易云音乐等等都会使用网络编程,来完成程序和外部的网络交互。

说明:下面那个运输层说的就是传输层。

我们不管是做开发、测试、安全等工作,绝大多数都是要关注应用层的数据,因为用户产生的数据都加工在这一层,而应用层主流使用的协议是HTTPHTTPS协议,所以我就要好好学习HTTP协议,看看数据到底加工成了什么样子,HTTP协议又该注意哪些问题。

前端开发

HTMLCSSJavascript等技能

HTTP协议

HTTP协议,全称超文本传输协议(英文:HyperText Transfer Protocol)是一种使用非常广泛的用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。为什么称之为超文本传输协议呢,不知道大家还记不记的我之前给大家讲前端技术的时候提到过前端页面骨架是HTML语言写出来的,HTML全称为超文本标记语言,HTTP协议最开始就是为了传输HTML页面数据来制定的一种协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

协议是什么?我们要搞清楚这个概念,协议就是双方协商好的做一个事情的标准,就比如说我们国际通用语言是英语,各国通信都用英语,这就是个协议(我相信以后可能都用汉语,哈哈,中国博大精深),这个标准对于我们的网络来说,其实指的就是一种数据格式。

比如,我抓取一下请求百度的HTTP协议数据包给大家看一下,抓取网络请求数据包大家还不会,没关系,先看一下大致的数据格式,后面我们会细说里面的数据都是干什么的,怎么抓取数据包等内容。(burp suite fiddler charles)

请求数据:
GET / HTTP/1.1
Host: www.baidu.com
Sec-Ch-Ua: "Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/107.0.0.0 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,imag
e/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close



响应数据:
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0x91e10cfd000dde28
Content-Type: text/html; charset=utf-8
Date: Mon, 31 Oct 2022 13:42:24 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
Set-Cookie: BAIDUID=29AF8030E443077B7DD2865CB24D3FAF:FG=1; expires=Thu, 31-Dec-37
23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=29AF8030E443077B7DD2865CB24D3FAF; expires=Thu, 31-Dec-37
23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1667223744; expires=Thu, 31-Dec-37 23:55:55 GMT; maxage=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=29AF8030E443077B80FD080238D8E82E:FG=1; max-age=31536000;
expires=Tue, 31-Oct-23 13:42:24 GMT; domain=.baidu.com; path=/; version=1;
comment=bd
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie:
H_PS_PSSID=36558_37584_36884_36803_37662_36786_37534_37499_26350_37344; path=/;
domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1667223744356208871410511697286026616360
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1
Connection: close
Content-Length: 367145
<!DOCTYPE html><!--STATUS OK--><html><head><meta....
....

请求与响应

HTTP协议是基于TCP/IP协议之上的应用层协议。是基于 请求-响应的通信模式

不管是请求数据还是响应数据,都要按照OSI七层模型中每层模型对应协议的格式要求来加工数据。并且请求和响应数据的传输是在TCP连接通道中进行传输的。

使用HTTP协议的程序都是先请求然后拿到响应,客户端没有发送请求,服务端是不给响应的,那么能不能服务端主动发送请求给客户端呢,HTTP协议不行,可以换成WebSocket等协议,支持服务端主动给客户端发请求,所以不同的协议有着不同的通信模式特点。

在浏览器地址栏键入网址,按下回车之后会经历以下流程:
1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2. 解析出 IP 地址后,根据该 IP 地址和HTTP协议默认端口 80,和服务器建立TCP连接;
3. 浏览器发出读取服务端资源的HTTP请求,比如请求一个网站页面,我们知道我们在浏览器上看到的每一个
页面其实都是对应着服务端的某个HTML代码文件
4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5. 客户端收到数据之后释放TCP连接;
6. 浏览器将该html文件代码程序解析执行,展示页面效果;

HTTP协议特点

HTTP协议有两个特点:无状态和无连接

无状态保存:HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个协议对于之前发送过的请求或响应里面携带的数据都不做持久化处理。这样的话就有个问题产生了,没办法做会话维持,也就是即便用户输入用户名和密码登录了这个网站,当操作网站上的其他功能的时候,还需要再输入用户名和密码,因为上一次输入数据的和下一次HTTP请求已经没有关系了,每次请求都是一个新的HTTP请求,并且HTTP协议加工数据的时候,不会携带上一次的请求数据,导致没办法进行会话维持,所以后续就出现了Cookie、Session、Token等技术来进行会话维持,也就是保持客户端和服务端的登录状态,方便用户操作,关于Cookie、Session、Token等技术以及相关的渗透手法我们在后面的课程会细说,这里暂时不多做介绍。

无连接:无连接的含义是限制每次建立了TCP连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。

http代理与socks5代理区别:
概念不同:
HTTP代理,能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等;
SOCKS代理,与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。
SOCKS代理又分为SOCKS4和SOCKS5。SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。

代理速度不同:
http代理工作在应用层上,只允许用户通过HTTP协议访问外部网站;
Socks5代理工作在会话层,不要求应用程序遵循特定的操作系统平台,Socks5代理只是简单地传递数据包,而不必关心是何种应用协议(比如FTP、HTTP和NNTP请求)。
由上可知,Socks5代理比http代理速度要快得多。

适用范围不同:
socks包含https,https包含http,socks代理适用的范围最广;
https协议只支持http/https,一般的ie代理用的http/https协议。如果是应用层协议一般不用http/https,有些应用程序只能使用socks代理。

数据格式(重点)

为什么说数据格式是重点内容呢,因为HTTP协议的所有数据都是可以在客户端修改的,而大多数的网络攻击都是攻击者将攻击代码放到了HTTP请求数据中,然后发送给了服务端,服务端没有做好防范而保存或者执行了攻击代码,导致服务端的电脑或者服务器受到了攻击,甚至服务端将保存的攻击代码又发送给了客户端,导致客户端用户的电脑或者手机等设备遭受了攻击,攻击代码可能存在于数据的任意位置,所以搞清楚数据包中的数据和格式对我们来说非常重要。

HTTP协议是基于请求和响应模式的,我们看数据格式的时候也分两个方面看,一个是请求数据,另外一个是响应数据,我们就按照上面我们抓取的数据包来对比着看。

数据格式对我们安全、开发、测试等人员是至关重要的,为了让大家学习到每个知识点的时候都能够理解的透彻一些,我们先学习一下数据包抓取和修改,然后一边抓包一边学习,真正将实战和理论结合起来。

请求数据格式

先看图解:总共四个部分:请求行、请求头、空行、请求数据(请求正文、请求体)

夯实基础 | HTTP协议

请求行

每个HTTP请求的第一行称之为请求行,都由两个空格分割的三个数据组成

组成:
请求方式(也叫做请求动作) URL 协议/协议版本
举例:
GET / HTTP/1.1

下面我们来介绍一下由空格分隔的三个数据有什么作用。

GET请求

GET翻译成中文是"去取",取是什么意思,就是去人家那儿拿东西,所以GET这个请求动作就是向服务端获取资源(数据)用的请求方法,服务端收到HTTP数据包之后,看到请求行中的这个动作是GET,就知道这个请求是来找我要东西的,那么到底要什么资源呢,是由HTTP数据包中的其他数据指定的,这里我们先不做多提,后面会讲到。

夯实基础 | HTTP协议

上面这些都是在请求服务端的资源拿来看的,所以都是用的GET方法,那么能不能用其他请求方法来请求资源呢,其实是可以的,只要服务端那边支持你用其他方法请求资源,那么就可以,但是这里先不做过多解释,后面会提到。

我们直接去看下面数据包抓取的那一节课程,学习完抓包之后再回到这里继续学习。

接下里我们抓取一下百度的请求数据包

GET / HTTP/1.1
Host: www.baidu.com
Cookie: PSTM=163823; BAIDUID=1340CFD63FFE:FG=1; BD_UPN=123143;
BIDUPSID=CAC1131E2FD4ED7; BDUSS=0tDT135jZ; BAIDUID_BFESS=1340CEF9AFFD6663035...1;
BD_HOME=1
Cache-Control: max-age=0
Sec-Ch-Ua: "Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,imag
e/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

响应效果

夯实基础 | HTTP协议

URL

URL全称UniformResourceLocator,意为统一资源定位器(或者叫统一资源定位符),也叫做网页地址

互联网上的每个文件都有一个唯一的URL,它是用来指出信息的所在位置。

统一资源定位符将从因特网获取信息的六个基本元素包括在一个简单的网络地址中:

比如:http://www.jaden.com/news/index.html?id=250&page=1
https://www.baidu.com/s?wd=jaden
1、http --> 传送协议 https
2、// --> 层级URL标记符号(为//,固定不变)
3、www.jaden.com --> 服务器(通常为域名,有时为IP地址)
4、端口号 --> 以数字方式表示,HTTP的默认值为80,https默认是443,可省略(看不到,但是有),如果是IP地址的写法的话就是这样的122.1.33.2:80
5、/news/index.html为路径,也叫URI -- > 通常以“/”字符区别路径中的每一个目录名称
6、?id=250&page=1为查询参数 --> 也叫做get请求携带的数据,键值对的格式,以“?”字符为起点,每个
参数以“&”隔开,再以“=”分开参数名称(键)与数据(值)

大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。
同样,80是超文本传输协议文件的默认使用的端口号,因此一般也不必写明。一般来说用户只要键入统一资源
定位符的一部分www.jaden.com/news/index.html?id=250&page=1就可以了

而我们现在要说的请求行中空格分隔的第二部分的这个URL是精简的部分:

包含两个内容:路径URI+查询参数
/news/index.html?id=250&page=1
域名和端口号分到了HTTP请求头键值对中,固定的格式要求,主要是方便请求发出去之后,后面的一些网络请
求处理。

这两个内容对于我们向服务端要资源来说是至关重要的, 路径是指明我们想要的资源文件是什么,在互联网中一切皆资源,而存放资源的最小单位就是文件,查询参数指明了我们想要的资源文件中包含哪些数据。

举个例子,服务端就像一个大商场,商场中有各种商店,每个商店中又有各类商品(资源),你来商场买东西(GET请求获取资源),你要明确的告诉我服务端,你到底要哪个商店的哪个商品。

说到URL定位资源,我们就有必要说一下静态资源(静态页面和静态文件等)和动态资源(相同页面展示不同的数据)。关于静态和动态资源,我整理了四个重点内容来给大家分析。

静态网页(静态的HTML文件)

静态文件

其实静态网页也是静态文件的一种,但是平常我们说的静态文件,主要指的是css、js、图片图标文件等内容。

夯实基础 | HTTP协议

那么我们讲前端技术的时候也说过,你输入一个网址发送请求,看上去你好像只发送了一个请求,但实际上可能会伴随着好多好多额外的请求,这些请求多数都是静态资源的请求,都是服务端将HTML页面返还给客户端之后,HTML页面中的代码自行给服务端发送的请求。这些请求我们抓包的时候其实也能看到。

动态网页

数据实时更新,需要刷新服务器的返回数据。

伪静态网页

伪静态其实就是所谓的看上去是静态页面,实际上是动态页面

夯实基础 | HTTP协议

我们发送请求时,不管请求是什么样的资源,使用了什么样子的路径和查询参数,最终都是由服务端(也叫做后端)解析之后做出对应的响应,路径和参数到底对应着服务端的哪些资源,也是服务端自行设计好的

说到这里,大家应该可以理解请求行中的第二部分,也就是URL到底表示什么意思了。

协议和版本

请求行中的最后一个数据,是 HTTP/1.1 ,表示说,我们现在采用的应用层传输协议为HTTP协议,他的版本为1.1,应用层协议我们前面简单介绍过,除了HTTP协议之外,还有好多其他的协议,只不过那些协议多应用于一些特殊场景,这里我们先不做介绍,网络传输我们接触最多的就是HTTP协议,那有同学可能会问,怎么写的不是HTTPS啊,注意,HTTPS其实还是HTTP协议数据,只不过加了加密和认证等过程,所以这里不管是HTTP还是HTTPS,统一写的都是HTTP,HTTP又分很多个版本,HTTP 2.x早就已经出来了,但是并没有普及下来,所以大家还是用的1.1版本,但是不管哪个版本,主要都是一些数据格式上的调整,大家不需要过于研究,会了1.1,以后即便是2.x普及了,那么你也能够很快学的懂,因为万变不离其中。

请求方法介绍

请求方法又叫做请求动作,又叫做HTTP方法动词

客户端给服务端发送请求,其实都是想对服务端的资源进行一些操作,比如查询一下某些数据、修改、增加、删除某些数据等动作,那么为了服务端(也称之为后端)更加方便的理解客户端对资源的操作动作是什么,或者说更加方便服务端对客户端发送请求的动作进行限制,出现了这么几个请求方法,HTTP的请求方法其实有十几种,但是比较常用的有如下9种

一般:POST、GET、HEAD、PUT、PATCH、OPTIONS、DELETE、CONNECT、TRACE
常用:GET、POST、PUT、DELETE
最常用:GET、POST

但是其实一种请求方法就可以完成上面的增删改查的动作,比如GET请求方法,那么为什么不用一种呢?接下来我们按照常用等级来进行详细的讲解。

POST和GET的区别

前面我们学写了一下GET请求,接下来学一下POST请求方法,为什么要学习它呢,因为网络上最常用的请求方法就是GET和POST,很多场景我们通过单纯的get请求来搞的话会不太方便,POST请求也是HTTP请求方法,没有必要细抠概念,我们只要看一下POST和GET的区别就明白了。

第一个区别:

GET请求用于向服务端获取数据
POST请求用于向服务端提交数据,主要用于添加数据,但是在很多公司的项目中,更新和删除数据也都在使用post请求。
如果按照restful规范来说的话,更新数据用putpatch方法,删除数据用delete方法。

那为什么会有上面的区别呢,我们往下看

我们抓取一个POST请求数据包和一个GET请求数据包,对比来看,我们直接抓取我们的pikachu靶场的吧。

GET

GET /pikachu/vul/sqli/sqli_str.php?name=jaden&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
Host: 192.168.0.25
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,imag
e/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.0.25/pikachu/vul/sqli/sqli_str.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=l7shvia2bojf4a2ejbr3d26176
Connection: close

POST

POST /pikachu/vul/sqli/sqli_id.php HTTP/1.1
Host: 192.168.0.25
Content-Length: 30
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.0.25
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,imag
e/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.0.25/pikachu/vul/sqli/sqli_id.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=l7shvia2bojf4a2ejbr3d26176
Connection: close

id=1&submit=%E6%9F%A5%E8%AF%A2

很明显,从数据包上来看,GET和POST方法所发送的请求数据包在格式上是一样的,但是携带的请求数据放在了不同的地方。

GET携带的请求数据在请求行的URL部分,POST携带的数据在空行后面的请求数据部分。

基于数据包我们来说一下GET和POST的其他区别,本质上没有什么太大的区别。

1. 数据所在位置不同,能携带的数据长度不同
由于get方法携带的数据在url上,那么携带的数据大小就有长度限制了,因为url长度有上限,比如IE
限制url长度不能超过2083个字符,不同浏览器上限不同,但是都有上限。RFC 标准明确说明,不对URL进行
长度限制,但是浏览器一般都会做限制。
post方法携带的数据在请求数据部分,理论上是没有大小限制的
但是其实get请求的也是可以在请求正文的地方来携带数据的,只是一般都不这样用而已,所以即便是看
到了这样的情况,也不要感觉意外。

2. 安全性不同
由于get方法携带的数据在url上,那么数据就会在浏览器地址栏显示出来,如果没有对数据进行加密的
话,直接就可以在地址栏看到明文信息,安全性低
post方法携带的数据在请求数据部分,在浏览器上是不会直接显示出来的,但是懂技术的人也能想办法
看到,比如抓包,所以其实数据不加密的话还是没有安全性可言的。
所以说其实表面上post比get安全性高一些,但是其实差不多

3. 使用场景不同
post请求多用于给服务端提交数据,比如注册、上传文件、提交评论、修改密码等等
get请求多用于去服务端获取数据,查看商品信息、查看个人信息等等
敏感数据操作的场景都使用post,比如登录注册等场景一般都使用post,因为最起码数据隐蔽一些。

4. 可传输的数据格式不同
GET只能传输文本数据
POST可以传输文本和二进制数据
但是其实GET完全可以传输文本和二进制数据,只需要对二进制数据urlencode即可,也就是URL编码一下。

5. 幂等性不同
GET 请求的处理,实现成"幂等"的
POST 请求的处理,不要求实现"幂等"
关于幂等性,大家看下面的介绍。

6. 再说一个理所应当的不同点
由于携带的数据在请求包体的不同位置,那么服务端(后端)提取请求数据的时候的方式不同。

幂等性概念:幂等通俗来说是指不管进行多少次重复操作,都是实现相同的结果。

关于HTTP请求方法的幂等性说明,可以参考:https://blog.csdn.net/imjcoder/article/details/122106291

其他请求方法

HEAD

与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)

PUT

向指定资源位置上传其最新内容,主要用于上传文件、更新整体数据。

PATCH

用来更新局部资源

DELETE

请求服务器删除请求所标识的资源。

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

OPTIONS

这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用 ' * ' 来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

夯实基础 | HTTP协议

TRACE

回显服务器收到的请求,主要用于测试或诊断

不安全的请求方法

这个我们将安全渗透的时候再提吧,这里主要是让大家知道一下有这么一个知识点,有些请求方法不安全,需要服务端禁止

PUT:由于PUT方法自身不带验证机制,利用PUT方法可以向服务器上传文件,所以恶意攻击者可以上传木马等恶意文件。
DELETE:利用DELETE方法可以删除服务器上特定的资源文件,造成恶意攻击。
OPTIONS:将会造成服务器信息暴露,如中间件版本、支持的HTTP方法等。
TRACE:可以回显服务器收到的请求,主要用于测试或诊断,一般都会存在反射型跨站漏洞

请求头

请求头是以键值对的形式来加工的,比如 Content-Length: 30 , Content-Length 称之为键, 30 是键对应的值,就像我的姓名为守夜人Jaden,是一组描述信息。

通过前面我们抓取的几个请求数据包中,提取出几个重要的请求头键值对来给大家讲解。

Accept(*)

表示浏览器支持的 MIME 类型;MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。

text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内
容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,
subtype 是 type 中范围更明确的类型,即大类中的小类。
  
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
  text/html表示 html 文档;
  Application:用于传输应用程序数据或者二进制数据;
  application/xhtml+xml表示 xhtml 文档;
  application/xml表示 xml 文档。

浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 /,优先顺序是它们从左到右的排列顺序(表示我当前的浏览器希望接受什么类型的文件,这是请求首部,当服务器没有客户端想要的资源的媒体类型时,会返回406 Not Acceptable 响应

Referer(*)

该消息头用于表示发出请求的原始URL(例如,因为用户单击页面上的一个链接),也就是说它记录着本次请求来自于哪个网址。请注意,在最初的HTTP规范中,这个消息头存在拼写错误,并且这个错误一直保留了下来。一般防盗链、防CSRF攻击等的时候会用到,比如我们点击下载某个软件,如果你是在我当前提供下载地址的网站下载的,那么ok,如果不是,我就可以通过referer请求头来判断,从而不让你下载。

User-Agent(*)

该消息头提供与浏览器或其他生成请求的客户端软件有关的信息。请注意,由于历史原因,大多数浏览器中都包含Mozilla前缀。这是因为最初占支配地位的Netscape浏览器使用了User-Agent字符串,而其他浏览器也希望让Web站点相信它们与这种标准兼容。信息中除了Mozilla之外,显示的都是客户端自己的相关信息,比如你的客户端浏览器是什么型号,你的客户端使用的操作系统是什么等等,服务端通过它来区分哪些请求来自哪种客户端,这个请求头也容易被伪造。

Host(*)

该消息头用于指定出现在被访问的完整URL中的主机名称。通俗一点就是你请求的是服务端主机(域名或者ip地址)。

X_FORWARDED_FOR(*)

这个字段我们在客户端抓包的时候一般看不到它,它是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。

一般服务端都是通过这个字段来识别或者获取客户端的真实ip地址的,这个字段一般是代理程序自动添加的,比如NginxApache等,他们转发请求之后,在服务端可以获取到这个键值对,做攻击检测、策略防御的时候会使用到它。这个东西我在讲解红蓝对抗赛、护网的时候会给大家再细致的说一下。

Content-Type(*)

Content-Type: application/x-www-form-urlencoded

这个请求头是用来告诉服务端,我本地请求携带的数据是一个什么样的格式,方便服务端(也叫后端)来对携带的数据进行解析获取并使用。

常见个格式类型有如下三种:

1、 application/x-www-form-urlencoded

它对应的数据格式为 id=1&submit=%E6%9F%A5%E8%AF%A2

2、 multipart/form-data

这个格式主要用在上传文件的请求时使用的数据格式,就是告诉服务端,现在的数据是分块传输的,

你服务端要分块接收。因为上传文件的时候,文件如果比较大,我们要一部分一部分的发送给服务端。

所以我们看到的数据格式大概是这样的

POST http://www.Jaden.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----
WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="user"
jaden
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="jaden.png"
Content-Type: image/png
PNG ... content of jaden.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

3、 application/json

它对应的数据格式为 {"id":1,"name":"守夜人Jaden"} ,看着有些像某些开发语言中的某个数据类型,但是这是json数据格式,与开发语言的数据格式不同,关于json我会在序列化和反序列化漏洞阶段给大家详细的讲解,这里大家知道有这么一种常用的格式即可。

那么服务端会根据Content-Type这个请求头键值对的值来采用不同的方式对请求携带的数据进行加工处理。

Content-Length(*)

它指示出报文中实体主体的字节大小。这个大小是包含了所有内容编码的, 比如,对文本文件进行了gzip压缩的话,Content-Length指的就是压缩后的大小而不是原始大小。看我从上面post请求数据包中

拿出来的部分数据:

Content-Length: 30

id=1&submit=%E6%9F%A5%E8%AF%A2

%E6%9F%A5%E8%AF%A2 是 查询两个汉字的URL编码格式,一个URL编码,比如 %E6 ,在HTTP数据包中占三个字节。英文字母、数字和符号 =、&、#、+ 等都是占1个字节,上面的数据按照字节数来算,正好是Content-Length的值30。

Transfer-Encoding(*)

如果不确定Content-Length的时候,可以使用 Transfer-Encoding:chunked 该字段表示分块传输数据,设置这个字段会自动产生两个效果:

1、Content-Length 字段会被忽略
2、基于长连接持续推送动态内容

这个请求头我们会在讲解WAF绕过的时候用到,大家目前先简单知道即可。

Cookie(*)

主要用于身份认证功能,这个就不在这里细说了,我会再另外一个课程中专门讲解身份认证,里面会详细讲解cookie、session、token等各种认证机制以及安全问题。

Cookie: PHPSESSID=l7shvia2bojf4a2ejbr3d26176

Connection

我们知道HTTP协议是基于TCP协议的,而通过TCP来通信必须要建立连接才行,这个请求头是来控制连接什么时候断开的,这个请求头有两个值:Keep-Alive表示短链接,也就是建立的连接需要维持一段时间。close表示无连接,也就是连接建立之后,一次请求和一次响应之后,就断开连接。

Accept-Encoding

浏览器能够处理的的压缩编码。通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是指字符集编码)

Accept-Language

语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;例如:

Accept-Language: en-us

Upgrade-Insecure-Requests: 1

该指令用于让浏览器自动升级请求从http到https,用于大量包含http资源的http网页直接升级到https而不会报错. 简洁的来讲,就相当于在http和https之间起的一个过渡作用.

Cache-Control

指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据,还是重新发请求到服务器获取数据。

我们网页的缓存控制是由HTTP头中的“Cache-control”来实现的,常见值有private、no-cache、max-age、must-revalidate等,默认为private。这几种值的作用是根据重新查看某一页面时不同的方式来区分的:

1、打开新窗口
值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果
指定了max-age值(单位为秒),那么在此值内的时间里就不会重新访问服务器,例如:
Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不会去服务器)

2、在地址栏回车
值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。
值为no-cache,那么每次都会访问。
值为max-age,则在过期之前不会重复访问。

3、按后退按扭
值为private、must-revalidate、max-age,则不会重访问,
值为no-cache,则每次都重复访问

4、按刷新按扭
无论为何值,都会重复访问

If-Modified-Since

把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时
间进行对比。
如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内
容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
例如:Mon, 17 Aug 2015 12:03:33 GMT

If-None-Match

If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。

如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.
使用这样的机制将提高网站的性能。

另外有一些其他的请求头,并且还有好多是不同的服务端要求客户端自动携带的请求头键值对,比如有些服务端有防火墙,你必须添加一些防火墙要求的请求头键值对,要不然不能通过我的防火墙等等,这里就不多提了。

空行

没有任何内容,为了符合格式要求,将请求行和请求头与请求正文数据部分分开

请求正文(协议正文)

关于请求正文,其实没有什么太多可说的,就是我们客户端给服务端提交的数据,在网络安全领域,这个请求数据的检测是非常关键的,很多攻击者都是将攻击载荷加到了请求数据中,当然了,其实攻击载荷可以加到HTTP协议整体数据包的任意位置,这个我在安全渗透课程中会细讲。

响应数据格式

先看图解:总共四个部分:响应行、响应头、空行、响应数据(响应正文或者响应体)

夯实基础 | HTTP协议通过抓包工具,我们抓取一下pikachu靶机环境下一个响应数据包来看吧

HTTP/1.1 200 OK
Date: Wed, 03 May 2023 12:20:14 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Content-Type: text/html;charset=utf-8
Content-Length: 33674
<!DOCTYPE html>
<html lang="en">
<head>...

响应行

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔

组成:
协议/版本 状态码 状态描述
举例:
HTTP/1.1 200 OK

状态码

状态码表示这次的请求和响应的状态如何,由3位数字组成的状态代码。

分为五大类别:

1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx客户端请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——这些状态码表示服务器在尝试处理请求时发生内部错误。这些错误是服务器本身的错误,而不是请求的错误

常见状态码

1开头的状态码(信息类Informational)
100 (Continue/继续)接受的请求正在处理,信息类状态码
101 (Switching Protocols/转换协议)
101 (SC_SWITCHING_PROTOCOLS)状态码是指服务器将按照其上的头信息变为一个不同的协议。这是
HTTP 1.1中新加入的。

2开头的状态码(成功类Success)
200 (Success)服务器已成功处理了请求。
201 (Created/已创建)
202 (Accepted/接受)
204 (No Content/无内容)请求处理成功,但没有任何资源可以返回给客户端,一般用户客户端不需要
服务端响应新内容的时候使用

3开头的状态码(重定向Redirection)
301 (Moved Permanently)永久性重定向,表示资源已被分配了新的 URL
302 (Found/找到)临时性重定向,表示资源临时被分配了新的 URL,比如re.jd.com会自动跳转到
www.jd.com
303 (See Other/参见其他信息)这个状态码和 301、302 相似,只是如果最初的请求是 POST,那
么新文档(在定位头信息中给出)要用 GET 找回。这个状态码是新加入 HTTP 1.1中的。
304 (Not Modified/未修改)自从上次请求后,请求网页未修改过。服务器返回此响应时,不会返回
网页内容,客户端看到的页面还是上一次请求缓存下来的页面。当客户端有一个缓存的文档,通过提供一个
If-Modified-Since 请求头信息可指出客户端希望文档在指定日期之后有所修改时才会重载此文档。
307 (Temporary Redirect/临时重定向)浏览器处理307状态的规则与302相同。307状态被加入到
HTTP 1.1中是由于许多浏览器在收到302响应时即使是原始消息为POST的情况下仍然执行了错误的转向。只
有在收到303响应时才假定浏览器会在POST请求时重定向。添加这个新的状态码的目的很明确:在响应为303
时按照GET和POST请求转向;而在307响应时则按照GET请求转向而不是POST请求。

4开头的状态码(客户端错误Client Error)
400 (Bad Request/错误请求)服务器不理解请求的语法
401 (Unauthorized/未授权)表示发送的请求需要有通过HTTP认证的认证信息,客户端在授权头信息
中没有有效的身份信息时访问受到密码保护的页面。
403 (Forbidden/禁止)服务器拒绝请求,意思是除非拥有授权否则服务器拒绝提供所请求的资源。
404 (Not Found/未找到)服务器找不到请求网页,也就是告诉客户端所给的地址无法找到任何资源。
405 (Method Not Allowed/方法未允许) 指出请求方法(GET, POST, HEAD, PUT, DELETE等)
对某些特定的资源不允许使用。
406 (Not Acceptable/无法访问)表示请求资源的MIME类型与客户端中Accept头信息中指定的类型
不一致。

5开头的状态码(服务器错误Server Error)
500 (Internal Server Error/内部服务器错误)表示服务器遇到错误,无法完成正常的请求的处
理,可能是web应用存在bug或某些临时崩溃了
501 (Not Extended/尚未实施) 表示服务器不支持当前请求所需要的某个功能。
502 (Bad Gateway/错误的网关)表示服务器作为网关或代理,从上游服务器收到无效响应。例如
Nginx+uWSGI,当uWSGI服务没有启动成功或异常退出,而Nginx服务是正常的情况下,就会看到502 Bad
Gateway错误。
503 (Service Unavailable/服务无法获得)表示服务器处于停机维护或超负载,无法正常响应
504 (Gateway Timeou/网关超时)表示扮演网关或者代理的服务器无法在规定的时间内获得想要的响
应。502和504基本都是web服务器故障引起的。
505 (HTTP Version Not Supported/HTTP 版本不受支持)表示服务器不支持请求中所用的 HTTP
协议版本。
506 (Variant Also Negotiates/变体协商)表示服务器存在内部配置错误
507 (Insufficient Storage/存储错误)表示服务器无法存储完成请求所必须的内容。这个状况被认
为是临时的。一般是数据库出问题时会看到这个状态码

原文始发于微信公众号(安全君呀):夯实基础 | HTTP协议

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日12:20:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   夯实基础 | HTTP协议http://cn-sec.com/archives/3294548.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息