HTTP请求走私漏洞简单分析

news2024/11/13 14:54:58

文章目录

  • HTTP请求走私漏洞的产生
  • HTTP请求走私漏洞的分类
  • HTTP请求走私攻击的危害
  • 确认HTTP请求走私漏洞
    • 通过时间延迟技术确认CL漏洞
    • 通过时间延迟技术寻找TE.CL漏洞
  • 使用差异响应内容确认漏洞
    • 通过差异响应确认CL.TE漏洞
    • 通过差异响应确认TE.CL漏洞
  • 请求走私漏洞的利用
    • 通过请求漏洞绕过URL访问的限制
    • 通过请求走私漏洞绕过客户端认证
    • 触发反射型号XSS
    • 网页缓存中毒
  • Apache mod_proxy配置请求走私攻击


HTTP请求走私漏洞的产生

在HTTP/1.1中,HTTP请求走私漏洞出现,是因为HTTP规范提供了两种不同的方法指定请求位置的结束即我们说的Content-Length 和Transfer-Encoding标头,分别表示正文内容的长度和是否分块,当同时使用这两种方法的时候,如果前端和后端服务器处理表头的时候出现了歧义,则会出现处理情况的不同,从而导致了请求走私漏洞,比如说:

file

图中由于前端服务器不支持Transfer-Encoding分块,因此正文的所有数据由于Content-Length被传入到了后端服务器中,而后端服务器因为支持Transfer-Encoding,遇到0的时候,就停止了接收,后面请求的admin就被认为是一次新的请求,两个服务器之间的歧义导致了HTTP请求走私漏洞。

HTTP请求走私漏洞的分类

  1. CL.TE:前端服务器使用 Content-Length 标头和后端服务器使用 Transfer-Encoding 页眉
  2. TE.CL:前端服务器使用 Transfer-Encoding 标头和后端服务器使用 Content-Length 页眉
  3. TE.TE:前端和后端服务器都支持 Transfer-Encoding 标头,但两个服务器处理Transfer-Encoding产生歧义

HTTP请求走私攻击的危害

由于当今的Web应用程序之间大都采用HTTP服务器链的形式,有时为了负载均衡等各种原因,都会设置多个代理或均衡器,最终这些服务器请求都转发到了一个或多个后端服务器中,假若这些类型的架构在服务器处理HTTP请求时发生了歧义,会产生巨大的危害。

  1. 会话劫持: 攻击者可以使用HTTP请求走私攻击来劫持用户的会话,获取用户的敏感信息,例如登录凭据、会话标识符等。攻击者可以利用这些信息冒充用户,执行未经授权的操作。
  2. 身份伪装: 攻击者能够通过HTTP请求走私攻击伪装成合法的用户,绕过一些安全机制和防护措施。这可能导致攻击者获得未授权的访问权限,例如访问受限资源或执行特权操作。
  3. 敏感信息泄露: 攻击者可以利用HTTP请求走私漏洞,通过注入恶意请求将敏感信息泄漏给第三方。这些信息可能包括用户的个人身份信息、金融数据、业务逻辑、系统配置等。
  4. 业务破坏: 攻击者可以使用HTTP请求走私攻击来破坏正常的业务流程。例如,他们可以篡改或删除HTTP请求头、操纵响应内容、劫持会话等,导致应用程序无法正常工作,影响用户体验和业务流程。
  5. 安全漏洞利用: HTTP请求走私攻击可能与其他安全漏洞相结合,从而导致更严重的安全问题。攻击者可能会利用该漏洞执行其他攻击,如跨站脚本攻击 (XSS)、跨站请求伪造 (CSRF)、服务器端请求伪造 (SSRF) ,等。

确认HTTP请求走私漏洞

通过时间延迟技术确认CL漏洞

由于前端服务器使用的是Content-Length标头,而后端服务器使用的是Transfer-Encoding,因此前端服务器仅会转发一部分,后端服务器处理了第一个区块,因为还没结束符,所以会等待下一个区块的到达,可以有明显的时间延迟。

POST / HTTP/1.1 
Host: aiwin.com
Transfer-Encoding: chunked 
Content-Length: 3

1 
X

