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

HTTP/HTTPS协议基础

nanshan 2025-05-11 17:22 13 浏览 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如何影响服务端行为)。

相关推荐

F5负载均衡器如何通过irules实现应用的灵活转发?

F5是非常强大的商业负载均衡器。除了处理性能强劲,以及高稳定性之外,F5还可以通过irules编写强大灵活的转发规则,实现web业务的灵活应用。irules是基于TCL语法的,每个iRules必须包含...

映射域名到NAS

前面介绍已经将域名映射到家庭路由器上,现在只需要在路由器上设置一下端口转发即可。假设NAS在内网的IP是192.168.1.100,NAS管理端口2000.你的域名是www.xxx.com,配置外部端...

转发(Forward)和重定向(Redirect)的区别

转发是服务器行为,重定向是客户端行为。转发(Forward)通过RequestDispatcher对象的forward(HttpServletRequestrequest,HttpServletRe...

SpringBoot应用中使用拦截器实现路由转发

1、背景项目中有一个SpringBoot开发的微服务,经过业务多年的演进,代码已经累积到令人恐怖的规模,亟需重构,将之拆解成多个微服务。该微服务的接口庞大,调用关系非常复杂,且实施重构的人员大部分不是...

公司想搭建个网站,网站如何进行域名解析?

域名解析是将域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转...

域名和IP地址什么关系?如何通过域名解析IP?

一般情况下,访客通过域名和IP地址都能访问到网站,那么两者之间有什么关系吗?本文中科三方针对域名和IP地址的关系和区别,以及如何实现域名与IP的绑定做下介绍。域名与IP地址之间的关系IP地址是计算机的...

分享网站域名301重定向的知识

网站域名做301重定向操作时,一般需要由专业的技术来协助完成,如果用户自己在维护,可以按照相应的说明进行操作。好了,下面说说重点,域名301重定向的操作步骤。首先,根据HTTP协议,在客户端向服务器发...

NAS外网到底安全吗?一文看懂HTTP/HTTPS和SSL证书

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:可爱的小cherry搭好了NAS,但是不懂做好网络加密,那么隐私泄露也会随时发生!大家好,这里是Cherry,喜爱折腾、玩数码,热衷于分享数...

ForwardEmail免费、开源、加密的邮件转发服务

ForwardEmail是一款免费、加密和开源的邮件转发服务,设置简单只需4步即可正常使用,通过测试来看也要比ImprovMX好得多,转发近乎秒到且未进入垃圾箱(仅以Mailbox.org发送、Out...

使用CloudFlare进行域名重定向

当网站变更域名的时候,经常会使用域名重定向的方式,将老域名指向到新域名,这通常叫做:URL转发(URLFORWARDING),善于使用URL转发,对SEO来说非常有用,因为用这种方式能明确告知搜索引...

要将端口5002和5003通过Nginx代理到一个域名上的操作笔记

要将端口5002和5003通过Nginx代理到域名www.4rvi.cn的不同路径下,请按照以下步骤配置Nginx:步骤说明创建或编辑Nginx配置文件通常配置文件位于/etc/nginx/sites...

SEO浅谈:网站域名重定向的三种方式

在大多数情况下,我们输入网站访问网站的时候,很难发现www.***.com和***.com的区别,因为一般的网站主,都会把这两个域名指向到同一网站。但是对于网站运营和优化来说,www.***.com和...

花生壳出现诊断域名与转发服务器ip不一致的解决办法

出现诊断域名与转发服务器ip不一致您可以:1、更改客户端所处主机的drs为223.5.5.5备用dns为119.29.29.29;2、在windows上进入命令提示符输入ipconfig/flush...

涨知识了!带你认识什么是域名

1、什么是域名从技术角度来看,域名是在Internet上解决IP地址对应的一种方法。一个完整的域名由两个或两个以上部分组成,各部分之间用英文的句号“.”来分隔。如“abc.com”。其中“com”称...

域名被跳转到其他网站是怎么回事

当你输入域名时被跳转到另一个网站,这可能是由几种原因造成的:一、域名可能配置了域名转发服务。无论何时有人访问域名,比如.com、.top等,都会自动重定向到另一个指定的URL,这通常是在域名注册商设...

取消回复欢迎 发表评论: