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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
phpmyadmin-vqb-xss — phpMyAdmin 5.2.3 - 높음 - 원격 - XSS - Designer Visual Query Builder | Kitploit
도구/GitHubGitHub/abraxas/phpmyadmin-vqb-xss
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingLabs & Practice
GitHubabraxas/phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

phpMyAdmin 5.2.3 - 높음 - 원격 - XSS - Designer Visual Query Builder

저장소 보기
3일 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Abraxas Labs - phpmyadmin-vqb-xss

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  phpmyadmin-vqb-xss

phpmyadmin-vqb-xss

분류: 저장형 XSS 도달 범위: 원격

phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin

js/src/designer/history.js는 innerHTML로 시각적 쿼리 기록을 구성한다. 컬럼 이름은 $('<div/>').text(...).html()을 거친다. 테이블 이름은 그렇지 않다. TableName은 여전히 <와 >를 허용한다. 공유 데이터베이스에 CREATE TABLE 권한이 있는 저권한 계정이 HTML 식별자를 심는다. 더 높은 권한의 사용자가 Designer를 열면 getTableName()이 페이지에 남아 있고 DesignerHistory.display()가 이를 #ab에 기록한다.

phpMyAdmin 오리진의 저장형 XSS. PMASA-2025-1과 같은 클래스, 다른 기능. Check-tables 제목은 이스케이프되었다. 이 경로는 그렇지 않았다.

ID아직 CVE 없음
분류저장형 XSS
도달 범위원격 (인증된 CREATE TABLE; 피해자가 Designer를 엶)
CWECWE-79
CVSS높음: 8.0 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
제품phpMyAdmin
영향받는 버전5.2.3 태그 RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
인증인증됨. 공격자는 피해자가 Designer에서 여는 데이터베이스에 대한 CREATE TABLE 권한이 필요함
라이선스GNU Affero GPL v3.0
랩127.0.0.1 전용

공격자가 할 수 있는 일

HTML 테이블 이름을 심은 다음, 더 높은 권한의 사용자가 해당 데이터베이스에서 Designer를 열고 시각적 쿼리 기록을 렌더링할 때까지 기다린다.

권한메서드 / 싱크정찰 / 무결성 / 가용성랩 입증 또는 추론
phpMyAdmin 오리진에 마크업 주입DesignerHistory.display()가 getTab()을 #ab innerHTML에 연결피해자 오리진의 무결성랩 입증. phpmyadmin:5.2.3의 라이브 history.js. <h3>에 <i id="pma-vqb"> 포함
designer table_name 속성 탈출database_tables.twig small_tab_pref_1이 designerTable.getTableName() 사용Designer DOM에서 원시 MySQL 이름 정찰랩 입증, 원시 식별자로 읽힘
피해자 세션 쿠키와 CSRF token 읽기기록이 렌더링되면 동일 오리진 스크립트피해자 PMA 세션 정찰PMA 오리진의 저장형 XSS에서 추론. 이 랩은 스크립트가 아닌 <i> 마커 사용
피해자 MySQL 계정으로 SQL 실행, 사용자 관리, 내보내기토큰 기반 POST /sql, /server/privileges, export해당 MySQL 계정이 접근할 수 있는 모든 것의 무결성추론. PMASA-2025-1과 같은 영향 클래스
2FA / userconfig 변경피해자로서 POST /config/set피해자 환경설정 저장소의 무결성추론. 인접 잔여 항목, 이 랩은 아님

이 잔여 항목에서 제외된 것: 인증되지 않은 접근, OS RCE, VQB OK 버튼 경로. .small_tab_pref_click_opt는 table_name을 미리 이스케이프하고 Twig가 다시 자동 이스케이프하므로, 해당 클릭은 현재 엔티티를 getTab()에 공급한다. 그것은 history.js의 수정이 아니다. 컬럼 셀은 텍스트 이스케이프 상태로 유지된다(c<b id=pma-col>y, <b id="pma-col"> 노드 없음).

동일 핀: WebAuthn CustomServer 잔여 항목.

발견 방법

phpMyAdmin RELEASE_5_2_3을 고정했다. PMASA-2025-1/2/3은 이미 5.2.2에 있다. Designer는 여전히 VQB 기록 HTML을 수작업으로 구성한다.

js/src/designer/history.js (js/dist/designer/history.js로 배포됨):

temp = historyArray[i].getTab();
str += '<h3 class="tiger"><a href="#">' + temp + '</a></h3>';
// ...
'<td width="175" style="padding-left: 5px">' + $('<div/>').text(historyArray[i].getColumnName()).html() + '<td>';

libraries/classes/Dbal/TableName.php는 비어 있지 않음, 최대 64자, 후행 공백 없음만 검사한다. <와 >는 합법이다. MySQL은 따옴표로 묶인 식별자에서 이를 허용한다.

templates/database/designer/database_tables.twig는 designerTable.getTableName()을 .small_tab_pref_1의 table_name에 복사한다. VQB 옵션 셀은 같은 이름의 미리 이스케이프된 복사본을 사용한다.

이미 기록된 잘못된 방향: 이중 이스케이프된 옵션 버튼 속성을 수정으로 간주(그렇지 않음 - small_tab_pref_1은 여전히 원시 이름을 노출하고 history.js가 싱크임); 컬럼 헬퍼가 테이블 이름을 커버한다고 간주; 인증되지 않은 XSS 주장; 리버스 셸. 연극.

랩

python3 phpmyadmin-vqb-xss-Abraxas-Labs.py
# or: cd lab && ./run.sh

대상은 오직 http://127.0.0.1:19250. 이미지 phpmyadmin:5.2.3 및 mysql:8.0. Compose 프로젝트 phpmyadmin-vqb-xss. poc 서비스의 Playwright Chromium. 실행 후 스택은 해체된다.

두 사용자, 공유 shareddb. 저권한 creator가 CREATE TABLE \tx` (`cy` INT)를 실행한다. 고권한 victim이 phpMyAdmin에 로그인하고 query=1로 Designer를 연다. 라이브 history.js는 컨테이너의 복사본이다(h3-unescaped=yes, 컬럼 헬퍼 존재). Chromium이 페이지의 getTableName()에서 가져온 테이블 이름으로 DesignerHistory.display()`를 호출한다.

결과: #ab h3.tiger innerHTML은 <a href="#">t<i id="pma-vqb">x</i></a>. 컬럼 td 텍스트는 c<b id=pma-col>y이며 b#pma-col 노드는 없다.

SUCCESS phpmyadmin-vqb-xss h3-markup=yes col-escaped=yes how=live PMA-VQB-XSS-WITNESS

수정

<h3>에 연결하기 전에 getTab()을 $('<div/>').text(temp).html() 또는 Functions.escapeHtml로 이스케이프하라. 하나의 속성에 대한 Twig 이중 인코딩에 의존하지 마라. 컬럼 이름 헬퍼를 모델로 유지하라.

참고

  • github.com/phpmyadmin/phpmyadmin 태그 RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76)
  • js/src/designer/history.js
  • libraries/classes/Dbal/TableName.php
  • 인접 패치됨(이 경로 아님): PMASA-2025-1 Check-tables 제목
  • 동일 핀: PMA-5.2.3-WebAuthn-2FA
  • CWE-79

라이선스

GNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.

도구 다운로드