如以上数据包为例,前端使用Content-length,只会发送3个长度的数据,发送到了1,而后端使用的是chunked,会一直等待下一区块的到来,或者等待结束符0的到来。

通过时间延迟技术寻找TE.CL漏洞

由于前端服务器使用Transfer-Encoding表头,仅转发请求的一部分,后端服务器使用的是Content-Length表头,在等待着剩余内容的到达,也可以观察到时间延迟

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

0

X

如上数据包,前端服务器使用的是chunked,会转发到0之前的正文,但是后端服务器使用的是Content-Length,长度为6,而转发到0,长度仅为3,所以会等待后面3个长度的正文到来,会导致时间延迟

使用差异响应内容确认漏洞

通过走私漏洞,能够干扰正确请求的响应包,通过正常请求的响应来确认漏洞。

通过差异响应确认CL.TE漏洞

如下数据包,由于前端服务器使用的是Content-Length,所以全部数据都被发送到了后端服务器中,而后端服务器使用的是Transfer-Encoding,数据接收到0后就停止了,下面GET的请求被认为是新一次的请求处理,返回了404 Not Found。

file

通过差异响应确认TE.CL漏洞

如下HTTP请求包,由于前端服务器使用的是TE,所以全部数据毫无问题的发送到了后端服务器,而后端服务器使用的是CL,只接收到了5e的数据,下面的POST数据被认为是新一次的请求被后端服务器处理,返回了404。

file

请求走私漏洞的利用

通过请求漏洞绕过URL访问的限制

如下数据包,访问/admin页面,是被403掉的

file

因为这里存在请求走私漏洞,CL-TE漏洞,所以前端将全部的数据传入到了后端,而后端使用的是TE,接收到0后停止,下一次请求/admin被认为是新一次的请求,而此次请求的Host为本地,因此可以绕过403

file

通过请求走私漏洞绕过客户端认证

一般在https中,作为TLS握手的一部分,服务器需要提供证书向客户端进行身份认证,证书包含通用名称,该名称需要与注册的主机名相匹配,客户端可以使用它验证是否与合法服务器进行通信。

GET /admin HTTP/1.1
Host: aiwin.com
X-SSL-CLIENT-CN: aiwin

一般这些CN标头对用户是隐藏的,如果能够发送正确的CN头和值,可能能偶绕过访问控制,在前端中,如果这些头已经存在,前端服务器会覆盖它们,因此不太可利用,而走私的请求可以绕过前端,原封不动的发送给后端,绕过验证。

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

0

GET /admin HTTP/1.1
X-SSL-CLIENT-CN: administrator
Foo: x

触发反射型号XSS

查看页面,发现User-agent被插入到了页面中,并且验证一下能够通过修改User-Agent触发反射型XSS。
file
一般反射型XSS对用户并没有危害,只能在自身访问的网站中触发或者通过与用户交互触发,加入联合请求走私漏洞,则可以导致其它用户访问任意界面都触发反射型XSS,无需与用户进行交互,便可以轻松造成一定的影响,原理就是当前端页面中某一处请求头利用能够触发反射型XSS,又存在CL-TE种类的请求走私漏洞时,能够利用这种形式。

file

此处因为前端不支持chunked,接收的是Content-length,因此整块数据毫无问题的传入到了后端服务器,而后端服务器接收的是TE,接收到是0后停止接收,下面还未接收,被认为是独立的请求,被缓存到了服务器中,当有用户进行请求,就会触发XSS。
file

网页缓存中毒

网页缓存是指为了减少服务器的负载,服务器会将一些文件如CSS\JS等缓存起来,以便在下次访问的时候进行读取,不需要再次请求服务器,可是当某一用户发送一些恶意的请求服务器,服务器就会返回恶意的服务器到缓存服务器,因此缓存的这周机制,其它用户访问这个界面的时候就会加载这个恶意的缓存,存在被投毒的可能。

因为服务器存在CL-TE请求走私漏洞,因此可以通过攻击服务器,使得CL-TE请求走私将下一个请求指定攻击服务器的POST路径。

file

file

访问JS文件,可以看到重定向来了构造的恶意XSS语句中,JS文件恶意重定向到了XSS被缓存到了服务器中。

