成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rails動態模板路徑的風險

安全 應用安全
今天要分享的,是一次滲透測試中比較特別的例子。因為開發者使用了動態模板路徑(Dynamic Render Paths)的寫法(注解1),最后造成了嚴重的結果。

[[172440]]

前言

從安全開發的角度來看,Ruby on Rails是一套很友善的框架。它從框架層避免了很多過去網站長出現的安全問題。例如使用ORM避免大部分的SQL injection問題,有內建的authenticity_token讓開發者不必特別煩惱CSRF,從機制面規定了開發者使用Strong Parameter來避免Mass Assignment,預設轉化危險字符避免XSS等。

就我們從過去的滲透測試的經驗來看,Rails網站雖然還是能找到問題,但相對問題較少,而且很少單純因為Rails寫法問題拿到系統權限。而今天要分享的,是一次滲透測試中比較特別的例子。因為開發者使用了動態模板路徑(Dynamic Render Paths)的寫法(注解1),最后造成了嚴重的結果。

動態模板路徑,OWASP的介紹是這樣的:

OWASP是這樣說,如果你的模板路徑是動態產生的,而且使用者可以控制那個模板路徑。那么使用者就可以讀取任意模板,包括管理界面模板。這樣的描述感覺還好,但就我們的發現,這其實是嚴重的直接存取物件問題(Insecure Direct Object References),甚至有機會造成遠程代碼執行(Remote Code Execution)。怎么說呢?我們直接看下去。

基本細節

一個動態模版路徑的寫法如下:

  1. # app/controllers/welcome_controller.rb 
  2. class WelcomeController < ApplicationController 
  3.   def index 
  4.     page = params[:page] || 'index' 
  5.     render page 
  6.   end 
  7. end 

而index的模版內容是這樣:

  1. <span class="c">#app/views/welcome/index.html.erb 
  2. This is INDEX page.</span> 

另外建一個demo模版做示意:

  1. # app/views/welcome/demo.html.erb 
  2. This is DEMO page. 

實際測試,如果我們連到WelcomeController的index action,不帶任何參數會讀取index模版。

如果帶參數page=demo,會讀取到demo模版。

所以,如果我們知道管理界面的模版路徑,送出路徑參數就可以讀取到管理界面。這就是OWASP所描述的風險,攻擊者得以讀取任意模版。

然而,當我們嘗試送出系統絕對路徑例如/etc/passwd(注解2),網頁竟然顯示/etc/passwd的內容!這就是之前所述的直接存取物件問題,可以遍歷目錄瀏覽檔案。

進階攻擊

通常在Rails環境下能夠讀取任意檔案,攻擊者會優先尋找secret_token,目的是變造惡意session cookie利用Marshal serialize的問題做RCE。然而在本案例系統使用了Rails 4.1后的版本,Rails 4.1預設使用了JSON-based的serializer防止了之前的RCE問題,所以并沒有辦法輕松利用。

