《WEB安全深度剖析》学习笔记
基础篇
- 计划使用一天(2020.9.23)时间完成
HTTP请求流程
web2.0时代,由C/S架构转变为B/S架构(浏览器/服务器)
书中写的http1.1而2014年12月,互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准
在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;(三次握手)
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;
其中HTTP响应的流程为:
\1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
\2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
\3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
\4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
HTTP协议为无状态协议
无状态是指浏览器和web服务器之间不需要建立持久的链接,这就意味着当一次相应完成后链接就被关闭了,服务器端(至少在HTTP协议层次)不会保留链接的相关信息
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
- 传送协议。
- 层级URL标记符号(为[//],固定不变)
- 访问资源需要的凭证信息(可省略)
- 服务器。(通常为域名,有时为IP地址)
- 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
- 路径。(以“/”字符区别路径中的每一个目录名称)
- 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
- 片段。以“#”字符为起点
以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:
http,是协议;
www.luffycity.com,是服务器;
80,是服务器上的默认网络端口号,默认不显示;
/news/index.html,是路径(URI:直接定位到对应的资源);
?id=250&page=1,是查询。
HTTP协议报文格式
HTTP请求
空白行表示请求头结束
请求头中有一个user-agent,就是告诉你的服务端,我是用什么给你发送的请求
有8种基本的请求方法(get、post最常见)
GET
获取请求页面的指定信息
HEAD
HEAD方法除了服务器不能在相应里返回消息主体外,其余与GET相同,通常用来测试超文本链接的有效性、可访问性、最近的改变。速度最快
POST
多用于向服务器发送大量数据
PUT
请求服务器把请求中的实体存储在请求资源下
PUT /input.txt
HOST: www.xxser.com
Content-Length:6
123456这段HTTP PUT请求将会在主机根目录下创建input.txt,内容为123456.(危险)
DELETE
和上一个对应,删除文件 (危险)
其他的就不再说了,用的太少了
HTTP响应
HTTP状态码
常见的状态码
- 200:客户端请求成功
- 302:重定向
- 404:请求的资源不存在
- 400:客户端请求有语法错误,不能被服务器理解
- 401:请求未经授权
- 403:服务器收到请求但是拒绝提供服务
- 500:服务器内部错误
- 503:服务器当前不能处理客户端的请求,一段时间后可能恢复
HTTP头
请求头
- host:指定主机号和端口号
- User-Agent:允许客户端将他的操作系统、浏览器和其他属性告诉服务器
- Referer:其包含一个URL,代表当前访问的URL的上一个URL(历史记录)
- Cookie:非常重要的请求头,他是一段文本,常用来表示请求者身份等
- Range:常用于多线程下载,例如
表示头500字节:bytes=0~499
表示第二个500字节:bytes=500~999
表示最后500字节:bytes=-500
表示500字节以后的范围:bytes=500-
- x-forward-for:即XXF头他代表请求端的IP或多个IP,中间用逗号隔开。
- Accept:用于指定客户端接收哪些MIME类型的信息,例如
Accept: txt/html
表示客户端希望接收HTML文本
- Accept-Charset:指定客户端接收的字符集,如果没有设置这个域,默认是可以接收任何字符集
响应头
- Server:服务器所使用的WEB服务器名称 攻击者可以对此进行利用
- Set-Cookie:向客户端设置Cookie,通过查看此头可以清楚的看到服务器向客户端发送的Cookie信息
- Last-Modified:资源最后修改时间
- Location:重定向头,告诉浏览器去访问哪个页面。通常在接收到这个请求之后会立刻重定向(302状态)
普通头
- Date、Connection等
实体头
- Content-Type:向接收方指示实体的介质类型
- Content-Encoding:媒体类型修饰符,他的值指示了正文的附加内容的编码。需要采用响应的解码机制
- Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示
HTTP与HTTPS的区别
| HTTP | HTTPS |
|---|---|
| 超文本传输协议,信息明文传输 | 具有安全性的SSL加密传输协议 |
| 80端口 | 443端口 |
| 不需要CA证书 | 需要付费申请CA证书 |
| 相对简单无状态 | SSL+HTTP加密传输、身份认证 |
理论到这截至