file

再次访问靶场页面,因为缓存机制,服务器每次进入主页面都会请求这个JS文件,又因为这个JS已经被投毒,会从缓存服务器中请求这个被重定向的恶意JS文件,触发了XSS。

file

Apache mod_proxy配置请求走私攻击

在apache HTTP Server版本2.4.0-2.4.55中某些mod_proxy配置能够造成HTTP请求走私攻击,启用 mod_proxy 以及特定配置的 RewriteRule 或 ProxyPassMatch 模块时,当规则与用户提供的URL的某些部分匹配时,会因为变量替换从而造成代理请求目标错误。

例如如下配置

RewriteEngine on
RewriteRule "^/nssctf/(.*)" "http://example.com:8080/index.php?id=$1"; [P]
ProxyPassReverse "/nssctf/" "http://example.com:8080/"

这里的id被设置成了$1,当我们访问的url匹配到正则的时,就会进行RewriteRule规则替换,准备新的请求发送给mod_proxy模块,让apache生成一个request请求目标的后端服务器。

file

这里的url字符会被解码,能够进行CRLF注入,id=0以及GET /flag.txt会直接拼接到了请求报文中发送给了后端服务器,造成了请求走私。

具体分析查看:Apache请求走私漏洞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试题】与通义千问的芯片前端设计模拟面试归纳

这里是尼德兰的喵芯片设计相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏! 让我们一起为芯片前端全栈工程师而努力! 前言 两个小时,与chatGPT进行了一场数字IC前端设计岗的面试_尼德兰的喵的博客-CSDN博客 和GPT-3.5的回答可以对比品尝,味道更好。 模…

nacos源码打包及相关配置

nacos 本地下载后,需要 install 下: mvn clean install -Dmaven.test.skiptrue -Dcheckstyle.skiptrue -Dpmd.skiptrue -Drat.skiptruenacos源码修改后,重新打包生成压缩包命令:在 distribution 目录中运行: mvn -Pr…

数字化转型导师坚鹏:数字化时代扩大内需的8大具体建议

在日新月异的数字化时代、复杂多变的国际化环境下,扩大内需成为推动经济发展的国家战略,如何真正地扩大内需?结合本人15年的管理咨询经验及目前实际情况的深入研究,提出以下8大具体建议: 1、制定国民收入倍增计划。结…

QObject::connect: No such signal me::sendMsg(QString s) in ...

QObject::connect: No such signal me::sendMsg(QString s) in ... 解决方案 在使用qt4的connect中,爆的bug: 导致 teacher 的槽函数 receiveMsg(QString s) 一直没有被调用。。。。 解决方案 去掉参数名, 保留类型…

spring6——容器

文章目录 容器:IocIoc容器控制反转(Ioc)依赖注入IoC容器在Spring的实现 基于XML管理Bean搭建环境获取bean依赖注入setter注入构造器注入特殊值处理字面量赋值null值xml实体CDATA节 特殊类型属性注入为对象类型属性赋值方式一:引入…

Spring依赖注入和ioc在spring中的实现方式

