visvoy 发表于 2009-3-14 11:08:26

脆弱的CI缓存系统,1天攻陷你的CI网站

本帖最后由 visvoy 于 2009-3-14 11:15 编辑

CI自带的缓存系统确实很方便,但她存在一个很大的弊端,看缓存系统的源码:
CI把md5(index.php+uri_string)作为缓存文件名(没完全copy,详见libraries/output.php)
这个uri_string允许URI串夹杂垃圾信息,比如:
http://ci-site.com/index.php/index/index/1
http://ci-site.com/index.php/index/index/1/2
http://ci-site.com/index.php/index/index/1/2/3
上面三个请求,CI将生成3个不同的缓存文件

问题来了,假如攻击者写一个并发访问脚本:
每秒并发访问100次(任何adsl用户都有足够带宽发起攻击)
循环访问 index.php/index/index/1 至 index.php/index/index/10000000
那么服务器将生成一千万个首页垃圾缓存,在同一个目录里面!
假如你的网站首页html有10kb(一般来讲,10kb作为首页不算大)
这个缓存目录的尺寸将达到:10kb x 10,000,000 = 100GB
完成攻击所需时间:大约27小时

此时你的网站面临两个问题:
1. 访问每个CI页面极其缓慢,因为缓存目录有1000万个文件,文件系统反应迟钝
2. CI所在磁盘分区被挤爆,所有CI缓存无法写入(你的分区可能超过100GB,但挤爆只是时间问题)

*如果你把缓存目录设置到ramdisk里面,很快就会内存不足~

由于CI不会主动删除过期缓存(访问到对应的URI时候才更新),
这1000万个垃圾文件将长期驻留在服务器中,让网站永久慢如蜗牛

缓存文件攻击,对所有版本CI都有效(最新1.7.1也没有修正这个问题)

xuyaokun 发表于 2014-10-23 01:36:09

看完收获很大,深深的佩服楼主!!

我是小白,弱问一下,我用routes.php 伪静态的页面,攻击者没办法给增加缓存吧?
比如$route['news/(:num)'] = 'welcome/news/$1';

1. 给定个数参数且是数字 。
2. 控制器中判断不存在数据就不缓存.

neversaylate 发表于 2009-3-14 11:15:39

真的挺恐怖的。看来CI缓存的条件不好,我想如果缓存前先对url做一个判断,即存在此文件(合法访问)就缓存,不合法的就忽略。

visvoy 发表于 2009-3-14 11:19:59

真的挺恐怖的。看来CI缓存的条件不好,我想如果缓存前先对url做一个判断,即存在此文件(合法访问)就缓存,不合法的就忽略。
neversaylate 发表于 2009-3-14 11:15 http://codeigniter.org.cn/forums/images/common/back.gif
这个判断比较麻烦哦,每个带缓存的controller都要判断,
而且缓存系统在controller运行之前就已经display_cache了
需要为每个带缓存的controller写规则,然后做hook->pre_system

ndljava 发表于 2009-3-14 11:43:36

学习

lxylxy888666 发表于 2009-3-14 15:55:41

关闭缓存呢:lol

visvoy 发表于 2009-3-14 16:51:39

关闭缓存呢:lol
lxylxy888666 发表于 2009-3-14 15:55 http://codeigniter.org.cn/forums/images/common/back.gif
那就要牺牲性能啦,比如news系统不用缓存会比较慢

sam 发表于 2009-3-14 18:23:21

的确令人堪忧,目前一直未使用缓存,将其他访问速度优化好,速度还是可以的

Hex 发表于 2009-3-14 21:14:21

最近更新:

总结一下本贴里提出的解决方案或思路,希望对大家有价值:

[*]http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=3&fromuid=2#pid9709
[*]http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=4&fromuid=2#pid9961
[*]http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=5&fromuid=2#pid10064
[*]楼主的解决方案:http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=6&fromuid=2#pid10080
[*]http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=7&fromuid=2#pid10386
[*]http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=8&fromuid=2#pid10749
[*]http://codeigniter.org.cn/forums/viewthread.php?tid=1690&page=9#pid10800

kissmumu 发表于 2009-3-14 23:03:25

值得关注。

xihen 发表于 2009-3-16 09:17:11

有利有弊,学习了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 脆弱的CI缓存系统,1天攻陷你的CI网站