Skip to content

Instantly share code, notes, and snippets.

@mmkhitaryan
Last active February 11, 2024 12:23
Show Gist options
  • Save mmkhitaryan/4383b2e13dbf6a95a3764ba2fe618c3c to your computer and use it in GitHub Desktop.
Save mmkhitaryan/4383b2e13dbf6a95a3764ba2fe618c3c to your computer and use it in GitHub Desktop.

File upload leads to Stored XSS

Вдохновение было взято с https://hackerone.com/reports/880099. Из-за того что вы не фильтруете svg картинки то можно загрузить ее на сервер, и получить stored xss. http://51.75.168.24/image.php?id=4742

Чтобы исправить это:

Проблема в том что сервер выставляет заголовок Content-Type в зависимости от загруженного файла. Если настроить nginx на раздачу хедеров только с image/png например то браузер будет выдавать MIME type mismatch on image file.

SSRF -> JWT secret key

config.php требует запроса с localhost. Можно было бы просто подменить host на localhost:

curl http://51.75.168.24/config.php -H "Host: 127.0.0.1"
Only localhost allowed!⏎

Но видимо есть еще проверка по айпи какая-то. Через CVE SSRF я смог послать запрос и получить секретный ключ для JWT. Тк elasticsearch работает по http, то нужно создать сервер который будет просто делать http редирект куда нужно. Так получится SSRF.

{ "jwt_key":"SUPERSECRET" }

Дальше мне кажется можно попробовать играть уже с JWT ключами тк это открывает еще много векторов атаки. UPD: https://jwt.io/#debugger-io?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwibG9naW4iOiJhZG1pbiIsIm1haWwiOiJtYXJhdEBta2hpdGFyeWFuLnB3Iiwicm9sZSI6ImFkbWluIiwiaXAiOiI5Mi40Ni4xMDQuMjI2In0.3pki0H88UJKICkq9ptuc95DZ1pq-XYv6Qf2i4EjIYTM Создал JWT с ролью админ, айди юзера 1. Вижу чужое фото http://51.75.168.24/uploads/69193b56e86b7843a5a772396cca7c9b.jpg

http://51.75.168.24/adminer.php
http://51.75.168.24/config.php
https://github.com/advisories/GHSA-x5r2-hj5c-8jx6

Чтобы исправить это:

  • Вы используете слишком легкий секретный ключ для HMAC. Используйте что-то более сложное, что неполучится взломать брут форсом.

  • Закройте доступ к adminer. Сделайте чтобы он был доступен только через vpn, или просто http авторизацию. Либо обновитесь до версии где исправили этот баг с SSRF.

IDOR

Вы используете MD5 хеш имени файла как имя файла для хранения картинки на сервере. Например 4c96122aa55b8b33bfe299115cb97892 это 6qxzgx. Тк MD5 можно практически полностью перебрать, то я могу просто загрузить файл с этим именем и перезаписать чужую картинку. Так я и сделал. На главной странице теперь моя картинка.

Чтобы исправить это:

  • Используйте для каждой картинки случайное имя файла. Например UUID4.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment