Wpis z mikrobloga

W czasach spaghetti code warstwa aplikacji przeplatała się z warstwą widoku czyniąc kod trudnym do utrzymania.
Obecnie używamy zaawansowanych silników szablonów np. Jinja2.
Można powiedzieć, że silniki te same w sobie są swego rodzaju językami programowania.
Umożliwiają bowiem dostęp do wielu potencjalnie niebezpiecznych czynności.
Dzisiaj w #od0dopentestera o SSTI czyli Server-Side Template Injection.

imie = request.values.get('imie')
return Jinja2.from_string('Hej ' + imie).render()

Pobieramy tutaj parametr imie a następnie wyświetlamy go używając funkcji from_string.
Dlaczego nie należy tak robić?

Z dokumentacji funkcji from_string możemy wyczytać, że parametr source, który ona przyjmuje to treść szablonu, który jest następnie procesowany i zwracany jako obiekt Template.
Jeśli zatem jest to treść szablonu - ciąg tych znaków może zawierać dowolne funkcję, które ten silnik szablonów obsługuje.
A ponieważ ciąg ten jest kontrolowany przez użytkownika - przy pomocy parametru imie - może on wykonać dowolny kod, na jaki pozwala silnik szablonów.

Aby to potwierdzić wystarczy wysłać:

?imie={{7*'7'}}
Lub też odczytać dowolny plik z systemu:

{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
Podsumowując: użytkownik nie powinien podawać treści szablonu - chyba, że postaramy się o dodatkową weryfikację.
Może jednak podawać parametry, które zostaną przez szablon wyświetlone.

Więcej informacji: tutaj oraz tutaj.
Nagroda za podobny błąd od Uber.

#python #hacking #webdev #programowanie #informatyka #it #nauka #programista15k
KacperSzurek - W czasach spaghetti code warstwa aplikacji przeplatała się z warstwą w...
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach