XSS w plikach SVG

Mimo ciągłego rozwoju technologii internetowych, dalej jest możliwe znalezienie miejsc, w których przesył plików SVG niesie za sobą spore ryzyko. Zacznijmy jednak od początku.

Czym jest SVG?

SVG jest jednym z wektorowych formatów graficznych, a jego szerokie zastosowania możemy zneleźć zarówno na stronach internetowych, jak i w druku. Ponieważ pliki SVG należą do rodziny XML, oznacza to, że pozwala nam to na użycie w nim języków skryptowych. Docelowo pliki SVG wstawiane na stronę po stronie klienta powinny być przefiltrowane i nie powinny zawierać złośliwego kodu. Istnieją jednak sposoby na obejście zabezpieczeń, które zostały wdrożone w sposób nieprawidłowy. 

Jak to wygląda w praktyce?

Na początku zainfekujmy plik svg niechcianym kodem

<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="w1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 595.3 841.9" style="enable-background:new 0 0 595.3 841.9;" xml:space="preserve">
<style type="text/css">
    .st0{fill:#141414;}
</style>

<script>alert('XSS')</script>

<rect x="353.9" y="421.2" class="st0" width="12.4" height="12.4"/>
<rect x="279.5" y="446" class="st0" width="12.4" height="12.4"/>
<rect x="341.5" y="446" class="st0" width="12.4" height="12.4"/>
<rect x="267.1" y="421.2" class="st0" width="12.4" height="12.4"/>
<polygon class="st0" points="353.9,408.8 353.9,421.2 341.5,421.2 341.5,446 329.1,446 329.1,458.4 304.3,458.4 304.3,446
    291.9,446 291.9,421.2 279.5,421.2 279.5,408.8 291.9,408.8 291.9,396.4 304.3,396.4 304.3,384 329.1,384 329.1,396.4 341.5,396.4
    341.5,408.8 "/>
<rect x="279.5" y="384" class="st0" width="12.4" height="12.4"/>
<rect x="341.5" y="384" class="st0" width="12.4" height="12.4"/>
</svg>

Załóżmy, że na serwerze jest zrobiona walidacja plików. Niemożliwe będzie przesłanie pliku innego niż svg, a w razie próby, naszym oczom wyświetli się powiadomienie o błędzie.

Spróbujmy zmienić nazwę pliku z attack.svg na attack.svg.jpg, a następnie ponownie go przesłać. Nie zmienia to zawartości pliku. W żaden też sposób, plik nie jest “spłaszczany” ani konwertowany.

Po wejściu w bezpośredni link do pliku, naszym oczom powinien ukazać się komunikat.

Jak się zabezpieczyć?

Możliwości blokad jest kilka. Przykładowo, możemy użyć image tagów, które uniemożliwiają wywoływanie skryptu. Innym sposobem jest ustawienie nagłówka jako Content-Security-Policy, który domyślnie zablokuje niechciany kod w plikach svg.  CSP można także włączyć dodając meta tag w sekcji <head>.

Źródła

https://digi.ninja/blog/svg_xss.php
https://medium.com/axdb/stored-cross-site-scripting-attacks-using-crafted-svg-images-1b09c9e727e4

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *