
CVE-2020-24913에 대한 PoC로, qcubed(3.1.1을 포함한 모든 버전)의 profile.php에서 strQuery 매개변수를 통해 발생하는 SQL 인젝션 취약점으로, 인증되지 않은 공격자가 조작된 POST 요청을 통해 SQL 코드를 주입하여 데이터베이스에 접근할 수 있게 합니다.
CVE-2020-24913용 PoC입니다. qcubed(3.1.1 포함 모든 버전)의 profile.php에서 strQuery 매개변수를 통해 발생하는 SQL 인젝션 취약점으로, 인증되지 않은 공격자가 조작된 POST 요청을 통해 SQL 코드를 주입하여 데이터베이스에 접근할 수 있습니다. 이 PoC는 MySQL 데이터베이스를 사용하여 수행되었습니다. 우리는 (postgres에서 가능한) 스택 쿼리 페이로드를 사용할 수 없었고, 시간 기반(time-based) 방식으로 이 취약점을 악용해야 했습니다.
"strProfileData" 매개변수에서 다음 페이로드(인코딩되지 않은 상태)를 사용합니다: a:1:{i:0;a:3:{s:12:"objBacktrace";a:1:{s:4:"args";a:1:{i:0;s:3:"pwn";}}s:8:"strQuery";s:38:"(SELECT * FROM (SELECT(SLEEP(10)))CP);";s:11:"dblTimeInfo";s:1:"1";}}
취약한 매개변수는 "strProfileData"입니다. 서버로 전송되는 성공적인 요청은 다음과 같습니다. 이 매개변수로 전송되는 PHP 직렬화 배열은 base64로 인코딩되어야 합니다.
아래 이미지에서는 strProfileData 매개변수를 base64 디코딩하여 독자가 더 명확하게 볼 수 있도록 했지만, 위에서 언급했듯이 base64로 인코딩된 상태로 전송되어야 합니다.
다음 요청에는 서버를 10초 동안 지연시키는 쿼리가 포함되어 있습니다. 우리는 데이터베이스가 응답하기 전에 지정된 시간(초) 동안 대기하도록 강제하는 SQL 쿼리를 전송하여 SQL 인젝션 취약점을 악용할 것입니다.
그리고 데이터베이스에서 데이터를 얻기 위해, 조건의 참/거짓 여부에 따라 데이터베이스가 대기하는 시간을 늘리거나 줄이는 IF 구조를 사용할 것입니다.
다음 이미지에서는 데이터베이스 버전(8.0.XX)의 첫 번째 문자들을 얻습니다.
조건이 참이면 데이터베이스가 (5-2)=3초 동안 대기하고, 조건이 거짓이면 (5-5)=0초 동안 대기하도록 하는 SQL 쿼리 "SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5)))"을 사용합니다. 조건은 데이터베이스 버전의 X 위치에 있는 문자가 Y 문자와 같다는 것입니다.
