TRAN CONG DANH - SVTT - 멘토: LUU VAN LAN - CVE-2018-7600 - 시작일: 26/06/2024.
목차:
- CVE summary
- Prerequisites
- CVE Analyse
- Mitigation
CVE summary
- 공격자는 call_user_func 자동 실행 함수를 포함하는 Drupal Form API Ajax Request를 호출할 수 있습니다.
- Drupal 7.58 이전 버전, 8.x 8.3.9 이전 버전, 8.4.x 8.4.6 이전 버전, 8.5.x 8.5.1 이전 버전
Prerequisites
-
이 실습에서는 다음을 사용합니다:
- Ubuntu 20.04( PHP 7.2, MariaDB )
- 이 실습에서 사용하는 Drupal 버전은 8.3.8입니다.
- 디버깅용 Visual Studio Code
- Drupal 익스플로잇 실행용 Kali 23.4
CVE Analyse
- call_user_func를 사용하는 키는 #pre_render, #post_render, #access_callback, #submit, #lazy_builder, #validate임을 확인했습니다.

- 이제 해야 할 일은 사용자가 제출한 매개변수 중 render가 있는 항목을 찾아 키를 변경하고, 호출하기 위해 #post_render 키를 받는 것입니다.

- 사진 크기를 조정하면 서버가 drupal API를 호출합니다.

- 여기에 포함된 &$array 함수는 전송 시 기본 요소의 배열입니다. 코드 없이 디버깅을 시도해 보겠습니다:

- 업로드 시 mail 값을 수정한다고 가정해 보겠습니다:


- getValue($array, $parents) 메서드를 호출하면 프로세스는 다음과 같습니다:
$ref는 $array에 대한 참조를 허용하지 않습니다.
첫 번째 루프: $ref는 $array['a']를 참조합니다.
두 번째 루프: $ref는 $array['a']['b']를 참조합니다.
세 번째 루프: $ref는 $array['a']['b']['c']를 참조합니다.
최종 결과, $ref는 값 42를 참조하게 됩니다.
$array = [
'a' => [
'b' => [
'c' => 42
]
]
];
$parents = ['a', 'b', 'c'];
- getValue 함수에서 $form 값을 받은 후, $form은 Render 함수의 인수가 됩니다.



Mitigation
- 패치
** Drupal 개발자들은 키가 “#”로 시작하는 배열의 모든 입력 요소를 제거하는 stripDangerousValues 메서드를 가진 RequestSanitizer 클래스를 추가하는 패치를 게시했습니다. 이 메서드는 $_GET, $_POST, $_COOKIES의 입력을 정리합니다.
** Drupal 8.6.5
/core/lib/Drupal/Core/DrupalKernel.php
/core/lib/Drupal/Core/Security/RequestSanitizer.php
** stripDangerousValues 함수는 모든 입력 매개변수를 하나씩 검증하며, 입력 배열의 요소가 “#”로 시작하는 값을 가지면 화이트리스트에 없는 값은 제거됩니다.