图解HTTP
web及网络基础
http1.0
http1.1
TCP/IP协议族
IP协议
- 作用:把各种数据包传送给对方
- IP地址
- 指明节点被分配到的地址
- MAC地址
- 网卡所属的固定地址
- ARP协议依赖MAC地址进行通信
- IP地址
TCP协议
- 提供字节流服务:将大块数据分割为报文段进行传输
- 三次握手
- SYN
- SYN/ACK
- ACK
DNS服务
- 将域名和IP地址相互映射
- 对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符
URI(统一资源标识符)
格式
- 登录信息()
- 服务器地址
- 服务器端口号
- 带层次的文件路径
- 查询字符串
- 片段标识符
URL(统一资源定位符)
URL:是URI常用协议的一个子集
组成
- 第一部分:协议,如:HTTP、FTP、MHTML等
- 第二部分:主机的IP地址,有时也包括端口
- 第三部分:资源文件名,通常包含目录在内
简单的HTTP协议1.1
持久连接问题
HTTP keep-alive
- 解决了:HTTP每通信一次就断开TCP连接的问题
管线化
- 无需等待响应,可并行发送多个请求
无状态协议
- 每次http通信都需要重新验证用户身份
- 解决方法:cookie技术
- 服务器响应报文中的Set-Cookie通知客户端保存Cookie
请求URI
- 不是访问特定资源而是对服务器本身发起的请求使用
*
代替URI
请求与响应间的通信
方法(报文中起始行的开头)
- 注:方法名区分大小写
- GET(获取资源)
- POST(传输实体主体)
- PUT(传输文件)
- 自身不带验证机制
- HEAD(获得报文首部)
- 用于确认URI的有效性
- DELETE(删除资源)
- 自身不带验证机制
- OPTIONS(询问支持的方法)
- TRACE(追踪路径)
- 确认连接过程中发生的一系列操作
- XST(跨站追踪)攻击
- 确认连接过程中发生的一系列操作
- CONNECT(要求用隧道协议连接代理)
- 实现用隧道协议进行TCP通信
- TLS协议
- SSL协议
- 格式:CONNECT 代理服务器名 :端口号 HTTP版本
- 实现用隧道协议进行TCP通信
HTTP报文的HTTP信息
概念
报文(HTTP通信中的基本单位,由8位组字节流组成)
- HTTP协议交互的信息
- 报文首部
- 报文主体
- 注:报文首部与报文主体用 CR + LF (回车+换行)实现空行,十六进制为 0x0d 和 0x0a
实体(作为请求或响应的有效载荷数据被传输)
-
实体首部
-
实体主体
-
注:通常,报文主体等于实体主体,只有当传输内容进行编码操作时,二者才会不同。
编码提升传输速率
内容编码
- 实体信息原样压缩
- gzip
- deflate(zlib)
- identity(不进行编码)
分块传输编码
- 把大量数据分割成块
多部分对象集合
范围请求
内容协商
http报文的组成
HTTP状态码
注:状态码经常与状态不一致
1xx
- 信息性状态码
2xx
- 成功状态码
- 200
- 204
- 没有资源返回
- 206
- 表客户端进行了范围请求
3xx
- 重定向状态码
- 301
- 永久URI更新
- 302
- 临时URI更新
- 303
- 307
- 301
- 304
- (不属于重定向)表客户端未满足访问条件
4xx
- 客户端错误状态码
- 400
- 请求报文中有语法错误
- 401
- 发送的请求未通过HTTP认证
- 403
- 服务器拒绝访问
- 404
- 服务器上没有请求的资源
- 400
5xx
- 服务器错误状态码
- 500
- 服务器本身发生错误
- 503
- 服务器超负荷或停机
- 500
与HTTP协作的web服务器
单个主机托管多个域名
- 多个域名指向同一ip地址,请求访问时需在Host中指明完整的主机名或域名的URL
通信数据转发
代理
- 不改变请求URL
- 通过代理服务器的请求或响应会追加写入Via首部信息
- 分类1
- 缓存代理(Caching proxy)
- 将资源副本保存在服务器上
- 透明代理(Transparent proxy)
- 不对报文做任何加工
- 缓存代理(Caching proxy)
- 分类2
- 正向代理
- 目标服务器是不知道真正的客户端是谁
- 客户端知道代理服务器和web服务器的存在
- 可以隐藏客户端真实IP
- 反向代理(CDN)
- 客户端是不知道真正的目标服务器是谁
- 客户端不知道web服务器的存在
- 隐藏服务器真实IP
- 正向代理
网关
- 能使通信线路上的服务器提供非HTTP协议服务
- 提高通信的安全性
隧道
- 实现远距离的安全通信
- SSL加密
HTTP首部
请求报文
- 方法
- URI
- HTTP版本
- HTTP首部字段
响应报文
- HTTP版本
- 状态码
- HTTP首部字段
HTTP首部字段
实际用途分类
- 通用首部字段
- 请求
- 响应
- 实体
缓存代理/非缓存代理
- 端到端首部(End-to-end Header)
- 此类别中的首部会转发给最终的接收目标,且必须保存在由缓存生成的响应中,另外规定,它必须被转发
- 逐跳首部(Hop-by-hop Header)
- 只对单次转发有效,会因通过缓存或代理而不再转发
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
- 注:除以上8个,其他都属于端到端
- 只对单次转发有效,会因通过缓存或代理而不再转发
为Cookie服务的首部字段
- Set-Cookie(响应首部字段)
- 属性
- NAME=VALUE
- Cookie的名称和值
- expires=DATE
- Cookie的有效期
- path=PATH
- 将服务器上的文件目录作为Cookie的适用对象
- domain=域名
- 作为Cookie适用对象的域名
- Secure
- 仅在HTTPS安全连接时才会发送Cookie
- HttpOnly
- 使Cookie不能被JavaScript脚本访问
- 防止XSS跨站脚本攻击
- 使Cookie不能被JavaScript脚本访问
- NAME=VALUE
- 属性
- Cookie(请求首部字段)
*
其他首部字段
- X-Frame-Options
- 防止点击劫持攻击
- X-XSS-Protection
- 防止XSS跨站攻击
- DNT
- P3P
HTTPS
HTTP缺点
- HTTP的防篡改措施
- SHA-1
- MD5
- 明文传输
- 无法验证通信方身份
- 接收大量无意义的请求,导致DoS攻击(拒绝服务攻击)
- 无法验证报文的完整性
- 报文可能被修改,导致中间人攻击(MITM)
HTTP+SSL
加密
- 对称密钥加密(共享密钥加密)
- 解密与加密使用同一密钥,所以密钥会发送给解密之人
- 公开密钥加密
- 一对非对称密钥
- 私有密钥
- 解密方使用该密钥解密
- 公开密钥
- 加密方使用该密钥进行加密
- 私有密钥
- 一对非对称密钥
- 总结:公开密钥加密解决了共享密钥在传输时被窃取的危险
- HTTPS的混合加密
- 在交换密钥环节使用公开密钥加密,建立通信后,使用共享密钥加密
认证
- 查找证书
- 公钥证书(数字证书)
- 解决公钥在传输过程中可能被替换的问题
确认用户访问身份的认证
HTTP的认证方式
BASIC认证
- 发送请求后收到 状态码401,然后客户端将账户密码用 : 连接,再base64加密后传输给服务器
DIGEST认证(摘要认证)
- 可防止窃听,但不防止用户伪装
- 质询/响应的方式
SSL客户端认证
- 客户端证书认证
- 双因素认证
- 客户端认证
- 表单认证
FormBase认证(基于表单认证)
- Cookie管理Session(会话)
- Session是指用户从打开浏览器访问服务器到关闭浏览器之间的会话状态,在一个会话期间,服务器会自动分配一个标识SessionId。Session可以存储用户访问服务器的一些传递资料信息
- Session对象和Cookie对象相比的差别在于,Cookie存储在客户端的浏览器中,而Session对象存储在服务器端
- 存在XSS攻击
基于 HTTP的其他协议
HTTP缺点:
SNS(社交网络服务)需要实时更新网页内容,导致频繁的从客户端到服务端访问,若没有内容更新,则会浪费资源
解决方法
Ajax(异步+JavaScript+XML)
- 核心:API : XMLHttpRequest
- 通过调用JavaScript脚本与服务器建立通信,从web页面发起请求,更新局部内容
- 缺点:产生大量请求
Comet
- 延迟应答
- 接到请求后先将挂起,待服务端有内容更新时,再返回响应
- 缺点:为了维持连接 ,会消耗较多资源
SPDY
- 以会话层的形式加入
- 功能
- 多路复用流
- 赋予请求优先级
- 压缩HTTP首部
- 推送功能
- 服务器提示功能
WebSocket
构建web内容的技术
HTML
CSS
JavaScript
- 动态HTML
DOM
- 用来操作HTML和XML的API
web应用
内容
- 静态内容
- 动态内容
- 由程序创建
CGI(通用网关接口)
- 将请求转给CGI程序处理的一种机制
- CGI程序
- PHP
- Ruby
- Perl
Servlet
- 运行的环境:Web容器或Servlet容器
- 优点:运行在与web服务器相同的进程中,受到的负载小,而CGI每次接受请求都要启动,访问量大时,会导致服务器负载过大
数据发布的格式及语言
- XML(可拓展标记语言)
- 使数据容易读取
- 发布更新信息的RSS/Atom
- JSON
web的攻击技术
攻击类别
被动攻击(设计陷阱使用户触发,执行攻击代码)
- XSS
- HTTP首部注入攻击
- 会话固定攻击
- 跨站点请求伪造(CSRF)
主动攻击(直接访问web应用,传入攻击代码)
- SQL注入
- 非法查看或篡改数据
- 规避认证
- 执行相关程序
- OS命令注入
- 原理:通过web应用调用shell执行非法的操作系统命令
因输出值转义不完全导致的漏洞
XSS
- 原理:通过web网站的注册用户的浏览器内运行非法HTML标签或JavaScript
- 危害
- 利用脚本窃取用户Cookie
- 显示伪造的文章/图片
- 利用虚假输入表单骗取用户信息
HTTP首部注入攻击
- 原理:在响应首部字段内插入换行,添加任意响应首部或主体
- 注意:
%0D%0A
代表HTTP报文中的换行符 - 危害
- 设置任何Cookie信息
- 重定向至任何URL
- 显示任意的主体(HTTP响应截断攻击)
HTTP响应截断攻击
-
注:
%0D%0A%0D%0A
两个连续的换行实现HTTP首部与主体分隔所需的空行 -
利用插入字符串
%0D%0A%0D%0A
可实现伪造主体 -
危害
- 用户浏览器显示伪造的web页面
-
邮件首部注入攻击
- 利用web应用中的邮件发送功能
- 向邮件首部To或Subject内添加任意非法内容
-
目录遍历攻击
- 子主题 1
-
远程文件包含漏洞
- PHP的include 和 require ,5.2.0版本以后默认无效
- 原理:部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,当脚本读取后,就可运行任意脚本
因设计缺陷导致的漏洞
强制浏览
- 推测文件名及目录
- 浏览由软件自动生成的备份文件
- 浏览经认证才可显示的文件
不正确的错误消息处理
- 根据错误提示信息,得到其他信息
开放重定向
- URL跳转
因会话管理疏忽导致的漏洞
会话劫持
- 获取用户会话ID
- 获取途径
- 推测会话ID
- 窃听或XSS攻击盗取
- 会话固定攻击强行获取
会话固定攻击
- 强制用户使用攻击者指定的会话ID
- Session Adoption
- PHP或ASP.NET能够接受处理未知会话ID的功能
跨站点请求伪造(CSRF)
- 强制对已完成认证的用户进行非预期的信息更新
其他
缓存污染
密码破解
- 通过网络的密码试错
- 穷举法
- 字典攻击
- 对已加密的密码破解
- 穷举/字典
- 彩虹表
- 拿到密钥
- 加密算法的漏洞
点击劫持
- 利用透明的按钮或链接,覆盖在web页面上吗,做成陷阱
DoS攻击
- 同时发送大量请求,使服务器停止服务