Один Python-файл взламывает PHP-сервер через утечку памяти и вызов system
Steal My Bitcoin CTF PoC
KillaBoi опубликовал PoC для CTF Steal My Bitcoin: скрипт на чистом Python 3.11+ воспроизводит цепочку из максимум 20 HTTP-запросов. Сначала multipart-загрузка доводит PHP 8.4.26 до исчерпания 128 МиБ памяти, оставляя устаревшее состояние в воркере. Затем через cookies PHPSESSID утекают адреса кучи и кода, а финальный POST с поддельной HashTable заставляет сборщик мусора вызвать zif_system и выполнить команду. Срабатывает только на Alpine-сборке с точно совпадающим отпечатком.
Честно, пожалуйста, приберитесь в нём или сделайте свою версию получше, которую не сомнёт Sol.
- NorwegianDude
Справедливости ради, человек, создавший этот челлендж, заявил, что это была довольно стандартная конфигурация, воспроизводящая что-то за пределами лаборатории, но в реальности это было нечто совершенно иное и совсем не похожее на то, как обычно используется PHP.
Там использовался сервер разработки в PHP, и запросы даже не обрабатывались через fpm или mod_php. Вместо этого использовался встроенный dev-сервер PHP, и запросы просто проксировались из nginx на php dev-сервер.
Буквально первое, что написано в документации PHP про используемый здесь dev-сервер, — это:
"Warning
This web server is designed to aid application development. It may also be useful for testing purposes or for application demonstrations that are run in controlled environments. It is not intended to be a full-featured web server. It should not be used on a public network."
Люди так не делают, и это также объясняет, почему сайт постоянно падал, потому что dev-сервер супер медленный, он вообще никоим образом не предназначен для такого. Реальная конфигурация добавила бы несколько нулей к количеству запросов в секунду, которое сервер мог бы обрабатывать.
Так что в целом это было очень бессмысленно, поскольку это совсем не похоже на реальные сайты на PHP. Жаль, потому что реалистичная конфигурация была бы интереснее и релевантнее для ответа на вопрос, насколько на самом деле сложно получить RCE на обычном сайте.
- gnabgib
Это уже ссылается автор в треде Steal My Bitcoin (585 баллов, 458 комментариев) https://news.ycombinator.com/item?id=50224916
- bushwart
По теме: https://x.com/JamesPavur/status/2114501212313653696
Судя по всему, ключ от кошелька не был на сервере, как некоторые подозревали в исходном треде, но, возможно, в конце концов не из-за злого умысла.