CVE-2023-46818 취약점의 메커니즘, 취약점 코드의 동작 방식, 페이로드 구조 및 모의 침투(Penetration Testing) 관점에서의 분석입니다.
이 취약점은 ISPConfig의 관리자 인터페이스인 /admin/language_edit.php 스크립트에서 발생합니다.
records POST 매개변수 데이터를 제대로 검증(Sanitization)하거나 적절히 이스케이프(Escaping) 처리하지 않은 채 PHP 소스 코드 문자열 형태로 조합하여 저장하기 때문입니다.ISPConfig의 언어 파일 저장 로직은 언어 변수를 PHP 배열 형식(예: $wb['key'] = 'value';)으로 파일에 동적으로 기록합니다.
/admin/language_edit.php로 HTTP POST 요청을 보낼 때 records[...] 배열 형태로 번역 문자열 데이터를 전달합니다.\) 처리를 완전하게 파싱하지 못합니다.'; system($_GET['cmd']); $a=')을 삽입하면, 해당 내용이 /admin/lib/lang/ 또는 해당 모듈의 lang/*.lng 파일에 그대로 기록됩니다.include 또는 require 되는 순간, 주입된 PHP 코드가 평가(Evaluate)되면서 서버 권한으로 실행됩니다.Nuclei 템플릿 및 PoC 분석 기반의 공격 요청 예시입니다.
POST /admin/language_edit.php HTTP/1.1
Host: target-ispconfig.com
Content-Type: application/x-www-form-urlencoded
Cookie: session_id=...
lang=en&module=help&lang_file=en_help.lng&_csrf_id=[CSRF_ID]&_csrf_key=[CSRF_KEY]&records[\']]=<?php system($_GET['cmd']); ?>
records 매개변수에 백슬래시(\) 또는 싱글 쿼트(')를 이용해 기존 문법 구문을 빠져나온 후 PHP 태그(<?php ... ?>)나 PHP 함수(system, passthru, exec)를 주입합니다.admin_allow_langedit 옵션 활성화 필요 (1 또는 true).www-data 또는 ispconfig) 권한으로 arbitrary OS command 실행./admin/language_edit.php로 향하는 POST 요청 중 records 파라미터 내 <?php, system(, eval(, passthru( 등 PHP 실행 패턴 포함 여부 검사.패치 버전인 3.2.11p1에서는 다음과 같은 조치가 적용되었습니다.
language_edit.php 내부에서 입력받은 records 데이터의 특수문자 이스케이프 로직 보완.admin_allow_langedit 설정이 꺼져 있을 경우 언어 편집기 접근을 엄격히 통제.