无效的应用程序路径_偷天换日术 - Web应用程序中的缓存毒化

3bf27fb3b87524c8b078029591604b8d.png

缓存机制的应用为互联网用户提供了极大的便捷:一方面,缓存机制缓解了服务器对数据的请求次数,使用户获得了流畅的上网体验感,同时也为服务器节省了很多的运作成本。如今,也涌现出许多以提供缓存服务为主的商业化公司。

一般情况下通过扩展名来配置缓存文件,比如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>

或者,可以这样:

050b9239c296b4bfad206a93f34bc055.png

一些小技巧

下面这条请求也可以起传递标头的作用:

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应用程序的某些特性可以导致缓存被毒化,并以此对客户端发起攻击。去试试吧。

译文申明:

本文是翻译文章,文章原作者:Взрывной блог

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值