Skip to content

Latest commit

 

History

History
87 lines (56 loc) · 4.98 KB

20210108.md

File metadata and controls

87 lines (56 loc) · 4.98 KB

HTTP Request Smuggling

通用缺陷列表有超过600个的分类,包括缓冲溢出,路径索引遍历树错误,竞争状态条件,跨站脚本,硬编码密码以及不安全随机数等

HTTP Request Smuggling

在用户和web服务器之间存在代理(正向代理和反向代理),例如防火墙、nginx、路由器,代理对http的解析规则跟web服务器不一致,导致Smuggling

正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;而反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器。

正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见; 而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。 image.png image.png

eg1.

POST http://www.website.com/foobar.html HTTP/1.1
Host: www.website.com
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Content-Length: 44

GET /poison.html HTTP/1.1w
Host: www.website.com
Bla: GET http://www.website.com/page_to_poison.html HTTP/1.1
Host: www.website.com
Connection: Keep-Alive

当请求发送到代理服务器时,代理服务器在前七行中解析POST请求,并遇到两个“ Content-Length”。代理服务器忽略第一个标头,因此它假定请求的主体长度为44个字节。因此,它将后面三行中的数据(恰好包含44个字节)视为第一个请求的正文。然后,代理解析最后三行,将其视为客户端的第二个请求。

该请求由代理服务器转发到Web服务器。与代理服务器不同,Web服务器使用第一个“ Content-Length”,并认为第一个POST请求没有正文,第二个请求是第一个GET所在的行(请注意,第二个GET由Web服务器解析作为“ Bla”标头的值)。

Web服务器看到的请求是“ POST /foobar.html”和“ GET /poison.html”,因此它将发送回两个响应,分别包含“ foobar.html”页面和“ poison.html”页面的内容 。代理将这些响应认为是客户端“ POST /foobar.html”和“ GET /page_to_poison.html”发送的两个请求进行匹配。如果响应是可缓存的,则代理将URL的“ poison.html”的内容缓存在URL“ page_to_poison.html”下,任何从代理请求“ page_to_poison.html”的客户端都将收到“ poison.html”页面。

解决方式: 1、使用包含更严格的HTTP解析或者取消缓存 2、使用安全组件Java Servlet

eg2.

POST /page.asp HTTP/1.1
Host: www.website.com
Connection: Keep-Alive
Content-Length: 49223

zzz...zzz ["z" x 49152]
POST /page.asp HTTP/1.0
Connection: Keep-Alive
Content-Length: 30

POST /page.asp HTTP/1.0
Bla: POST /page.asp?cmd.exe HTTP/1.0
Connection: Keep-Alive

当此请求发送到Web服务器时,第一个POST请求的内容长度为49,223字节,并且防火墙将具有49,152个“ z”副本的行和具有71字节的其他行的行作为其主体( 49,152 + 71 = 49,223)。然后,防火墙继续解析认为是第二个请求的内容,该请求以第三个POST请求的行开头。

“Bla:”标头后面没有CRLF,因此该行中的POST被解析为“ Bla:”标头的值。尽管该行包含以蠕虫(“ cmd.exe”)标识的模式,但由于它被视为标头值的一部分,因此不会被阻塞。因此,“ cmd.exe”是通过防火墙走私的。

当请求通过防火墙传递到Web服务器时,第一个请求将被忽略,因为Web服务器未找到预期的“ Content-Type:应用程序/ x-www-form-urlencoded”标头,并开始解析第二个请求。

第二个请求的内容长度为30个字节,该长度恰好是“ Bla:”标头后面的下两行的长度。与防火墙不同的是,Web服务器将最终的POST作为单独的第三个请求进行处理,并且“ cmd.exe”蠕虫通过防火墙被走私到Web服务器。

Affected versions of Node.js allow two copies of a header field in a http request. For example, two Transfer-Encoding header fields. In this case Node.js identifies the first header field and ignores the second. This can lead to HTTP Request Smuggling https://cwe.mitre.org/data/definitions/444.html

新闻&推荐阅读

nodejs对v10,x, v12.x, v14.x and v15.x进行了更新

GitHub:已获美国许可,恢复伊朗开发者使用权限

凹凸实验室的过去与未来

初级前端如何突破瓶颈

21个2021年软件开发趋势预测