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

HTTP/HTTPS协议基础

nanshan 2025-05-11 17:22 21 浏览 0 评论

以下是对 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如何影响服务端行为)。

相关推荐

轻量级分析利器再升级:解读 DuckDB 1.3.0 新特性

DuckDB团队近日正式发布了最新版本——DuckDB1.3.0,代号“Ossivalis”。此次版本以金眼鸭的远古祖先BucephalaOssivalis命名,象征项目在演化和成长过...

C++跨平台编译的终极奥义:用Docker把环境差异按在地上摩擦

"代码在本地跑得飞起,一上服务器就coredump?"——每个C++程序员都经历过的《编译器的复仇》事件!大家好,我是Henry,废话少说,今天来简单谈一下跨平台编译的那些事儿,...

全网最全-Version Script以及__asm__((&quot;.symver xxx&quot;))使用总结

首先提醒一点,一切的前提建立在你的名字必须要mangling,不然无论你写的versionscript还是__asm__都不会起任何效果VersionScript简单用法:这是一个典型例子,这个例...

Ubuntu 25.04 Beta发布:Linux 6.14内核

IT之家3月28日消息,Canonical昨日(3月27日)放出了Beta版Ubuntu25.04系统镜像,代号“PluckyPuffin”,稳定版预估将于2025年...

不同平台CRT的区别?什么是UCRT?如何看libc源代码?

若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好!CRT运行时库C标准规定例如输入输出函数、字符串函数、内存操作等接口,一般采用C运行时库实现。微软的CRT微软有两套CRT,早期的MS...

信创力量,中兴绽放——中兴新支点桌面操作系统安装与使用全攻略

原文链接:「链接」Hello,大家好啊,今天给大家带来一篇中兴新支点桌面操作系统安装使用的文章,欢迎大家分享点赞,点个在看和关注吧!中兴新支点桌面操作系统是一款基于Linux内核、面向政企和信创环...

Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?

1.安装列表MySQL5.7.11Java1.8ApacheMaven3.6+tomcat8.5gitRedisNginxpythondocker2.安装mysql1.拷贝mysql安装文件到...

一篇文章解决Linux系统安全问题排查,另配实操环境

实操地址:https://www.skillup.host/1/linux/safe/command.md#Linux安全检查排查指南##1.系统账户安全检查###1.1检查异常账户``...

程序员必备的学习笔记《TCP/IP详解(一)》

为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样...

《Linux常用命令》(linux的常用命令总结)

一、文件与目录操作1.目录导航pwd:显示当前工作目录路径示例:pwd关键词:当前路径、工作目录cd:切换目录示例:cd/home/user#切换到绝对路径cd..#...

Kubernetes 教程之跟着官方文档从零搭建 K8S

前言本文将带领读者一起,参照者Kubernetes官方文档,对其安装部署进行讲解.Kubernetes更新迭代很快,书上、网上等教程可能并不能适用于新版本,但官方文档能.阅读这篇文章你...

电脑网卡坏了怎么修复(电脑网卡坏了怎么修复win7系统)

当电脑网卡出现故障时,无论是有线网络还是无线网络,都可能无法正常连接。下面从软件、硬件等方面,分步骤为你介绍排查与修复的解决方案。一、初步排查:锁定问题源头检查网络环境将手机、平板等其他设备连接至同一...

如何查询电脑/手机的物理地址(如何找手机的物理地址)

一、要查询电脑的物理地址(也称为MAC地址),可以按照以下步骤进行操作:1.打开命令提示符(Windows)或终端(Mac):-在Windows上,点击“开始”按钮,搜索“命令提示符”,然后点击打...

IPv4 无网络访问权限全流程解决方案

当设备出现IPv4无网络访问权限问题时,多由网络配置错误、连接故障或服务异常导致。以下提供系统化的排查步骤与解决方案,帮助用户快速定位并修复问题。一、基础故障快速检查1.物理连接确认有线网络:检...

Python教程(十九):文件操作(python操作文件夹)

昨天,我们学习了列表推导式,掌握了Python中最优雅的数据处理方式。今天,我们将学习文件操作—Python中读写文件的基础技能。文件操作是编程中的核心技能,无论是读取配置文件、保存用户数据,还是...

取消回复欢迎 发表评论: