百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HTTP/HTTPS协议基础

zhezhongyun 2025-04-24 10:35 30 浏览

以下是对 HTTP/HTTPS协议 的全面基础讲解,包含请求/响应结构、状态码、Header/Cookie的核心概念,并附带代码示例和实际应用场景分析。


1. HTTP/HTTPS协议基础

HTTP (HyperText Transfer Protocol)

  • 无状态协议:每次请求独立,不保留之前交互的信息(依赖Cookie/Session维持状态)。
  • 明文传输:数据未加密,易被窃听(HTTPS解决了此问题)。
  • 默认端口:80。
  • HTTPS (HTTP Secure)
  • 加密传输:基于TLS/SSL协议,对HTTP内容加密。
  • 身份验证:通过证书验证服务器身份。
  • 默认端口:443。
  • 核心流程
    1. 客户端与服务端通过TLS握手交换密钥。
    2. 使用对称加密传输数据。

2. HTTP请求与响应结构

HTTP请求(Request)

GET /index.html HTTP/1.1          # 请求行(方法 + 路径 + 协议版本)
Host: www.example.com             # 必需Header(指定目标域名)
User-Agent: Mozilla/5.0           # 客户端标识
Accept: text/html                 # 可接受的内容类型
Cookie: session_id=abc123         # 客户端携带的Cookie
(空行)                            # 分隔Header和Body
(请求体,GET方法通常无Body)

HTTP响应(Response)

HTTP/1.1 200 OK                   # 状态行(协议版本 + 状态码 + 状态描述)
Content-Type: text/html           # 响应内容类型
Set-Cookie: session_id=abc123     # 服务端设置Cookie
Content-Length: 1024              # 响应体长度
(空行)                            # 分隔Header和Body
<!DOCTYPE html>                   # 响应体(HTML内容)
<html>...</html>

3. 常见HTTP方法

方法

作用

安全性与幂等性

GET

获取资源

安全、幂等

POST

提交数据(如表单)

不安全、不幂等

PUT

更新资源

不安全、幂等

DELETE

删除资源

不安全、幂等

HEAD

获取Header元数据

安全、幂等


4. HTTP状态码详解

状态码

类别

常见状态码

渗透测试中的意义

1xx

信息响应

100 Continue

少见,通常用于大文件上传

2xx

成功

200 OK, 201 Created

请求成功

3xx

重定向

301 永久重定向, 302 临时重定向

检查重定向目标是否可控(钓鱼攻击)

4xx

客户端错误

400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found

探测权限漏洞(如403绕过)

5xx

服务器错误

500 Internal Server Error

暴露服务端漏洞(如SQL注入错误回显)


5. 核心HTTP Header

请求头(Request Headers)

Header

作用

安全相关场景

Cookie

携带会话凭证

会话劫持、Cookie篡改

Referer

请求来源页面

检查CSRF防护(Referer验证)

User-Agent

客户端浏览器/设备信息

伪造UA绕过WAF检测

Authorization

认证信息(如Basic Token)

弱密码爆破、Token泄露

响应头(Response Headers)

Header

作用

安全相关场景

Set-Cookie

设置客户端Cookie

检查Secure/HttpOnly属性缺失

Content-Type

响应内容类型(如text/html)

检测MIME类型混淆漏洞

Location

重定向目标URL

开放重定向漏洞(钓鱼攻击)

CORS相关头

跨域资源共享控制

配置错误导致跨域数据泄露


6. Cookie机制与安全

Cookie属性

Set-Cookie: session_id=abc123; Path=/; Secure; HttpOnly; SameSite=Lax

属性

作用

安全意义

Secure

仅通过HTTPS传输

防止明文传输被窃听

HttpOnly

禁止JavaScript访问Cookie

防御XSS窃取Cookie

SameSite

限制跨站请求携带Cookie(Strict/Lax/None)

防御CSRF攻击

Expires

设置Cookie过期时间

会话固定攻击检查

Cookie在渗透测试中的应用

  • 会话劫持:通过XSS窃取Cookie后伪造用户身份。
  • Cookie篡改:修改Cookie参数尝试越权访问(如user_role=admin)。
  • 会话固定攻击:强制用户使用已知的Session ID。

7. 实战代码示例

Python模拟HTTP请求(包含Header/Cookie操作)

import requests

# 自定义Header和Cookie
headers = {
    "User-Agent": "Mozilla/5.0 (渗透测试专用)",
    "Referer": "http://evil.com"
}
cookies = {"session_id": "hacked_123"}

# 发送GET请求并获取响应头
response = requests.get(
    "http://example.com/admin",
    headers=headers,
    cookies=cookies
)

# 输出关键信息
print("状态码:", response.status_code)
print("响应头:", response.headers)
print("Set-Cookie:", response.headers.get("Set-Cookie"))

分析HTTPS请求(使用Wireshark抓包)

  1. 过滤TLS握手包:tls.handshake.type == 1(Client Hello)
  2. 观察加密后的应用数据包(内容不可读,但可分析元数据)。

