紀錄一下今天參加的活動。本來想要邊聽邊打的後來懶惰就沒打了。把記得的東西補紀錄一下。
地點:五倍紅寶石
講者:Shaolin
先講結論(Shaolin 大大真的先講結論 XD)
Rails 因為設計良好,很難寫出常見的漏洞。通常出事都是工程師太雷(權限之類)或者是不是 Rails 的錯(shaolin 大大表示:Rails 網站好難打),今天講了幾個案例。
歷史案例 - Mass Assignment
Rails 出過最大的包大概就是 Mass assignment 的漏洞,在 GitHub 的 rails/rails 塞了一個 commit 。
四年前發生的,因為這個 Rails 界應該很多人都知道,講者也沒講很多。我就提供當初 xdite 的兩篇文章給大家參考一下,大家就加減看。
從 Github 被 hack,談 Rails 的安全性( mass-assignment )
Strong Parameter: Mass Assignment 機制的防彈衣
基本上這個現在早就被修掉了。如果很多人一開始學就是 Rails 4 ,可能根本沒遇過這個。
在 GitHub 上面的 Session Secret
Rails 的 Session 預設是存在 Cookie 裡的。實做方式是把 Session 的 Hash 用 base64 encode 之後,再用 secret key 跟 base64 string 做 Sinature 防只有心人士惡意竄改。
所以 config/secrets.yml
如果一不小心被 git add
了,然後被 push 到 GitHub 上公開的 Repo 的話,就可以被拿去偽造。就算你事後刪掉,git 的紀錄都還是留的下來。
我的作法是一開始就把他加到 .gitignore
,然後複製預設的到 secrets.yml.example
。自己用的那套再用 rake secret
重新生。
可以參考這篇:How to hack a Rails app using its secret_token
Dynamic Render Path
在 Rails Controller 裡面,如果你這樣做:
1 2 3 4 |
|
這樣你下 /some_controller/index?page=foo
他就會去找 foo.html.erb
。那如果你下 /some_controller/index?page=/etc/passwd
就很有可能輕鬆 GET /etc/passwd
。
shaolin 提供了一個很有趣的 hack ,因為 rails 預設的 template engine 是 erb ,所以如果你在 content type 裡加上奇怪的東西,比如說<%= `params[:cmd]` %>
,再用前面的方法去 load log/production.log
,從此之後,你就可以輕鬆執行任何指令了。這個 bug 也已經修掉了,現在預設的 template engine 是純文字。但是這種寫法還是很不好,因為其他檔案都被看光光。我看了一下我的網站,幸好有類似作法的都是用 if 去判斷某幾種參數,不然就跳到 fallback。
參考講者公司的 Blog 文章: Rails 動態樣板路徑的風險
Imagetragick
網頁常常會用到 ImageMagick ,因為常常會用到上傳圖片等等功能。在很多常用的 Gem 裡都有包含。比如說carrierwave、paperclip、RMagick、mini magick。
因為這些會去執行到 shell 指令,概念就是 convert a.png out.jpg | ls -la
之類的。這是很新的 bug (CVE-2016-3714),所以要趕快更新 ImageMagick。
還有網站專門講這個的 ImageTragick // Make ImageMagick Great Again XDDDDDD
SQL Injection
講者還講了很多 Rails 的 SQL Injection 。其實 Rails 的 SQL Injection 防的不錯,剩下的其實都蠻難湊出來的。
有個網站有整理:Rails SQL Injection