Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 使用计时技术发现HTTP请求走私漏洞
  • 使用计时技术发现CL.TE漏洞
  • 使用计时技术发现TE.CL漏洞
  • 使用差异响应确认HTTP请求走私漏洞
  • 使用差异响应确认CL.TE漏洞
  • 使用差异响应确认TE.CL漏洞
  1. 进阶主题
  2. HTTP请求走私

查找HTTP请求走私漏洞

在本节中,我们将介绍用于发现HTTP请求走私漏洞的不同技术。

使用计时技术发现HTTP请求走私漏洞

检测HTTP请求走私漏洞通用最有效的方法是发送请求,如果存在漏洞,应用程序的响应会出现时间延迟。这种技术被Burp Scanner用于自动检测请求走私漏洞。

使用计时技术发现CL.TE漏洞

如果一个应用程序易受到CL.TE类型请求走私的攻击,那么发送如下请求通常会导致时间延迟:

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 4

1
A
X

由于前端服务器使用Content-Length标头,因此它只会转发此请求的一部分,省略X。后端服务器使用Transfer-Encoding标头,处理第一个分块,然后等待下一个分块的到来。这将导致一个可观察到的时间延迟。

使用计时技术发现TE.CL漏洞

如果一个应用程序易受到TE.CL类型请求走私的攻击,那么发送如下请求往往会导致时间延迟:

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 6

0

X

由于前端服务器使用Transfer-Encoding标头,因此它只会转发此请求的一部分,省略X。后端服务器使用Content-Length标头,期望在消息正文中有更多内容,并等待剩余内容的到来。这将导致一个可观察到的时间延迟。

注意

如果应用程序易受CL.TE类型漏洞的攻击,基于时间的TE.CL漏洞测试将有可能干扰其他应用程序用户。因此,为了隐蔽和减少干扰,应该先使用CL.TE测试,只有在第一个测试不成功时才继续进行TE.CL测试。

使用差异响应确认HTTP请求走私漏洞

在检测到一个可能的请求走私漏洞后,你可以通过利用它来触发应用程序响应内容的差异,从而获得关于该漏洞的进一步证据。这涉及到向应用程序快速连续地发送两个请求:

  • 一个“攻击”请求,旨在干扰下一个请求的处理。

  • 一个“正常”请求。

如果正常请求的响应包含预期的干扰,那么就证实了该漏洞。

例如,假设正常请求如下所示:

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

q=smuggling

这个请求通常会收到一个状态码为200的HTTP响应,其中包含一些搜索结果。

干扰该请求所需的攻击请求取决于存在的请求走私类型:CL.TE与TE.CL。

使用差异响应确认CL.TE漏洞

要确认CL.TE漏洞,你需要发送这样的攻击请求:

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Transfer-Encoding: chunked

e
q=smuggling&x=
0

GET /404 HTTP/1.1
Foo: x

如果攻击成功,那么后端服务器将此请求的最后两行视为属于收到的下一个请求。这将使随后的“正常”请求看起来像这样:

GET /404 HTTP/1.1
Foo: xPOST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

q=smuggling

由于此请求现在包含一个无效的URL,服务器将以404状态码进行响应,表明攻击请求确实对其造成了干扰。

LAB

使用差异响应确认TE.CL漏洞

要确认TE.CL漏洞,你需要发送这样的攻击请求:

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked

7c
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 144

x=
0

注意

要使用Burp Repeater发送此请求,你首先需要转到Repeater菜单,确保取消选中“Update Content-Length”选项。

需要在最后一个0之后包含尾随序列\r\n\r。

如果攻击成功,那么从GET /404开始的所有内容都将被后端服务器视为属于收到的下一个请求。这将使随后的“正常”请求看起来像这样:

GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 146

x=
0

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

q=smuggling

由于此请求现在包含一个无效的URL,服务器将以状态码404进行响应,表明攻击请求确实对其造成了干扰。

LAB

注意

在尝试通过干扰其他请求来确认请求走私漏洞时,应注意以下几点:

  • “攻击”请求和“正常”请求应使用不同的网络连接发送到服务器。通过相同的连接发送这两个请求并不能证明漏洞存在。

  • “攻击”请求和“正常”请求应尽可能使用相同的URL和参数名称。这是因为许多现代应用程序根据URL和参数将前端请求路由到不同的后端服务器。使用相同的URL和参数可以增加请求被同一个后端服务器处理的机会,这对于攻击的成功是至关重要的。

  • 在测试“正常”请求以检测“攻击”请求的任何干扰时,你需要与应用程序同时接收的其他请求(包括其他用户的请求)进行竞争。你应该在“攻击”请求之后立即发送“正常”请求。如果应用程序繁忙,你可能需要进行多次尝试以确认漏洞。

  • 在某些应用程序中,前端服务器充当负载均衡的作用,并根据某种负载均衡算法将请求转发到不同的后端系统。如果你的“攻击”和“正常”请求被转发到不同的后端系统,那么攻击将会失败。这是在确认漏洞之前需要尝试多次的另一个原因。

  • 如果你的攻击成功干扰了后续请求,但这不是你发送的用于检测干扰的“正常”请求,那么这意味着你的攻击影响了另一个应用程序用户。如果继续执行测试,可能会对其他用户产生破坏性影响,你应该谨慎行事。

阅读更多

PreviousHTTP请求走私Next利用HTTP请求走私漏洞

Last updated 1 year ago

HTTP请求走私,通过差异响应确认CL.TE漏洞
HTTP请求走私,通过差异响应确认TE.CL漏洞
利用HTTP请求走私漏洞