8. 渗透测试中的应用场景

  1. 信息泄露
    • 检查HTTP响应头是否暴露敏感信息(如Server: Apache/2.4.6)。
  1. 会话管理漏洞
    • 验证Cookie是否缺少HttpOnly或Secure属性。
  1. 开放重定向
    • 修改Location头参数,测试是否可跳转到恶意网站。
  1. CORS配置错误
    • 检查Access-Control-Allow-Origin: *是否允许任意域访问。

9. 学习建议

  1. 动手实践
    • 使用浏览器开发者工具(F12)查看每个请求的Header和Cookie。
    • 在Kali Linux中用curl -v http://example.com观察原始HTTP交互。
─(kalikali)-[~]
└─$ curl -v http://example.com
* Host example.com:80 was resolved.
* IPv6: 2600:1406:3a00:21::173e:2e65, 2600:1406:bc00:53::b81e:94c8, 2600:1408:ec00:36::1736:7f31, 2600:1406:bc00:53::b81e:94ce, 2600:1406:3a00:21::173e:2e66, 2600:1408:ec00:36::1736:7f24
* IPv4: 23.215.0.136, 23.192.228.84, 96.7.128.198, 23.192.228.80, 23.215.0.138, 96.7.128.175
*   Trying 23.215.0.136:80...
*   Trying [2600:1406:3a00:21::173e:2e65]:80...
* Immediate connect fail for 2600:1406:3a00:21::173e:2e65: 网络不可达
*   Trying [2600:1406:bc00:53::b81e:94c8]:80...
* Immediate connect fail for 2600:1406:bc00:53::b81e:94c8: 网络不可达
*   Trying [2600:1408:ec00:36::1736:7f31]:80...
* Immediate connect fail for 2600:1408:ec00:36::1736:7f31: 网络不可达
*   Trying [2600:1406:bc00:53::b81e:94ce]:80...
* Immediate connect fail for 2600:1406:bc00:53::b81e:94ce: 网络不可达
*   Trying [2600:1406:3a00:21::173e:2e66]:80...
* Immediate connect fail for 2600:1406:3a00:21::173e:2e66: 网络不可达
*   Trying [2600:1408:ec00:36::1736:7f24]:80...
* Immediate connect fail for 2600:1408:ec00:36::1736:7f24: 网络不可达
* Connected to example.com (23.215.0.136) port 80
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/8.5.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html
< ETag: "84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134"
< Last-Modified: Mon, 13 Jan 2025 20:11:20 GMT
< Cache-Control: max-age=1544
< Date: Sat, 12 Apr 2025 08:00:51 GMT
< Content-Length: 1256
< Connection: keep-alive
< 
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
* Connection #0 to host example.com left intact

以下是针对 curl -v http://example.com 输出的逐段讲解:

1. DNS 解析
* Host example.com:80 was resolved.
* IPv6: 2600:1406:3a00:21::173e:2e65, ...
* IPv4: 23.215.0.136, ...
● 域名解析:curl 首先将域名 example.com 解析为 IPv4 和 IPv6 地址。
● IPv6/IPv4 地址列表:服务器返回了多个 IP 地址,确保高可用性(部分地址为冗余备份)。

2. 尝试连接
* Trying 23.215.0.136:80...
* Trying [2600:1406:3a00:21::173e:2e65]:80...
* Immediate connect fail for ...: 网络不可达
● IPv4 优先:curl 默认尝试 IPv4 地址(如 23.215.0.136:80)。
● IPv6 失败:所有 IPv6 地址均提示 网络不可达,可能原因:
  ○ 本地网络未启用 IPv6。
  ○ 防火墙/路由器阻止了 IPv6 流量。
  ○ 目标服务器 IPv6 地址不可达。

3. 成功建立连接
* Connected to example.com (23.215.0.136) port 80
● 最终选择 IPv4:成功通过 IPv4 地址 23.215.0.136 的 80 端口建立 TCP 连接。

4. 发送 HTTP 请求
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/8.5.0
> Accept: */*
● 请求行:GET / HTTP/1.1 表示请求根路径 /,使用 HTTP/1.1 协议。
● 请求头:
  ○ Host: 必需字段,指定目标域名。
  ○ User-Agent: 客户端标识(这里是 curl 版本)。
  ○ Accept: */*: 表示客户端接受任何响应类型。

5. 接收 HTTP 响应
< HTTP/1.1 200 OK
< Content-Type: text/html
< ETag: "84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134"
< Last-Modified: Mon, 13 Jan 2025 20:11:20 GMT
< Cache-Control: max-age=1544
< Date: Sat, 12 Apr 2025 08:00:51 GMT
< Content-Length: 1256
< Connection: keep-alive
● 状态行:HTTP/1.1 200 OK 表示请求成功。
● 响应头:
  ○ Content-Type: text/html: 响应内容是 HTML 文本。
  ○ ETag: 资源标识符,用于缓存验证。
  ○ Last-Modified: 资源最后修改时间(注意:日期为未来的 2025 年,可能是服务器配置错误或测试数据)。
  ○ Cache-Control: max-age=1544: 响应可缓存 1544 秒(约 25 分钟)。
  ○ Connection: keep-alive: 保持 TCP 连接复用。

