用户
 找回密码
 入住 CI 中国社区
搜索
楼主: visvoy
收起左侧

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

    [复制链接]
发表于 2009-4-1 18:38:28 | 显示全部楼层
嗨,漏洞害人不浅呀,你就当买个教训了吧,同情一下。
发表于 2009-4-1 19:48:54 | 显示全部楼层
官方没有这样的顾虑?
发表于 2009-4-2 23:55:31 | 显示全部楼层
我查了一下,貌似都是在自己的程序代码里进行控制,
例如expression engine这个CMS,系统里有这么一个设置:
Maximum Number of Cachable URIs

If you cache your pages or your database, this preference limits the total number of cache instances in order to prevent your cache files from taking up too much disk space. 150 is a good number for a small site. If you have a large site and disk space is not an issue you can set it higher (over 300). We have an internal limit of 1000 regardless of your preference.

看来官方自己的处理方式也是在代码里手动控制缓存的数量,

只好在用到缓存的地方自己把关了
发表于 2009-4-4 17:33:03 | 显示全部楼层
楼主在这里危言耸听了吧:)

我刚刚测试得到的结果是,假如对传入的参数作出判断,如果传入参数不符合预订规则,然后显示404或者error页面,并不会被缓存
发表于 2009-4-5 02:49:57 | 显示全部楼层
呵 应用起来方便的话 肯定会有弊端的嘛
这个我觉得可以提交BUG给CI官方 让他们想办法修复这个BUG。
 楼主| 发表于 2009-4-5 05:37:33 | 显示全部楼层
楼主在这里危言耸听了吧:)

我刚刚测试得到的结果是,假如对传入的参数作出判断,如果传入参数不符合预订规则,然后显示404或者error页面,并不会被缓存 ...
cuimuxi 发表于 2009-4-4 17:33


你说的是system/CodeIgniter/CodeIgniter.php里面的页面有效性判断,
404或error页面判断与缓存漏洞毫无关系,她不能阻止缓存攻击

如果contorller和method存在,且controller设置了缓存,即出现此漏洞

看看CI_URI和CI_Output类吧,里面写的很清楚
发表于 2009-4-6 16:05:09 | 显示全部楼层
我不知道楼上这样的回答是什么意思
我解释一下我的意思

你在一楼所说的攻击只针对URI后面控制器参数进行的,否则controller或者method不存在会自动返回404错误,每个既定URI的缓存只生成一次,直到它过期,

那么假如对传入参数进行检测,比如你的参数从1~10000000,在渲染页面生成缓存前进行一次参数校验,比如数据库中查询不到对应的内容,直接返回404页面,那么这次缓存就可以避免

当然假如你的站点从1~10000000 都有正常的返回结果,实际上这样全部缓存虽然有点极端,但是仍然是合理的,应该为此缓存准备足够的磁盘空间即使不发生这种穷举式缓存攻击
 楼主| 发表于 2009-4-6 17:04:41 | 显示全部楼层
我不知道楼上这样的回答是什么意思
我解释一下我的意思

你在一楼所说的攻击只针对URI后面控制器参数进行的,否则controller或者method不存在会自动返回404错误,每个既定URI的缓存只生成一次,直到它过期,

那么假 ...
cuimuxi 发表于 2009-4-6 16:05

CI不会对传入参数做合法性验证,倘若你在每个开启缓存的method进行segment合法检测,那就证明,你在设法避免我说的漏洞,也就证明了其可能造成的危害性,绝不是危言耸听

404检测根本管不到CI缓存,在system/CodeIgniter/CodeIgniter.php里面,缓存输出在404检测就已经do掉了,而一直到output->_write_cache(),CI不会对URI串做任何合法检测,输入/1就md5(/1),输入/1/1就md5(/1/1)

关于缓存文件的个数,常用的系统win/*nix根本无法快速处理单目录1000万个文件,造成访问此目录速度缓慢,而1L也计算过了,生成1000万个缓存文件只要1天时间=100GB文件,那么连续10天就是1TB,1个月就是3TB,请问什么硬盘挤不爆?貌似希捷和WD的3TB硬盘暂时还没上市

何况攻击10天以后,缓存文件的数量将达到一亿个!服务器不死也残废了

每个缓存页面都有漏洞,每个缓存method都有漏洞,这不叫严重漏洞叫什么?
发表于 2009-4-6 18:05:22 | 显示全部楼层
我觉得对于缓存的验证 CI 可以做一部分,但是不可能都有 CI 来验证,因为每个程序的规则都不一样。

我觉得这不能算漏洞,应该算是一种功能缺失。因为功能简单,所以没有验证缓存。

PS: 我认为应该加上验证缓存的功能,但是会降低一点性能吧,呵呵。
发表于 2009-4-6 18:50:42 | 显示全部楼层
楼主为什么总是误会我的意思呢,难道我的表达能力就这么差

我没说让CI去干认证参数这档子事,难道就不能在controller的method中加一条小小的数据有效性认证么?

我也没说404能管得了缓存,生成缓存的文件就让它缓存着好了,每次你穷举一个ID,URL都是和上一次不一样的,那么这次会执行到method吧?执行的时候验证一下,如果数据不存在就返回404页面,那么cache中就少了这次缓存,因为404页面是不被缓存的。

如果楼主还是没明白我的意思,我发誓,我不再解释。

本版积分规则