R&D
CVE-2020-26934 - phpMyAdmin Reflected Cross-site scripting
고기완
Sep 2, 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
박지원
Homomorphism in RSA
Homomorphism in RSA
오세준
How to root your RouterOS v7 Virtual Machine
How to root your RouterOS v7 Virtual Machine