
Cotonti CommentsWidget PHP 객체 주입 취약점(CAN-2026-2035973 / CVE-2026-71294)에 대한 안전한 로컬 개념 증명.
Cotonti의 CommentsWidget 구현에서 확인된 PHP 객체 주입 문제에 대한 안전한 로컬 개념 증명입니다.
plugins/comments/inc/CommentsWidget.php취약한 코드 경로는 ci GET 파라미터를 받아 공격자가 제어하는 데이터를 base64_decode()를 거쳐 PHP의 unserialize()로 전달하며, 어떤 클래스가 인스턴스화될 수 있는지 제한하지 않습니다.
개념적으로 취약한 연산은 다음과 같습니다:
$ci = @unserialize(base64_decode($ci));
직렬화된 객체가 제공되면 PHP는 공격자가 제어하는 클래스를 인스턴스화하고 __wakeup()과 같은 매직 메서드를 호출할 수 있습니다. 더 큰 애플리케이션에서는 적절한 가젯 클래스가 존재할 경우 위험해질 수 있습니다.
제출된 수정 사항은 역직렬화를 다음과 같이 변경합니다:
$ci = @unserialize(base64_decode($ci), ['allowed_classes' => false]);
그리고 결과 값이 사용되기 전에 예상된 배열 구조를 가지는지 검증합니다.
poc.php는 세 가지 로컬 테스트를 수행합니다:
unserialize()가 DangerousGadget을 인스턴스화하고 해당 __wakeup() 메서드를 트리거합니다.allowed_classes => false가 가젯 클래스의 인스턴스화를 방지하여 __wakeup() 부작용을 차단합니다.PoC는 __wakeup()이 실행되었음을 보여주는 무해한 표식으로만 /tmp/pwned_by_cotonti_poc.txt를 사용합니다. 운영 체제 명령을 실행하지는 않습니다. id && whoami 문자열은 가젯의 command 속성에 자리 표시자 값으로만 존재합니다.
serialize() / unserialize()를 지원하는 PHP CLI취약한 동작과 수정된 역직렬화 동작이 직접 재현되므로 Cotonti 설치가 필요하지 않습니다.
저장소 디렉터리에서:
php poc.php
예상 출력은 다음과 유사합니다:
[!] DangerousGadget::__wakeup() triggered
[TEST 1] VULNERABLE: __wakeup() executed during unrestricted unserialize().
[TEST 2] FIXED: object instantiation was blocked; no sentinel was created.
[TEST 3] FIXED: invalid serialized structure rejected by validation.
Summary:
- Vulnerable path allows a serialized attacker-controlled object to be instantiated and invokes __wakeup().
- Fixed path uses allowed_classes=false, preventing the gadget class from being instantiated.
- Structural validation rejects values that do not match the expected array shape.
- No real command execution is performed by this PoC; the command property is only a placeholder.
스크립트는 종료 전에 표식 파일을 제거합니다.
공격자가 제어하는 데이터를 제한 없는 PHP unserialize()로 역직렬화하지 마십시오.
이 코드 경로의 경우, 시연된 완화 방법은 클래스 인스턴스화를 비활성화하는 것입니다:
unserialize($data, ['allowed_classes' => false]);
또한 역직렬화된 값은 내용이 사용되기 전에 애플리케이션이 기대하는 정확한 구조와 일치하는지 검증해야 합니다.
이 저장소는 보안 연구, 검증, 방어적 테스트를 목적으로 합니다. 소유하거나 명시적으로 테스트 권한을 받은 환경에서만 PoC를 실행하십시오. 허가 없이 시스템을 대상으로 사용하지 마십시오.
Harsh Raj Singhania — 취약점 연구, 개념 증명, 공개.