缓存机制的应用为互联网用户提供了极大的便捷:一方面,缓存机制缓解了服务器对数据的请求次数,使用户获得了流畅的上网体验感,同时也为服务器节省了很多的运作成本。如今,也涌现出许多以提供缓存服务为主的商业化公司。
一般情况下通过扩展名来配置缓存文件,比如css,js这样的静态文件就可以被缓存下来。
Omer Gil便利用了这种的机制——如果web应用程序对某个不存在的请求响应为“200 OK”,那么在该URL后添加一个静态文件的扩展名(比如css),该页面就会被缓存在服务器中并且可供攻击者调用。
详情见:
https://omergil.blogspot.ru/2017/02/web-cache-deception-attack.html
网络中存在着各种各样的缓存配置以及缓存微调。然而,也同样存在着有漏洞的缓存机制,下面我将会讲解这些机制。这些有漏洞的缓存机制催生了像缓存欺骗(cache deception)和缓存毒化(cache poisoning)这类攻击手段。
web应用程序的常见特点
通常情况下只需在nginx中做如下配置,便可以将域名绑定到WEB应用上:
server {
listen 80;
server_name _; // 接受任何域名
...
}
Web应用程序自身使用的是$_SERVER[‘HTTP_HOST’]或者类似的配置。
当访问mysite/index.php页面时,该页面将显示类似如下的代码:
<script src=' https:// mysite/assets/js/jquery .js '></script>
但是,如HTTP请求中携带着 “HOST” 时:
GET /index.php HTTP/1.1
Host: evil
页面则会显示下面的代码。
<script src=' https:// evil/assets/js/jquery.j s '></script>
如果我们改变域名,那么加载资源的路径或页面链接也将发生变化。我想大家应该遇见过这样的网站,这些网站通常不允许用户发送带有Host的链接。但有时却可以做到。
关于缓存机制
缓存机制可以分为以下几类:
1、缓存不带参数的文件:
- https://mysite/pic.jpg —— 进入缓存
- https://mysite/pic.jpg?myparam=test —— 不会进入缓存,因为链接中带有参数。
2、忽略参数后缓存:
- https://mysite/pic.jpg?myparam=test
- https://mysite/pic.jpg?myparam=test&myparam2=test2
- 对上面两个URL进行的缓存查询结果返回的都是:https://mysite/pic.jpg
3、每一个URL都会被缓存:
- https://mysite/pic.jpg?myparam=test
- https://mysite/pic.jpg?myparam2=test2
- 这两个都会被缓存。
所以,首次访问页面时, 如果请求中不含有参数,那么请求的资源将会被缓存下来。
缓存毒化
攻击的思路是这样的:可以通过替换Host来构造还没有在web应用程序中出现过的特殊链接。
GET /?MyUniqParam=test1337 HTTP/1.1
Host: http:// evil.com
如果该链接进入了缓存(有些情况下是可以缓存的)——我们就可以从受我们控制的资源中加载js了。
通过对目标用户发送链接。我们就有实施xss攻击的可能性了,因为我们自己的域名已经预先保存在该页面中了。
<script src=' https:// evil.com/assets/js/jque ry.js '></script>
或者,可以这样:
一些小技巧
下面这条请求也可以起传递标头的作用:
GET https:// evil/? myparam=test
Host: mysite
如果该请求被网站禁止,那么可以尝试改变标头内容。
可以先做一个经典的HTML注入,将xss载荷传递到标头中。
但有时候另一个小技巧也很有用,有一些web服务器会忽略掉Host中“:”之后的内容,但是这些内容也会进入到页面中。
所以第一步我们应该先尝试发送这样的请求:
Host: mysite:"><xss>
如果被过滤掉了的话。还可以尝试添加@字符:
Host: mysite:@evil
经过设计的链接中允许抛弃一部分数据,比如我们的例子里mysite会被当作basic auth的login,而evil便成了终端host。
当上面的方法都无效时,可以在要注入的代码前加上空格试试:
Host: mysite "><xss>
还有一些情况下X-Forwarded-Host和Forwarded可以改变Host的值,可以同时添加X-Forwarded-Hos和合法的Host:
GET /?myparam=test HTTP/1.1
Host: mysite
X-Forwarded-Host: evil
Forwarded的使用有稍许不同:
GET /?myparam=test HTTP/1.1
Host: mysite
Forwarded: host=evil
如果缓存设置在特定的目录或文件格式上,还可以尝试使用css或js来攻击,而不是仅仅在页面参数上。或者尝试调用可能具有攻击性缓存的目录,例如/static/、/js/、/upload。
结论 —— 这并不是对所有的缓存都有效,除了Host外你还可以尝试利用页面中的其他数据。比如User-agent或者Referer。利用WEB应用程序的某些特性可以导致缓存被毒化,并以此对客户端发起攻击。去试试吧。
译文申明:
本文是翻译文章,文章原作者:Взрывной блог。