目录 一、依赖注入 1.IOC思想 2.什么是依赖注入? 3.实例化对象中有pojo类型属性 二、IOC在Spring中的实现方式 1.获取bean的三种方式 1.1根据bean的id获取 1.2根据bean的类型获取(最常用,因为在IOC容器中,一个类型的bean只…

APUE学习62章终端(一): 整体概览

1. 什么是终端 <Linux_UNIX系统编程手册下>的第62.1介绍了整体概览&#xff0c;但是说得比较模糊&#xff0c;什么是终端这个问题请参考下面的博客: https://www.cnblogs.com/changrunwei/p/15759664.html 它讲解了以下概念: 终端(UNIX和Linux把人和机器可以交互的接…

剑指offer47.礼物的最大价值

这道题挺简单&#xff0c;学过动态规划就会。如果要走到grid[i][j],那你的上一步必须是grid[i-1][j]或者grid[i][j-1],具体是grid[i-1][j]还是grid[i][j-1]&#xff0c;就看哪一步的价值最大&#xff0c;所以用一个与grid等大的dp数组来表示走到grid[i][j]的最大价值是dp[i][j]…

阿里用户序列建模MIMN

Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction 摘要 对于序列建模&#xff0c;实践了机器学习算法与在线服务协同设计的CTR预测系统&#xff0c;理论上可以处理无限长的用户序列。 从服务系统的角度来看&#xff0c;通过设计一个单…

MIT 6.830数据库系统 -- lab five

MIT 6.830数据库系统 -- lab five 项目拉取引言搜索练习1 BTreeFile.findLeafPage() 插入练习2 Spliting Page 删除练习3 页再分配练习4 合并页 事务 项目拉取 原项目使用ant进行项目构建&#xff0c;我已经更改为Maven构建&#xff0c;大家直接拉取我改好后的项目即可: http…

选择器jQuery

诚信是你价格不菲的鞋子&#xff0c;踏遍千山万水&#xff0c;质量也应永恒不变。 jQuery选择器大全总结&#xff1a; jQuery选择器是一种用于在HTML文档中选择元素的强大工具。下面是一些常用的jQuery选择器的总结&#xff1a; 基本选择器&#xff1a; 元素选择器&#xff1a…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作&#xff0c;今天宏哥就用具体例子&#xff0c;将上一篇中的理论知识实践一下。而且在实际测试过程中&#xff0c;有时候需要修改请求或响应数据&#xff0c;或者直接模拟服务器响应&#xff0c;此时可以使用fiddler进行…

测试|测试用例设计常见面试题

测试|测试用例设计常见面试题 文章目录 测试|测试用例设计常见面试题1.怎么模拟弱网&#xff08;测试技巧&#xff09;2.怎么测试接口&#xff08;测试技巧&#xff09;3.怎么对冒泡排序测试&#xff08;代码类&#xff09;4.怎么对linux的zip命令进行测试&#xff08;软件类&a…

Linux: 设置qmake的Qt版本

Qt开发&#xff0c;qmake会对应一个Qt版本&#xff0c;有时候需要切换这个版本&#xff0c;例如把qmake从Qt5.12切换到Qt5.9, 怎么操作呢&#xff1f; 案例如下&#xff1a; 银河麒麟V10系统&#xff0c;下载安装了Qt5.9.8&#xff0c;但是检查qmake发现它使用的是5.12.8&…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive)

JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive) 一、keep-alive介绍 keep-alive是vue的一个内置实例&#xff0c;通过这个属性可以缓存组件的v-node&#xff0c;可以实现页面缓存的功能。 keep-alive有三个属性&#xff1a; 1.include&#xff1a;记录了哪些组件可…

【Spring】聊聊Spring如何解决的循环依赖以及三级缓存

循环依赖是什么 在平时的面试中&#xff0c;只要问到Spring&#xff0c;那么大概率肯定会问什么是循环依赖&#xff0c;Sping是如何解决循环依赖的。以及三级缓存机制是什么。所以为了从根本上解决这个问题&#xff0c;本篇主要详细介绍一下循环依赖的问题。 Spring Bean初始…

IDEA格式化代码快捷键Ctrl+Alt+L失效解决

常见问题是网易云全局快捷键冲突 解决方法&#xff1a;取消下面的全局快捷键勾选

查看进程方式

目录 ps top uptime pstree ps 查看静态的进程统计信息 top 实时显示系统中各个进程的资源占用情况 第一行 top - 17:00:23 up 15 min, 1 user, load average: 1.05, 1.22, 0.98 17:00:23————当前时间 up 15 min————系统运行时间 1 user————当前登录用户数…

客户端实现阿里云OSS文件上传(分片上传,断点续传)

前言 阿里云OSS&#xff08;Object Storage Service&#xff09;是一种稳定、安全、高扩展性的云存储服务&#xff0c;它允许您以低成本、高可靠、高可用的方式存储和访问任意类型的数据。在实际应用中&#xff0c;文件上传是一个常见的功能需求。为了提高上传效率和文件完整性…

Leetcode-每日一题【剑指 Offer 56 - I. 数组中数字出现的次数】

题目 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 示例 1&#xff1a; 输入&#xff1a;nums [4,1,4,6]输出&#xff1a;[1,6] 或 [6,1] 示例 2&#x…