Sporo programistów #python wie, aby nie używać pickle na danych od użytkownika ponieważ podczas ich deserializacji może dojść do ataku object injection i wykonania złośliwego kodu. Ale co z innymi formatami? Czy również są niebezpieczne? W kolejny odcinku #od0dopentestera o plikach yaml.
import yaml with open("test.yaml", "r") as s: y = yaml.load(s) print y['imie'] Format yaml nie jest tak prosty jak mogło by się wydawać. W standardowym użyciu sam rozpoznaje on typ danych który jest do niego przekazywany. Czasami jednak chcielibyśmy mieć kontrolę nad typem przechowywanym w konfiguracji. Stąd też tagi - czyli polecenia rozpoczynające się od wykrzyknika, dzięki którym możemy wybrać typ samodzielnie. Tak jak tutaj - gdzie 0.7 będzie traktowana jako string a nie jako float.
moj_string: !!str 0.7 Niektóre parsery implementują specyficzne dla danego języka tagi - i tak w przypadku pythona możemy zdefiniować tuple:
moja_tupla: !!python/tuple [1, 2] Gdzie zatem znajduje się dzisiejszy błąd?
W parserze używanym w pythonie możemy również skorzystać z tagu apply, który pozwala na wywołanie dowolnej funkcji z dowolnego modułu. Jest to więc równoznaczne z możliwością wykonania dowolnego kodu na atakowanym serwerze. W naszym przypadku użyjemy funkcji system do wyświetlenia zawartości bieżącego katalogu:
imie: !!python/object/apply:os.system ["dir"] Jak się ochronić przed tym błędem?
#mandat #policja #bagiety ja #!$%@?, dostałem mandat 2500 zł za jazdę na rowerze po alkoholu. 500 m do domu, 3 kieliszki wina 0,6%…. Nie da się tego odrobić w kamieniołomach lub coś z tym innego zrobić? Można odroczyć lub raty?
pickle
na danych od użytkownika ponieważ podczas ich deserializacji może dojść do atakuobject injection
i wykonania złośliwego kodu.Ale co z innymi formatami? Czy również są niebezpieczne?
W kolejny odcinku #od0dopentestera o plikach
yaml
.import yaml
with open("test.yaml", "r") as s:
y = yaml.load(s)
print y['imie']
Format
yaml
nie jest tak prosty jak mogło by się wydawać.W standardowym użyciu sam rozpoznaje on typ danych który jest do niego przekazywany.
Czasami jednak chcielibyśmy mieć kontrolę nad typem przechowywanym w konfiguracji.
Stąd też tagi - czyli polecenia rozpoczynające się od wykrzyknika, dzięki którym możemy wybrać typ samodzielnie.
Tak jak tutaj - gdzie
0.7
będzie traktowana jako string a nie jako float.moj_string: !!str 0.7
Niektóre parsery implementują specyficzne dla danego języka tagi - i tak w przypadku pythona możemy zdefiniować tuple:
moja_tupla: !!python/tuple [1, 2]
Gdzie zatem znajduje się dzisiejszy błąd?
W parserze używanym w pythonie możemy również skorzystać z tagu
apply
, który pozwala na wywołanie dowolnej funkcji z dowolnego modułu.Jest to więc równoznaczne z możliwością wykonania dowolnego kodu na atakowanym serwerze.
W naszym przypadku użyjemy funkcji
system
do wyświetlenia zawartości bieżącego katalogu:imie: !!python/object/apply:os.system ["dir"]
Jak się ochronić przed tym błędem?
Zamienić funkcję
load
nasafe_load
.#naukaprogramowania #programowanie #informatyka #it #nauka #technologia #ciekawostki #gruparatowaniapoziomu