Ruby On Rails
Outil
Brakeman
Brakeman est un scanner de vulnérabilité pour application Ruby On Rails.
Utilisation:
$ brakeman /path/to/rubyapp
ressource: https://github.com/presidentbeef/brakeman
Structure d'un projet RoR
Points d'interet
Routing
Permet de mapper des routes avec ses gestionnaires pour comprendre la structure API de l'application. Le routeur détermine quel type de contrôleur et d'action doit réellement exécuter le code. Le routage des applications est décrit dans le fichier /config/routes.rb
.
ressources:
Controllers
Views
Les vues sont stockées dans le chemin de modèle suivant:
app/views/[controller]/[view_name].html.erb
Une vue est une simple page HTML gérée par le moteur de modèle ERB, qui affiche les valeurs renvoyées par le contrôleur.
ressource: https://guides.rubyonrails.org/layouts_and_rendering.html
Models
Un modèle est une classe Ruby utilisée pour représenter des données. De plus, les modèles peuvent interagir avec la base de données de l'application via une fonctionnalité de Rails appelée Active Record.
Mauvaises pratiques
SSL forcé désactivé
Crypto
Cookies
La bonne pratique est:
Rails.application.config.action_dispatch.signed_cookie_digest = "SHA256"
Env
Les environnements doivent utiliser une clé aléatoire présente dans config/credentials.yml.enc
et la clé doit être chiffrée.
Mass assignement
Whitelist_attributes doit être sur false:
config.active_record.whitelist_attributes=false
Tout paramètre peut être utilisé lors d’un appel de mass assignment lorsque .permit!
est utilisé.
Exemple:
Permet ceci,
XSS
Si ActiveSupport::escape_html_entities_in_json = false
:
to_json() = potentielle XSS
RoR échape le code html par défaut mais certaines méthode dépréciées permettent d'outrepasser cette protection:
raw
html_save
content_tag
Exemples
html = "<div>#{name}</div>".html_safe
content_tag :p, "Hello, #{name}”
raw @user.name
Contourner le moteur de template:
ERB.new("<div>#{@user.name}</div>").result
render inline: "<div>#{@user.name}</div>”
render text: "<div>#{@user.name}</div>”
Variables explicitements unescaped:
<%= name.html_safe %>
<%= content_tag :p, "Hello, #{name}" %>
<%= raw @user.name =>
<%== @user.name %>
Template placé à un endroit dangereux:
<div class=<%= classes %></div>
<a href="<%= link %>"></a>
<%= link_to "Here", @link %>
<script>var name = <%= name %>;</script>
OS injection
SQLi
La concaténation de l'entrée utilisateur avec le paramètre de requête SQL peut entraîner une injection SQL.
Exemple:
SSTI
ERB.new("<div>#{@user.name}</div>").result
Insecure deserialization
Vérifier que Marshal.load
n'est pas utilisé pour déserialiser des données apportées par les utilisateurs.
Dernière mise à jour