phpMyAdmin 5.2.3 - 높음 - 원격 - SQLi - Designer JSON 미살균 식별자
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-designer-json-sqli
분석 문서: https://abraxaslabs.tech/research/phpmyadmin-designer-json-sqli
분류: SQLi 도달 범위: 원격
phpMyAdmin 5.2.3 (태그 RELEASE_5_2_3, 커밋 962857e). Designer AJAX save_setting_value는 설정 블롭을 json_encode한 뒤, 컨트롤 사용자 링크에 대한 단일 인용부호 UPDATE/INSERT에 연결합니다. 사용자 이름은 이스케이프됩니다. JSON은 그렇지 않습니다. json_encode는 단일 인용부호를 이스케이프하지 않습니다.
로그인한 사용자가 operation=save_setting_value와 value에 인용부호를 넣어 index.php?route=/database/designer로 POST합니다. 그러면 queryAsControlUser가 해당 문자열을 pma 컨트롤 사용자로 pma__designer_settings에 대해 실행합니다. 해당 계정은 구성 저장소이며, 로그인한 SQL 박스가 아닙니다. phpMyAdmin 6.x는 ControlUser에서 이 블롭을 quoteString으로 감쌉니다. 5.2.3은 여전히 그대로 연결합니다.
이전 designer CVE들(2016-6616, 2019-11768, 2019-18622)은 사용자 이름 / 데이터베이스 이름이었습니다. 이번 잔여 취약점은 JSON settings_data 컬럼입니다.
| ID | 아직 CVE 없음 |
| 분류 | SQLi (pma__designer_settings에 대한 컨트롤 사용자) |
| 도달 범위 | 원격 (인증된 쿠키 로그인; Designer + pma__designer_settings 활성화) |
| CWE | CWE-89 |
| CVSS | 높음: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 제품 | phpMyAdmin |
| 영향받는 버전 | 5.2.3 태그 RELEASE_5_2_3 (962857e) |
| 인증 | 인증된 쿠키 로그인. Designer + pma__designer_settings 활성화. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:19220 전용 |
Designer를 열 수 있는 로그인한 phpMyAdmin 사용자는 pma__designer_settings에 대해 컨트롤 사용자로서 SQL을 주입할 수 있습니다.
| 권한 | 메서드 / 경로 | 랩에서 입증 또는 추론 |
|---|---|---|
| 컨트롤 사용자 UPDATE/INSERT 문자열 깨기 (pmadb SQL 무결성) | POST index.php?route=/database/designer operation=save_setting_value에 value 내 인용부호 포함 | 랩에서 입증. 일반 로그: SET settings_data = '{"snap_line":"PMA-DESIGNER-JSON-SQLI-WITNESS'#" }' 원시. quoteString 부재 |
자신의 settings_data를 잘라 더 이상 JSON이 아니게 만들기 (자신의 행 무결성) | 동일 POST; #가 문의 나머지를 주석 처리 | 랩에서 입증. appuser 블롭에 위트니스가 포함되며 유효한 JSON이 아님. 정상 저장 grid-ok가 사라짐 |
| 스택 쿼리 없이 다른 사용자의 designer 행 덮어쓰기 (피해자 행 무결성) | 동일 #가 WHERE username = '...'를 주석 처리 | 랩에서 입증. 시드 victim {"keep":"safe"}가 잘린 위트니스 블롭이 됨 |
| 컨트롤 사용자로서 추가 문 실행 | 컨트롤 mysqli 링크가 다중 쿼리를 허용하는 경우 동일 싱크 | 추론. 기본 mysqli::query는 단일 문. 여기서는 활성화되지 않음 |
다른 pmadb 테이블(북마크, 히스토리, pma__userconfig)에 도달 | 스택 쿼리 또는 쓰기 방식의 탈출이 가능한 경우에만 | 추론. 이 랩의 컨트롤 사용자는 phpmyadmin.* DML만 보유 |
이 랩에서 차단된 것: 비인증 접근, 로그인한 appuser SQL 박스(appdb 전용; appuser는 phpmyadmin에 대한 GRANT 없음), OS 셸, 스택 쿼리. pmadb / designer 설정이 꺼져 있으면 기능이 무력화됨(이는 FAIL이며, 이번 잔여 취약점이 아님). |
RELEASE_5_2_3에 대한 8개의 병렬 소스 탐색. saveSetting은 json_encode를 '...'에 연결합니다. 사용자 이름은 escapeString입니다. 6.x는 이미 이 블롭을 quoteString합니다. 5.2.3은 그렇지 않습니다.
잘못된 시도: username에 주입(이스케이프됨); #1064을 기대함(#이 나머지를 주석 처리하므로 MySQL은 잘린 UPDATE를 받아들임); 스택 쿼리를 입증된 것으로 간주함(mysqli 기본값은 단일 문장).
python3 phpmyadmin-designer-json-sqli-Abraxas-Labs.py
또는
cd lab
./run.sh
루프백 전용: http://127.0.0.1:19220. 이미지 phpmyadmin:5.2.3 및 mysql:8.0. Compose 프로젝트 phpmyadmin-designer-json-sqli. Witness PMA-DESIGNER-JSON-SQLI-WITNESS.
SUCCESS phpmyadmin-designer-json-sqli version=5.2.3 how=live raw-concat=yes truncated=true sql-error=false quoteString=no PMA-DESIGNER-JSON-SQLI-WITNESS
JSON blob에 대해 quoteString(..., ControlUser) / escapeString을 적용하며, 이는 RecentFavoriteTable::saveToDb() 및 이 컬럼에 대한 phpMyAdmin 6.x와 동일합니다. json_encode 출력을 작은따옴표로 묶인 SQL 리터럴 안에 넣지 마십시오.
962857e)libraries/classes/Database/Designer/Common.php saveSettingControllers/Database/DesignerController.php POST operation=save_setting_valueGET|POST /database/designerGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 실습 환경 전용입니다. 보증하지 않습니다.