21-09-2018 / Od 0 do pentestera

Dlaczego nie używać funkcji input w Pythonie 2?

W dzisiejszym odcinku zaczniemy od języka Python.

Co złego może być w 2 linijkach:

imie = input("Twoje imie:")
print ("Witaj ", imie)

Całość jest niezwykle prosta - najpierw proszę o imię użytkownika, a następnie wyświetlam je w konsoli z dopiskiem Witaj.

Zobaczmy jak wygląda to w praktyce.

Podaję zatem swoje imię.

Moje imie

Na razie wszystko wygląda w porządku.

Podczas pentestu staramy się podawać treść, której nie spodziewał się programista podczas tworzenia danego kawałka kodu.

Tutaj programista prosi nas o imię - czyli ciąg znaków. Spróbujmy zatem podać jakąś liczbę i zobaczyć co się stanie.

Ja wpiszę 2+4.

Liczba

Jak widzisz dostałem wynik dodawania, a nie ciąg znaków.

Dlaczego tak się stało?

Jeśli czegoś nie rozumiemy warto zajrzeć do dokumentacji1.

Eval

Jak widzimy, została ona zapisana jako ekwiwalent dwóch funkcji: eval() oraz raw_input().

Co to takiego eval? Jest to funkcja, która wykonuje kod podany przez użytkownika jako parametr.

Możemy więc to potraktować jako ekwiwalent konsoli, tylko w formie funkcji.

I oto caly dzisiejszy błąd - input bowiem to inna nazwa funkcji eval, która pozwala na wykonanie dowolnego kodu przez użytkownika.

Spróbujmy zatem wykonać coś bardziej skomplikowanego niż tylko dodawanie.

Postaramy się wyświetlić listę wszystkich plików w danym katalogu.

Skorzystamy w tym celu z funkcji system z modułu os.

Standardowo użylibyśmy słowa kluczowego import aby załadować moduł, a następnie funkcji system aby wykonać funkcję na której nam zależy.

Tutaj nie możemy tego jednak zrobić, ponieważ całość musi zmieścić się w 1 linijce.

Skorzystamy zatem z alternatywnej składni, która wygląda następująco:

__import__('os').system('dir')

Jak widzisz udało się nam wyświetlić zawartość bieżącego katalogu.

Zawartość katalogu

Jak zatem naprawić ten błąd?

Wystarczy użyć funkcji raw_input(), która zawsze zwraca tekst i nie używa już funkcji eval.

imie = raw_input("Twoje imie:")
print ("Witaj ", imie)

Co ciekawe, ten błąd istnieje jedynie w Pythonie w wersji 2. Jeśli korzystasz z wersji 3 - jesteś bezpieczny.

Tam standardowo funkcja input zachowuje się jak funkcja raw_input.

Funkcja raw_input