你驻足于春色中,于那独一无二的春色之中.
这篇文章主体框架来自@regilero在DEFCON上的议题-HTTP smuggling is a thing we should know better and care about.
作为重度网络依赖人群,我们每天都使用程序将数百次网页请求抛送到无形的网络空间中去,我们告知网络服务器我们要访问的资源,接受何种格式、何种语言的回应,是否要和服务器维持一段时间的连接,是否需要保存一些状态以及告知服务器你的代理发送人(浏览器或其他)身份。但是我们了解我们发送的这些东西的真正含义吗?
其实作为一次网页请求,理论上我们只要告诉服务器我们要的资源url就可以。那么那些多余的键值大体起什么作用呢?
HTTP管线化是作者提到的又一个漏洞基础,管线化使得多个HTTP请求不需要等待应答即可发送,使用这一技术的初衷是提高页面的载入性能,通过一个数据包来发送多个HTTP请求,也可以减轻网络负载压力。
这是在一次管线化测试中捕获的HTTP包,可以很清晰的看出在这一个TCP包中拥有三个HTTP包。作者把Pipelines称为大多数smuggling问题之源。在我们实际的使用过程中,实际上并没有真正用到这一技术,因为大多数的浏览器默认并不使用HTTP Pipeline。但是实际上根据文档说明,大多数的服务端都应该支持这一技术。
对于Pipeline技术而言,虽然同时发出多个HTTP请求,但实际上它们还是有先后顺序的,而回应顺序与发送的先后顺序一致。
前面说到了HTTP Smuggling的两个基础是Header中的keep-alive和pipelining技术,而产生矛盾就产生于客户端与服务器通信经过中间代理这样的结构。
client——>middleware——>server
当客户端和代理通信时会使用Pipeline,而代理和服务器通信会保持keep-alive但不会使用Pipeline,而服务端不会意识到这一点,这就会造成两次不一样的请求通过构造会被服务端认为是同一次请求。
所以进行smuggling的过程就是:
在这里,作者告诉我们其实早在2005年,就已经有人提到了这种利用手法,最终可以造成的效果包括:
接下来的是作者的Demo展示,可惜作者在这里使用go语言和Nodejs来编写中间件和服务端,并没能在本地环境复现作者的手法,这个只能等到以后回顾的时候再来复现了。
作者在最后还许了一个愿,他会在考虑安全因素的条件下在Github上放出一个相关漏洞代理的自动化测试工具,不过已经过去一个月了吧。
看作者的框图,这应该是一个通过发包、接受回应比对来判别代理漏洞利用的工具吧。