脆弱的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也没有修正这个问题) 看完收获很大,深深的佩服楼主!!
我是小白,弱问一下,我用routes.php 伪静态的页面,攻击者没办法给增加缓存吧?
比如$route['news/(:num)'] = 'welcome/news/$1';
1. 给定个数参数且是数字 。
2. 控制器中判断不存在数据就不缓存.
真的挺恐怖的。看来CI缓存的条件不好,我想如果缓存前先对url做一个判断,即存在此文件(合法访问)就缓存,不合法的就忽略。 真的挺恐怖的。看来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 学习 关闭缓存呢:lol 关闭缓存呢:lol
lxylxy888666 发表于 2009-3-14 15:55 http://codeigniter.org.cn/forums/images/common/back.gif
那就要牺牲性能啦,比如news系统不用缓存会比较慢 的确令人堪忧,目前一直未使用缓存,将其他访问速度优化好,速度还是可以的 最近更新:
总结一下本贴里提出的解决方案或思路,希望对大家有价值:
[*]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
值得关注。 有利有弊,学习了