phpMyAdmin 5.2.3 - 높음 - 원격 - SQLi - Designer JSON 미살균 식별자
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-designer-json-sqli
분류: SQLi 도달 범위: 원격
phpMyAdmin 5.2.3 (태그 RELEASE_5_2_3, 커밋 962857e). Designer AJAX save_setting_value는 설정 블롭을 json_encode한 뒤 control-user 링크에 대한 단일 인용부호 UPDATE/INSERT에 연결합니다. 사용자 이름은 이스케이프됩니다. JSON은 그렇지 않습니다. json_encode는 단일 인용부호를 이스케이프하지 않습니다.
로그인한 사용자가 operation=save_setting_value와 value에 인용부호를 포함하여 index.php?route=/database/designer에 POST합니다. 그러면 queryAsControlUser가 해당 문자열을 pma control user로 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에 대한 control-user) |
| 도달 범위 | 원격 (인증된 쿠키 로그인; 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에 대해 control user로 SQL을 주입할 수 있습니다.
| 권한 | 메서드 / 경로 | 랩에서 입증됨 또는 추정됨 |
|---|---|---|
| control-user 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 블롭에 witness가 포함되며 유효한 JSON이 아님. 정상 저장 grid-ok가 사라짐 |
| 스택 쿼리 없이 다른 사용자의 designer 행을 덮어씀 (피해자 행 무결성) | 동일 #가 WHERE username = '...'를 주석 처리 | 랩에서 입증됨. 시드 victim {"keep":"safe"}가 잘린 witness 블롭이 됨 |
| control user로서 추가 구문 | control mysqli 링크가 다중 쿼리를 허용하는 경우 동일 싱크 | 추정됨. 기본 mysqli::query는 단일 구문. 여기서는 활성화되지 않음 |
다른 pmadb 테이블(bookmarks, history, pma__userconfig)에 도달 | 스택 쿼리 또는 쓰기 방식의 탈출이 가능한 경우에만 | 추정됨. 이 랩의 control user는 phpmyadmin.* DML만 가짐 |
이 랩에서 차단됨: 인증되지 않은 접근, 로그인한 appuser SQL 박스(appdb 전용; appuser는 phpmyadmin에 대한 GRANT 없음), OS 셸, 스택 쿼리. pmadb / designer settings가 꺼져 있으면 기능이 무력화됨(이는 FAIL이며, 이 잔여물이 아님).
RELEASE_5_2_3에 대한 8개의 병렬 소스 사냥. saveSetting은 json_encode를 '...'에 연결합니다. 사용자 이름은 escapeString입니다. 6.x는 이미 이 블롭을 quoteString합니다. 5.2.3은 그렇지 않습니다.
잘못된 방향: 사용자 이름에 주입(이스케이프됨); #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 블롭에 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 참조. 루프백 랩 전용. 보증 없음.