5. 企业内联专用网和管理安全
— 企业内联网和管理界面是最流行的攻击目标, 因为它们有特殊的访问权限. 虽然它会有一些额外的安全措施,可是现实里并非如此。
2007年,在线招聘站点Monster.com遭受了一起定制木马(Tailor-made Trojans)攻击,这是第一只专门从企业内联网偷窃信息的定制木马 。定制木马是非常罕见的,迄今为止,发生率比较低, 但是它也确实是可能发生的,这也是一个客户端主机安全何等重要的例子. 然而,企业 内联网和管理应用程序面对的最大威胁还是XSS和CSRF.
XSS 如果你的应用重现了恶意用户从外网的输入,那么你的应用会受到XSS的危害。用户名,评论,垃圾邮件等是容易被XSS攻击的常见的 例子。
在管理界面或是内网只要一个地方没有被消毒(sanitized)就会导致整个应用遭受危害。可能的漏洞包括窃取有特权管理员的cookie, iframe注入(Monster.com就是被这样攻击的)窃取管理员密码或者是通过浏览器的安全漏洞安装一款恶意软件来接管管理员的计算机。
参看Injection章节,有XSS的对策,以及推荐了一款在内网和管理员界面使用的SafeErb的插件。
CSRF 跨站点 Reference 伪造 (CSRF) 是一个强大的攻击方法,它允许攻击者能做内网用户和管理员能做的一切事情。正如你已经看到上面 几部分里CSRF如何工作的,这里也有一些例子,说明攻击者能在内网和管理界面做些什么。
一个现实世界的例子是一个通过CSRF重新配置路由的例子。这个攻击者发送了一封包含CSRF的恶意的电子邮件给墨西哥的用户。电子邮件声 称有一个电子贺卡等着他们,但是它也包含了一个可以造成一个HTTP- GET请求去重新设置用户路由的图像标记(image tag)(这在墨西哥比 较流行)。这个请求改变了DNS设置以便到墨西哥银行的请求可以映射到攻击者的站点。每个访问银行网站的人通过这个路由都能看到攻击者的 伪造站点,并且他的证书被盗。
另一个例子是通过GSRF改变Google Adsense的email地址和密码。如果受害者是登陆到Google Adsense,一个Google竞投广告的管理界面, 攻击者可能会改变他的安全证书。
另一种流行的攻击是你的web应用上的垃圾, 在你的blog或者论坛传播恶意XSS. 当然,攻击者必须知道URL结构,但是大多数的Rails URLS 是相对简单,或者,如果它是一个开源应用的管理界面,是很容易被他们找出的。攻击者甚至可以做1000个仅包括恶意img tags的幸运的猜测 去尝试每一个可能的组合。
对于在管理界面和内网应用的CSRF对策,请参考CSRF章节里的对策。
5.1. 额外的预防措施
一般的管理界面是这样工作的: 它的位置是www.example.com/admin, 可只有在用户模式被设置了admin tag的才能访问。重现用户的输入, 然后删除,增加,修改想要的任何数据。这里有一些想法:
考虑最坏的情况是非常重要的: 如果某人真的掌握了我的cookie或是用户证书。你能控制角色为管理界面去限制攻击者的可能性。或者除了 哪些用于公共部分的应用,为管理界面提供一个专门的登陆证书如何,或者对于每次重要的action提供一个密码 ?
是否这个管理员真的必须能从世界各地访问这个接口? 考虑一下根据ip地址段来限制登陆。检测request.remote_ip 了解用户的IP地址. 这并不是防弹的,而只是制造一个障碍。但请记住,有可能有人在使用代理。
把管理界面放到一个专门的子域,例如admin.application.com,使其用户管理成为一个单独的应用程序。这使得攻击者不可能从通常的 www.application.com窃取cookie。这是因为在你的浏览器里存在同一个原生标准: 在www.application.com的注入脚本(XSS)不能读取 admin.application.com的cookie,反之亦然。
6. Mass assignment
— 是指对Model.new(params[:model]) 允许攻击者设置任意数据库列的值没有任何防范措施。
这个mass-assignment可能变成一个问题, 因为它允许攻击者通过操作hash传到一个model的new()方法里来设置model的任意属性 :
def signup
params[:user] #=> {:name => “ow3ned”, :admin => true}
@user = User.new(params[:user])
end
Mass-assignment为你省去了大量的工作, 因为你不必要去设置每个单独的值。只需要给new()方法传一个hash,或者是指定attributes= (attributes)hash值,就可以在hash里设置一个model的属性。问题是,在controller里经常使用可用的hash参数会被攻击者操纵。 他可能会 这样改变URL:
http://www.example.com/user/signup?user[name]=ow3ned&user[admin]=1
这样会在controller里设置如下的参数 :
params[:user] #=> {:name => “ow3ned”, :admin => true}
如果你通过mass-assignment这种方式创建一个新用户,那么这个用户很有可能会变成一个管理员。