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ę.

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
.

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.

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.

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
.
