R&D
CVE-2020-26934 - phpMyAdmin Reflected Cross-site scripting
고기완
Sep 1, 2021

개요

phpMyAdmin은 MySQL/MariaDB 데이터베이스를 관리하기 위한 웹 인터페이스 서비스다. PHP 언어로 구현되어 있으며 웹서버에 설치하여 사용한다. 사용자는 웹 브라우저를 통해 phpMyAdmin 웹페이지에 로그인한 후, 데이터베이스 열람 및 수정이 가능하다.

변환(Transformation) 기능

데이터베이스의 값을 표시 또는 삽입할 때 데이터의 변환 방식을 지정하는 기능이다. 변환 기능을 이용하는 예시는 다음과 같다.

  • 테이블 구조 변경 기능에서 아래 이미지와 같이 Media type, Browser display transformation 등을 지정한다.

  • 변환 기능이 적용된 테이블의 데이터를 표시할 때, 변환된 데이터를 보기 위해 [BLOB]을 클릭하면 transformation_wrapper.php 페이지로 이동된다.

  • transformation_wrapper.php 페이지는 쿼리 구문을 입력 받아 실행하고, 실행 결과를 변환하여 표시한다.

취약점 설명

transformation_wrapper.php는 CSRF 토큰을 필요로 하지 않는다. CSRF 토큰 검증을 하지 않으므로, 공격자가 GET 요청 방식으로 파라미터 전달이 가능하다. $request_params 변수에 선언된 ‘cn’, ‘ct’, ‘sql_query’, ‘transform_key’, ‘where_clause’를 파라미터로 받아, 해당 변수명으로 사용한다.

where_clause 파라미터는 SELECT 쿼리 구문의 WHERE 절에 삽입해 실행된다. 쿼리 실행 결과를 출력하기 전, Core::downloadHeader 함수를 실행한다. Core::downloadHeader 함수는 /libraries/classes/Core.php에 선언되어 있다. 두 개의 인자를 받아 파일 다운로드와 관련된 HTTP 응답 헤더를 지정한다. 첫 번째 인자는 파일 이름이고, 두 번째 인자는 Content-Type을 지정한다.

공격자가 ct 파라미터를 조작하면, Core::downloadHeader 함수의 두 번째 인자가 조작되어 Content-Type 조작이 가능하다. Core::downloadHeader 함수가 종료되고 쿼리 실행 결과를 출력한다.

Content-Type을 html으로 지정하는 경우, PHP의 htmlspecialchars 함수를 통해 XSS 문자열이 필터링된다. 공격자는 XSS 필터링을 우회하며 웹브라우저 화면에 출력하기 위해 Content-Type을 text/xml 으로 지정한다. Content-Type이 text/xml이므로 쿼리 실행으로 출력 되는 내용을 XML XSS으로 지정하면 XSS 취약점이 발생한다. 출력 되는 내용을 조작하기 위해 where_clause 파라미터에 UNION SELECT 구문을 넣는다.

1 UNION SELECT '<?xml version="1.0"?><html><script xmlns="http://www.w3.org/1999/xhtml">alert(1)</script></html>',2,3,0 ORDER BY 4

위 SQL 구문을 삽입하는 전체 페이로드는 아래와 같다.

~/index.php?target=transformation_wrapper.php&db=information_schema&table=CHARACTER_SETS&where_clause=1%20UNION%20SELECT%20%27%3C?xml%20version=%221.0%22?%3E%3Chtml%3E%3Cscript%20xmlns=%22http://www.w3.org/1999/xhtml%22%3Ealert(1)%3C/script%3E%3C/html%3E%27,2,3,0%20ORDER%20BY%204&cn=&ct=text/xml&transform_key=CHARACTER_SET_NAME

패치 내역

phpMyAdmin에 해당 취약점을 제보하고 CVE-2020-26934으로 패치되었다.

https://www.phpmyadmin.net/security/PMASA-2020-5/

Thanks to Giwan Go, Yelang Lee of STEALIEN for reporting this vulnerability.

공격자가 GET 요청 방식으로 파라미터 전달을 하지 못하도록 where_clause 파라미터의 서명값을 검증한다.

고기완
RECENT POST
Minjoong Kim
Android 1day Exploit Analysis (CVE-2019-2215)
Android 1day Exploit Analysis by Newbie
이주협, 이주영
뉴비들의 하드웨어 해킹 입문기
뉴비들의 하드웨어 해킹 입문기