用户
 找回密码
 入住 CI 中国社区
搜索
查看: 76627|回复: 110
收起左侧

[讨论/交流] 脆弱的CI缓存系统,1天攻陷你的CI网站

    [复制链接]
发表于 2009-3-14 11:08:26 | 显示全部楼层 |阅读模式
本帖最后由 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也没有修正这个问题)
发表于 2014-10-23 01:36:09 | 显示全部楼层
看完收获很大,深深的佩服楼主!!

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

1. 给定个数参数且是数字 。
2. 控制器中判断不存在数据就不缓存.
发表于 2009-3-14 11:15:39 | 显示全部楼层
真的挺恐怖的。看来CI缓存的条件不好,我想如果缓存前先对url做一个判断,即存在此文件(合法访问)就缓存,不合法的就忽略。
 楼主| 发表于 2009-3-14 11:19:59 | 显示全部楼层
真的挺恐怖的。看来CI缓存的条件不好,我想如果缓存前先对url做一个判断,即存在此文件(合法访问)就缓存,不合法的就忽略。
neversaylate 发表于 2009-3-14 11:15

这个判断比较麻烦哦,每个带缓存的controller都要判断,
而且缓存系统在controller运行之前就已经display_cache了
需要为每个带缓存的controller写规则,然后做hook->pre_system
发表于 2009-3-14 11:43:36 | 显示全部楼层
学习
发表于 2009-3-14 15:55:41 | 显示全部楼层
关闭缓存呢
 楼主| 发表于 2009-3-14 16:51:39 | 显示全部楼层
关闭缓存呢
lxylxy888666 发表于 2009-3-14 15:55

那就要牺牲性能啦,比如news系统不用缓存会比较慢
发表于 2009-3-14 18:23:21 | 显示全部楼层
的确令人堪忧,目前一直未使用缓存,将其他访问速度优化好,速度还是可以的
发表于 2009-3-14 21:14:21 | 显示全部楼层
发表于 2009-3-14 23:03:25 | 显示全部楼层
值得关注。
发表于 2009-3-16 09:17:11 | 显示全部楼层
有利有弊,学习了

本版积分规则