為了取得系統操作權,我們嘗試尋找其他可利用的地方。在這邊我們發現了該站系統production.log中存在AWS的上傳紀錄。如下:

  1. # log/production.log 
  2. INFO -- : [AWS S3 200 0.041347 0 retries] put_object(:acl=&gt;:public_read,:bucket_name=&gt;"xxx 

于是我們可以利用上傳檔案的Content-Type內容,將Embedded Ruby語句<%

  1. #{params[:devcore]} 

%>添加到production.log檔案里面。于是log的內容變成了下面這樣:

 

  1. # log/production.log 
  2. INFO -- : [AWS S3 200 0.041347 0 retries] put_object(:acl=&gt;:public_read,:bucket_name=&gt;"xxxx",:content_length=&gt;12405,:content_type=&gt;"image/png",:data=&gt;#&lt;File:/Users/shaolin/project/playground/rails/render/public/uploads/tmp/test_upload.png (12405 bytes)&gt;,:key=&gt;"upload_001") 
  3.  
  4. INFO -- : [AWS S3 200 0.040211 0 retries] put_object(:acl=&gt;:public_read,:bucket_name=&gt;"xxx 

 

接著,我們就可以利用前面的弱點讀取production.log檔案,再帶一個devcore參數作為指令,如圖,成功取得系統權限:

風險原因

一般來說Rails開發并不太會這樣寫,但稍微搜尋一下Github還是能發現這種寫法存在一些項目中。我想主要原因多半是開發者想要偷懶,然后也可能想說動態模板路徑頂多就被看到面板的html,無傷大雅。誰知道就因為這樣導致整個代碼內容被讀取。

若有一個action要動態顯示不同模版的需求,為了避免上述的問題,就辛苦點先用case…when去判斷吧。這跟不要用字串組SQL語句避免SQL injection一樣,這種外面傳進來的參數都要謹慎處理的觀念要內化在開發中。

除了開發者基本上不應該這樣開發外,Rails本身也有一點點問題,當render路徑沒有擴展名,無法判斷什么格式時,就會直接采用預設的template handler。

  1. # lib/action_view/template/resolver.rb 
  2. def extract_handler_and_format_and_variant(path, default_formats) 
  3.   pieces = File.basename(path).split(".") 
  4.   pieces.shift 
  5.  
  6.   extension = pieces.pop 
  7.   unless extension 
  8.     message = "The file #{path} did not specify a template handler. The default is currently ERB, " \ 
  9.               "but will change to RAW in the future." 
  10.     ActiveSupport::Deprecation.warn message 
  11.   end 
  12.  
  13.   handler = Template.handler_for_extension(extension) 
  14.   format, variant = pieces.last.split(EXTENSIONS[:variants], 2) if pieces.last 
  15.   format  &amp;&amp;= Template::Types[format] 
  16.  
  17.   [handler, format, variant] 
  18. end 

而這里預設的handler是ERB(見register_default_template_handler),所以有本篇后面提到的進階攻擊,可以被利用來RCE。

  1. # lib/action_view/template/handlers.rb 
  2. def self.extended(base) 
  3.   base.register_default_template_handler :erb, ERB.new 
  4.   base.register_template_handler :builder, Builder.new 
  5.   base.register_template_handler :raw, Raw.new 
  6.   base.register_template_handler :ruby, :source.to_proc 
  7. end 

慶幸的是,目前Rails已經把預設的template handler從ERB改成RAW,不會輕易把要render的檔案當成ERB執行了。詳細的內容請參考這個commit。

結論

Ruby on Rails能讓開發者較輕松的開發出安全的應用程序,然而,若開發者不注意,還是有可能寫出嚴重的漏洞。本文的動態樣板路徑就是這樣一個例子,它不只是OWASP所描述的可以存取任意模版而已,它可以遍歷檔案,甚至因為rails預設的template handler是ERB,造成遠程代碼執行讓攻擊者取得服務器操作權。

這個例子又再次驗證,框架可以幫助大家快速開發,增加安全度。但唯有良好的安全意識,才是應用程序安全的基石。

責任編輯:趙寧寧 來源: Hackdig
相關推薦

2020-09-25 07:00:00

基礎架構代碼模板

2011-05-31 11:05:16

ListView 數據

2020-10-28 21:00:38

RailsMVC命令

2024-05-24 08:00:00

2010-09-25 14:39:29

Bruce Tate

2011-09-15 09:19:30

2009-08-27 10:21:22

Ruby on Rai

2020-12-07 19:00:29

Rails

2009-09-29 17:04:29

2009-08-06 09:13:36

Ruby on Rai

2012-05-16 09:29:25

JavaRailsJVM

2009-10-09 09:37:46

2009-06-17 10:08:32

Ruby on Rai安裝Ruby

2010-06-19 14:44:08

2010-08-09 09:53:14

RailsRake

2009-07-20 09:12:54

Ruby on Rai

2009-12-14 15:30:43

安裝Ruby on R

2009-12-17 15:56:34

Rails參數bind

2009-12-17 16:16:24

Rails方法send

2015-10-14 17:27:18

性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.成人在线视频 | 一区在线观看 | 中文精品视频 | 精品在线免费观看视频 | 一区二区三区四区在线 | 日韩欧美在线视频 | 99re6热在线精品视频播放 | 国产精品高清一区二区三区 | 欧美日韩激情 | 中文字幕在线一区二区三区 | 国产精品一区一区 | 岛国毛片 | 中文字幕一区在线观看视频 | www.蜜桃av | 久久精品国产精品青草 | 爱爱免费视频网站 | 午夜视频在线 | 亚洲日本中文字幕在线 | 欧美激情久久久 | 中文字幕日韩欧美一区二区三区 | 懂色一区二区三区免费观看 | 国产一区三区在线 | 久久久久网站 | 国产成人免费视频 | av综合站 | 亚洲国产成人精品久久久国产成人一区 | 国产精品一区二区在线播放 | 不卡av电影在线播放 | 中文字幕人成人 | 国产精品视频网站 | 国产欧美日韩在线观看 | 超碰人人爱 | 中文字幕免费观看 | 午夜小视频在线播放 | 一区二区三区日韩精品 | 欧美成人精品激情在线观看 | 国产成人精品久久二区二区91 | 91精品中文字幕一区二区三区 | 午夜视频一区二区 | 久久亚洲一区二区 | 视频在线观看亚洲 |