42
Ruby on Rails Building and Breaking Rails App http://www.3SLabs.com

Ruby on Rails Penetration Testing

  • Upload
    3s-labs

  • View
    1.254

  • Download
    1

Embed Size (px)

DESCRIPTION

Slides from our presentation on Ruby on Rails Penetration Testing

Citation preview

Page 1: Ruby on Rails Penetration Testing

Ruby on Rails

Building and Breaking Rails App

http://www.3SLabs.com

Page 2: Ruby on Rails Penetration Testing

• Released to the world as ‘extracted’ from BaseCamp (37Signals) by @dhh during July 2004.

• Merged with Merb Project during December 2008 and Rails 3.0 was released.

• Two supported branch of development currently:– Rails 3.x– Rails 4.x

Page 3: Ruby on Rails Penetration Testing

Acceptance of RoR

.. and LOT more

Page 4: Ruby on Rails Penetration Testing

Building Web Applications using Ruby on Rails

Page 5: Ruby on Rails Penetration Testing

RoR Application Structure

Image Source: http://blog.ifuturz.com/ruby-on-rails/ruby-on-rails-mvc-learn-with-fun.html

Page 6: Ruby on Rails Penetration Testing

Building a RoR App

1. Ruby & Ruby Gem Installation2. Generate RoR Project3. Design ERD4. Generate Scaffolds5. Define Relationships6. Create Database Schema7. Start Application Server

Page 7: Ruby on Rails Penetration Testing

RoR: Web Blog Example

Our Blog is a web application where one or more Users can self-register and sign-in using their registered credentials.

Upon sign-in each User should be able to publish Blog Post that is visible to any user or visitor of the portal.

Any User or Visitor of the portal should optionally Comment on any Blog Post.

Page 8: Ruby on Rails Penetration Testing

RoR: Web Blog ERD

Page 9: Ruby on Rails Penetration Testing

Step1: Generate Project

Page 10: Ruby on Rails Penetration Testing

Step2: Generate Scaffolds

Page 11: Ruby on Rails Penetration Testing

Step3: Setup Database Schema

Page 12: Ruby on Rails Penetration Testing

Step4: Launch App Server

Page 13: Ruby on Rails Penetration Testing

http://m.xkcd.org/844/

Now write some code or customize the views..

Page 14: Ruby on Rails Penetration Testing

After some love of Bootstrap3

Page 15: Ruby on Rails Penetration Testing

Learning Ruby on Rails

• Ruby on Rails Official Guide– http://guides.rubyonrails.org/

• Agile Web Development with Rails– http://pragprog.com/book/rails4/agile-web-development-with-rails

• Ruby on Rails Podcasts– http://podcast.rubyonrails.org/

• Rails Code School– https://www.codeschool.com/courses/rails-for-zombies-redux

• Rails Cast– http://railscasts.com/

Page 16: Ruby on Rails Penetration Testing

Breaking Ruby on Rails Applications

Image (Karate) by Nicholas Riggle from The Noun Project CC By 2.0

Page 17: Ruby on Rails Penetration Testing

Penetration Testing Rails App

• Black/Gray Box Approach– Conventional Testing– Fingerprinting Rails Framework– Rails specific Vulnerability Testing– Rails specific Weakness Testing

• White Box Approach– Automated Scan for known Vulnerabilities

• Brakeman– Attack Surface enumeration through Routes– Authentication & Authorization Testing– Common Rails information disclosures (secret_token.rb)– Model Attributes Security– Custom/Unconventional SQL Queries Audit– Responsive View Audit

Page 18: Ruby on Rails Penetration Testing

Fingerprinting Rails Applications

• No generic and definitive technique!– It’s a cat & mouse game really.

• Heuristics– Session Identifier– Asset Pipeline– [ … ]

Page 19: Ruby on Rails Penetration Testing

Fingerprinting Rails Application

Not so easy for an application served with a reverse proxy which is almost always the case in production.

Page 20: Ruby on Rails Penetration Testing

Fingerprinting Rails Application

Leveraging the assets pipeline which is enabled by default from Rails 3.1

Page 21: Ruby on Rails Penetration Testing

Automated Testing: Brakeman

http://brakemanscanner.org/

Need source code access !

Page 22: Ruby on Rails Penetration Testing

Automated Testing: grep(1)

eval

instance_eval class_eval

DRb.start_server

find_by_sql

system exec

popen

You will be surprised to see how effective this is !

/`(.*)`/

Page 23: Ruby on Rails Penetration Testing

Attack Surface: Routes

Page 24: Ruby on Rails Penetration Testing

Attack Surface: Routes

• Default Routing– <Resource> is handled by app/controllers/<resources>_controller.rb– CRUD on Resource

Page 25: Ruby on Rails Penetration Testing

Session Security

