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

HTTP/HTTPS协议基础

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

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

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...