6. 响应体(HTML 内容)
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    <!-- 页面元数据和样式 -->
</head>
<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples...</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

● 示例页面:这是 IANA(互联网编号分配机构)提供的标准示例页面,用于文档演示。

7. 连接保持
* Connection #0 to host example.com left intact
● Keep-Alive:TCP 连接未关闭,可复用后续请求,减少握手开销。

关键问题总结
1. IPv6 连接失败:本地网络或中间设备可能不支持 IPv6。
2. 未来日期:响应头中的 Last-Modified 和 Date 为 2025 年,可能是服务器时间错误或刻意设置的测试数据。
3. 缓存策略:Cache-Control 和 ETag 帮助客户端高效缓存资源。
通过此过程,可以清晰看到从 DNS 解析到 HTTP 请求/响应的完整生命周期。
  1. 靶场练习
    • 在DVWA中修改Cookie尝试绕过登录(设置security=low)。
  1. 协议分析工具
    • Wireshark抓包分析HTTP/HTTPS流量(过滤条件:http或tls)。

掌握HTTP/HTTPS协议是Web安全的基础,后续学习漏洞利用时,需时刻关注协议层面的细节(如请求参数如何构造、Header如何影响服务端行为)。

相关推荐

用豆包生成的BMI计算器(豆包的热量是多少?)

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8&#...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

Qt推流(视频文件/视频流/摄像头/桌面转流媒体rtmp+hls+webrtc)

一、前言说明推流直播就是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号从手机端,电脑端,摄影机端打包传到服务器的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观...

一看就会!谷歌广告转化跟踪详细设置指南来了

在出海推广业务中,投放广告最常见的目的是获取订单,但我们怎么知道有没有达成投放目的呢?谷歌转化跟踪技术就可以做到!熟悉谷歌的卖家朋友都知道,转化跟踪在最近几年变得越来越复杂了,虽然有很多选项可以自定义...

Android原生编解码接口MediaCodec详解

作者:躬行之MediaCodec是Android中的编解码器组件,用来访问底层提供的编解码器,通常与MediaExtractor、MediaSync、MediaMuxer、MediaCrypt...

手把手搭建RTSP流媒体服务器(rtsp 流媒体)

0.引言本文主要讲解如何搭建RTSP流媒体服务器的过程,使用开源项目ZLMediaKit。通过这个开源项目,推RTSP流到服务器,然后拉流端可以拉取RTSP、RTMP等流。ZLMediaKit码云链接...

MediaInfo 24.04.0 是一个关于多媒体文件的信息提供工具

MediaInfo24.04.0是一个关于多媒体文件的信息提供工具(仅当文件中包含信息时才提供):包括常规信息(标题、作者、导演、专辑、曲目编号、日期、时长等);视频信息(编解码器、画面比例、帧率...

rmvb格式视频怎么打开,rmvb转MP4认准这个方法

 一、rmvb是什么格式?  RMVB是一种视频文件格式,其中的VB指的是可变比特率。比起上一代的RM格式,RMVB  格式的画面比较清晰,因为它是降低了静态画面下的比特率。  二、制作rmvb  ①...

教你用Plex Media Server,把铁威马变成你的“私人好莱坞”!

TNAS(铁威马NAS)中可以安装多媒体服务器、影视、PlexMediaServer、EmbyServer作为个人媒体服务器使用。PlexMediaServer可以组织整理TNAS上的媒体...

你肯定用过!经典Windows软件被抛弃

Windows系统这些年持续更新的过程中,不断融入新的软件和功能的同时,一些经典的应用也渐渐成为了历史……Windows媒体播放器被抛弃Windows系统不断地推陈出新,一些老旧的组件也难免被抛弃,在...

博思得Q8标签打印全能手(博思得标签打印机安装教程)

2014-12-0905:35:00作者:宋达希【中关村在线办公打印频道原创】服装吊牌、洗涤标签、产品说明标签等都要用到标签打印机,这些标签涵盖多种尺寸的长度和宽度以及材质。另外作为一件商品或者产...

flv文件用什么播放器打开,这样做不踩雷!

FLV是FLASHVIDEO的简称,是随着FlashMX的推出发展而来的视频格式。它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。一、...

media player怎么转换格式?音频转换神器推荐!

Windowsmediaplayer怎么转换格式?WindowsMediaPlayer是微软公司出品的一款多媒体播放器,通常简称“WMP”。提供了编辑音频和视频文件的功能。用户可以使用该软件导...

视频参数检查工具更新:MediaInfo 23.10

MediaInfo提供有关视频或音频文件的技术和标签信息。信息示例包括编解码器、比特率、每秒帧数、宽度、高度、频道数、持续时间、标题、作者、字幕语言和章节名称。多种方式可以查看信息(文本、工作表、树和...

多媒体管理软件:JRiver Media Center 31.0.68 (64位)

JRiverMediaCenter64位是适用于大量库的完整媒体解决方案。它组织、播放和标记所有类型的媒体文件,并对Xbox、PS3、UPnP、DLNA和TiVo进行翻录、刻录。JRiverM...