• A whole set of attacks are possible on Session Management functionality of any Web Application.– Session Hijack, Session Fixation, Session Id Prediction, Session Data

Tampering, Leveraging Session Data for RCE etc.

• Rails provide inbuilt Session Management– The session object is available to application developer as

a Hash/Map to store arbitrary data.– The session object is serialized and stored in

corresponding session storage as per configuration.– Signed cookie is used for session storage by default.

Page 26: Ruby on Rails Penetration Testing

Session Security

http://robertheaton.com/2013/07/22/how-to-hack-a-rails-app-using-its-secret-token/

Not a Good idea !

Page 27: Ruby on Rails Penetration Testing

Session Security: Best Practices

Enforce SSL in order to avoid sniffing of session id

Re-generate session after authentication to avoid session fixation

Store session in database instead of Cookie which is default

Cookie based Session Store are susceptible to Replay Attacks

Page 28: Ruby on Rails Penetration Testing

Authentication

• Multiple Popular Authentication Plugin– Devise– RESTful Authentication– […]

• Devise– Auto-generated Registration, Confirmation, Login,

Forgot Password etc.– Controller filter for enforcing authentication.

Page 29: Ruby on Rails Penetration Testing

Testing Authentication

• Generic Issues– Weak Session Management– Weak Authentication Enforcement– Weak Password Encryption

• Plugin/Gem Specific– Devise Vulnerabilities– Lack of Authentication Enforcement– Timing Attacks– Information Gathering through default message

Are all controllers protected by Authentication System?

Page 30: Ruby on Rails Penetration Testing

Authorization

• Not provided by default in the framework.– Encourages RESTful design.• Easy to implement RBAC on Resources

– Multiple Gem/Plugin available

Example usage of CanCan for Authorizationhttps://github.com/ryanb/cancan

Page 31: Ruby on Rails Penetration Testing

Testing Authorization

• Authorization Plugin or Custom Coded?• Every functionality is RESTful?• Query scoping in Controller

Page 32: Ruby on Rails Penetration Testing

Rails CSRF Protection

CSRF Token generation and checking is enforced by default.

• Application must use Rails Form Tag Helps to generate forms rather than HTML directly.

• HTTP GET is not protected !

Page 33: Ruby on Rails Penetration Testing

Killing Rails CSRF Protection

http://blog.codeclimate.com/blog/2013/03/27/rails-insecure-defaults/

Page 34: Ruby on Rails Penetration Testing

Rails Model Security

• The Business Logic Layer– Database Abstraction through ORM– Entity Relationship Definition– Business Logic

• Common Security Issues– Attribute Mass Assignment

• Mitigated by default in newer version of Rails

– Custom (insecure) SQL Queries– Business Logic Vulnerabilities

Page 35: Ruby on Rails Penetration Testing

Rails Model: Attribute Mass Assignment

The Model

The Controller

The Malicious Input

Page 36: Ruby on Rails Penetration Testing

Rails Model: SQL Queries

Model Scope

Chained Query Interface (ActiveRelation)

Parameterized Qury

Page 37: Ruby on Rails Penetration Testing

Rails Model: Insecure SQL Queries

The application developer should ensure that the Query Interface understand the difference between Query and Data.

Page 38: Ruby on Rails Penetration Testing

Rails Model: SQL Injection Vectors

• ActiveRecord does not escape parameters for certain options:

Source: http://rails-sqli.org/

Page 39: Ruby on Rails Penetration Testing

View Rendering

• Dynamic parameters are encoded by default unless explicitly marked as safe.

• There are scope for Reflected XSS– Strings marked explicitly with html_safe method.– Textile/Markdown Injection– Insecure used of content_tag

Page 40: Ruby on Rails Penetration Testing

Secure Headers

• Rails 3.x is vulnerable to Clickjacking & UI Redressing Type of attacks in default configuration.– Easy Mitigation• gem ‘secureheaders’ in Gemfile

– https://github.com/twitter/secureheaders

Page 41: Ruby on Rails Penetration Testing

Rails: Framework Vulnerabilities

http://www.cvedetails.com/vulnerability-list/vendor_id-12043/product_id-22568/Rubyonrails-Ruby-On-Rails.html

Page 42: Ruby on Rails Penetration Testing

References

• Ruby on Rails Security Guide– http://guides.rubyonrails.org/security.html

• Brakeman Scanner– http://brakemanscanner.org/

• Rails SQLi Examples– http://rails-sqli.org/

• OWASP Cheatsheet for RoR– https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet

• Ruby Security Configuration– http://blog.codeclimate.com/blog/2013/03/27/rails-insecure-defaults/

• Ruby Mechanize– http://mechanize.rubyforge.org/

• Ruby Nokogiri– http://nokogiri.org/

• The Noun Project– http://thenounproject.com/