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.
spaghetti codewarstwa 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
imiea następnie wyświetlamy go używając funkcjifrom_string.Dlaczego nie należy tak robić?
Z dokumentacji funkcji
from_stringmożemy wyczytać, że parametrsource, który ona przyjmuje to treść szablonu, który jest następnie procesowany i zwracany jako obiektTemplate.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