继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Rails安全导读【三】

holdtom
关注TA
已关注
手记 1846
粉丝 240
获赞 991


本系列文章已发布在译言:[url]http://www.yeeyan.com/articles/view/blackanger/17603[/url]

四  重定向和文件

另一类安全问题是围饶在web应用里重定向和文件的使用。

4.1 重定向

web应用里的重定向是一个被低估的craker工具:它不仅可以让用户掉入一个陷进网站,而且还可以创造一个完备的攻击。

当用户被允许由一个URL重定向的时候,它由可能就是个漏洞。最明显的攻击是将用户重定向到一个和原始页面一模一样的假页面。这个所谓的‘钓鱼攻击’通过给用户发送一封包含正常的不让人起疑的链接的email, 通过XSS方式往web应用里注射这个恶意链接或者把链接放到一个虚假的网站(域名看起来差不多,页面也相同的站点)。它是毫不让人怀疑的,因为这个链接的起始URL是这个正常的web应用,指向恶意站点的URL都被隐藏在重定向参数里:[url]http://www.example.com/site/redirect?to=[/url] [url]www.attacker.com. [/url] 这里由个例子:

def legacy

    redirect_to(params.update(:action=>'main'))

end

如果用户访问legacy这个action,将会被重定向到mail action。这样做的意图是为了维护legacy的参数,并把这些参数传到main action。 但是,如果它包含了一个host key,就会被攻击者利用。

[url]http://www.example.com/site/legacy?param1=xy&param2=23&host=www.attacker.com[/url]

如果它在url的尾部, 将很难被注意到,用户就被神不知鬼不觉的重定向到了攻击者的页面。一个简单的对策是,在legacy action里只包含预期的参数(白名单的办法,不是取消所有意向不到的参数)。如果你重定向到一个网址,你需要用白名单或是正则表达式检查它。

4.1.1   Self-contained XSS(自载的xss攻击)

另一个重定向和self-contained XSS 攻击是通过firefox和opera里使用的一种数据协议。该协议直接在浏览器里显示其内容,可以使任何内容,从html,javascript到图片。(这不是一个漏洞,而是一个功能)

data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K

这个例子是一个Base64编码的显示简单消息框的javascript。在一个重定向的URL里,一个攻击者能用它里面的恶意代码重定向这个url。

更详细的攻击原理可以参看这里:[url]http://www.gnucitizen.org/blog/self-contained-xss-attacks/[/url]

对策:do not allow the user to supply (parts of) the URL to be redirected to.(说实话,这里我没看明白)

4.2 文件上传

- 确保文件上次不覆盖重要的文件,和同步的媒体文件进程。

很多web应用允许用户上传文件,用户可以选择的文件名字,应该随时被过滤,因为攻击者可以用恶意的文件名覆盖服务器上任意文件。如果你在/var/www/uploads存储上传文件,用户输入一个文件名:../../../etc/passwd, 它可能覆盖一个重要文件。

当过滤用户输入的文件名时,不要试图去删除恶意的部分。想一想,如果去掉所有的../ , 攻击者输入.. .. //, 那么结果就成了../。最好是用白名单的方式,用一套可接受的字符去检查文件名的有效性。一旦它不是一个有效的文件名,则拒绝它(或替换它),但是不删除它们。这有一份来自attachment_fu插件的文件名清单:

def sanitize_filename(filename)

    returning filename.strip do |name|

        # NOTE: File.basename doesn't work right with Windows paths on Unix

        # get only the filename, not the whole path

        name.gsub! /^.*(\\|\/)/, ''

        # Finally, replace all non alphanumeric, underscore

        # or periods with underscore

        name.gsub! /[^\w\.\-]/, '_'

    end

end

一个重大的缺陷是,同步处理文件上传(比如attachment_fu插件处理多个图片上传),使其易受dos攻击。攻击者可以从很多电脑同时启动图像上传,从而增加服务器负载,最终让服务器崩溃。

要解决这一点,最好是异步处理媒体文件。Save the media file and schedule a processing request in the database. A second process will handle the processing of the file in the background.

4.3  Executable code in file uploads

- 上传文件里的代码在特定的环境下可能被执行,如果Rails / Public 目录是Apache的主目录,请不要把文件上传到此。

如果一个攻击者上传个file.cgi, 有人下载这个文件,代码就会被执行。

4.4  File downloads

- 确保用户无法下载任意文件。

正如你必须过滤上传的文件名一样,对下载文件也应该这样做。下面这个send_file()方法发送文件到客户端,如果你用了一个文件名没有过滤, 用户输入什么都可以被下载。

send_file('/var/www/uploads/' + params[:filename])

简单的通过“../../../etc/passwd”这样一个文件名去下载服务器的登陆信息。简单的解决方式是,检查请求的文件是在允许的目录下:

basename = File.expand_path(File.join(File.dirname(__FILE__), '../../files'))

filename = File.expand_path(File.join(basename, @file.public_filename))

raise if basename =!

         File.expand_path(File.join(File.dirname(filename), '../../../'))

send_file filename, :disposition => 'inline'

另外一个方式是在数据库里存储文件名。这种方式可以避免上传文件的代码被执行。attachment_fu用的就是类似的方式。

安全rubyRails


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP