rails:Rails安全导读【完】来源: 发布时间:星期四, 2009年1月8日 浏览:2次 评论:0
8.注入
— 注入这类攻击是给个web应用引入恶意代码或是参数以便在其安全上下文里运行注入著名例子就是跨站点脚本(XSS)和SQL注入 注入是非常棘手相同代码或参数在个环境是恶意但是换个环境却是完全无害个上下文可以是个脚本查询或是语言shell或是Ruby/Rails思路方法 下面章节会涵盖所有重要注入攻击可能发生所有上下文然而第部分只涉及个和注入相关架构决策 8.1. 白名单 vs 黑名单 — 当净化(sanitizing)保护(protecting)或者验证(verying)些东西时候白名单胜于黑名单 黑名单可以是堆恶意e-mail地址清单非公开actions或者是恶意HTML tags 这正好和白名单相反白名单是安全e-mail地址公开actions合法HTML tags等等虽然有时候不可能去创建个白名单(比如在个垃圾过滤器里)但也更应该偏向于去使用白名单方式:: * 使用 before_filter :only ⇒ […] 代替 :except ⇒ […]. 这个思路方法使你避免忘记去屏蔽新增actions带来困扰 * 使用 attr_accessible 代替 attr_protected. 请看mass-assignment这节内容(白名单) * 允许<strong>而不是取消<script>来应付Cross-Site Scripting (XSS)看下文细节 * 不要使用黑名单方式验证用户输入: o 这是段可用攻击代码: "<sc<script>ript>".gsub("<script>", "") o 但要拒绝恶意输入 白名单是个好思路方法可以避免在黑名单里人为原因而忘记些东西情况 8.2. SQL注入 — 要感谢那些聪明思路方法使得在大多数Rails应用中SQL注入成为了个困难问题然而这是个在web应用里非常严重和常见攻击所以理解它是重要 8.2.1. 引入 SQL注入攻击目是通过操作web应用参数来影响数据库查询种常见目标SQL注入攻击是绕开授权另种目标是执行数据操纵或者是读取任意数据这有个例子来介绍说明在查询里不使用用户输入数据 : Project.find(:all, :conditions => "name = '#{params[:name]}'") 这段代码可能放在search action里用户可以输入个项目名字来查找他想找那个项目 如果个恶意用户输入了OR 1=1, 查询结果就会变成: SELECT * FROM projects WHERE name = '' OR 1 --' 这两破折号开始个注释忽略它后面切玩意儿 所以查询返回projects表全部记录包括对用户屏蔽内容 这是查询条件为真 8.2.2. 绕过授权 般个web应用是包括访问控制用户输入他登陆凭证web应用试图在users表里去找到和其相匹配结果如果它找到条记录那么应用就授其访问权限然而个攻击者可能通过SQL注入手段绕开这个检查下面是个典型Rails数据库查询,当那些登陆凭证和用户输入致时就会在users表里找到对应第条记录 User.find(:first, "login = '#{params[:name]}' AND password = '#{params[:password]}'") 如果个攻击者输入 OR '1=1 作为用户名, OR 2>'1 作为密码, 那么查询结果就会变成: SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1 这会很简单就找到了数据库第条记录并且给了这个用户访问权限 8.2.3. Unauthorized reading UNION连接两个SQL查询会返回组数据集个攻击者可以用它来读取数据库里任意数据让我们拿上面例子来看 : Project.find(:all, :conditions => "name = '#{params[:name]}'") 现在让我们使用UNION来注入另个查询: ') UNION SELECT id,login AS name,password AS description,1,1,1 FROM users -- 它最后是这样SQL查询结果: SELECT * FROM projects WHERE (name = '') UNION 这个结果不会是项目列表(给name是空)而是返回用户名和他们密码列表所以希望你在数据库里对密码加密!对攻击者来说唯问题是这两则查询语句列数必须相同这就是为什么第 2个查询包含了组(1)它们值直为1是为了匹配第组查询列数(译者注:projects表为6列那么后面也是6列所以要加 3个1) 此外第 2个查询语句用as重新命名了些列名字是为了使web应用显示这些user表里值定要更新你Rails到最新2.1.1 8.2.4.对策 Ruby _disibledevent="background:url('java↵ script:eval(document.all.mycode.expr)')"> 另个对于蠕虫作者问题是CSRF安全令牌如果没有话他不能通过POST发送以个朋友请求他在增加好友解析结果的前通过发送个GET访问个正确页面来绕开CSRF令牌 最后他得到了个4kb蠕虫并把它注入到了他自己个人资料页面 moz-binding 提供另种基于Gecko浏览器(例如Firefox)在CSS里引入JavaScript思路方法 8.4.1. 对策 这个例子再次介绍说明了黑名单永远会有遗漏然而自定义CSS在网络应用是种相当罕见功能我不知道白名单CSS过滤器如果你想允许自定义颜色或图像 可以让用户选择web应用提供模板如果你真需要这样个功能请使用Railssanitize思路方法作为种css白名单过滤模式 8.5. Textile 注入 — 如果你想提供HTML的外其他文本格式(为了安全)请使用在服务端转化为HTML标记语言RedCloth就是为Ruby提供这种功能语言但是没有防范措施话就会是个XSS缺陷 0
相关文章
读者评论
发表评论 |