널리 사용되는 서버 측 프로그래밍 언어로서 PHP는 웹 개발에서 중요한 위치를 차지합니다. 점점 더 많은 PHP 응용 프로그램이 인터넷에 노출됨에 따라 보안 문제가 점차 개발자의 초점이되고 있습니다. PHP에서 Serialize () 및 Unserialize () 함수는 객체 및 배열의 직렬화 및 사막화를 처리하는 데 널리 사용됩니다. 그러나 이러한 기능은 공격자가 "물체 주입 공격"을 수행 할 수있는 잠재적 인 취약점이 될 수 있습니다. 방지하지 않으면 공격자는 신중하게 구성된 악성 데이터를 통해 응용 프로그램의 동작을 변경하고 원격 코드 실행 (RCE)과 같은 심각한 보안 문제로 이어질 수 있습니다.
이 기사는 PHP의 Serialize () 및 Unserialize () 기능의 보안 문제를 분석하고 객체 주입 공격을 방지하기위한 효과적인 조치를 제공합니다.
Serialize () 및 Unserialize () 는 객체 및 어레이 직렬화 및 사막화에 대한 PHP의 두 가지 중요한 기능입니다.
Serialize () : PHP 변수 (객체, 배열 등 포함)를 저장 또는 전송할 수있는 문자열로 변환합니다. 예를 들어 객체 또는 배열을 문자열로 변환하여 데이터베이스에 저장할 수 있습니다.
Unserialize () : 직렬화 된 문자열을 PHP의 원래 데이터 유형 (예 : 객체 또는 배열)으로 재구성하는 것입니다.
$data = ['name' => 'John', 'age' => 30];
$serializedData = serialize($data);
echo $serializedData; // 산출:a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;}
위의 코드는 배열 $ 데이터를 문자열로 직렬화합니다. 데이터베이스에 저장하면 나중에 unsserialize ()를 통해 원래 배열로 복원 할 수 있습니다.
객체 주입 공격은 공격자가 특수 직렬화 된 데이터를 구성하는 공격자를 말해서 PHP unserialize () 함수가 악의적 인 코드를 실행하거나 데이터를 실시 할 때 응용 프로그램의 동작을 변경합니다. 이러한 유형의 공격은 일반적으로 PHP 응용 프로그램이 입력 데이터를 완전히 확인하지 않을 때 발생합니다.
예를 들어, 공격자가 다음 악성 데이터를 구성한다고 가정합니다.
$maliciousData = 'O:8:"UserClass":1:{s:4:"name";s:4:"evil";}';
unserialize($maliciousData);
그중에서도 사용자 클래스 는 응용 프로그램의 클래스입니다. 공격자는 직렬화 된 데이터를 통해 악의적 인 객체를 생성하여 검증없이 Unserialize () 함수로 전달하여 객체의 생성자를 트리거하여 보안 취약점으로 이어질 수 있습니다.
객체 주입 공격을 방지하기 위해 개발자는 다음과 같은 효과적인 조치를 취할 수 있습니다.
사막화 과정에서 데이터에 클래스 이름이 포함 된 경우 unserialize () 함수는 클래스를로드하려고 시도합니다. 적절한 보안 조치없이 클래스가 응용 프로그램에 존재하는 경우 악성 개체가 생성되고 실행될 수 있습니다. 따라서, 사막화 중에로드 될 수있는 클래스는 unserialize () 의 allend_classes 매개 변수에 의해 제한 될 수있다.
$data = 'O:8:"UserClass":1:{s:4:"name";s:4:"evil";}';
$unserializedData = unserialize($data, ['allowed_classes' => ['UserClass']]);
클래스 이름이 명시 적으로 나열되지 않은 경우, PHP는 알 수없는 클래스 이름을 포함하는 데이터의 실조 화를 허용하지 않습니다.
수신 된 직렬화 된 데이터를 엄격하게 확인하고 필터하여 잘못된 콘텐츠가 포함되지 않도록합니다. 데이터를 수락하기 전에 정규 표현식 또는 기타 방법을 사용하여 직렬화 된 문자열의 구조가 합법적인지 확인할 수 있습니다.
if (preg_match('/^[O|a|s|i|d|b|f|N|r|C|l|n]/', $inputData)) {
$unserializedData = unserialize($inputData);
} else {
die('Invalid serialized data');
}
특별한 요구 사항이 없으면 serialize () 및 unserialize ( ) 대신 json_encode ( ) 및 json_decode ()를 사용하는 것이 좋습니다. json_encode () 및 json_decode () 는 객체 주입 공격에 대해 쉽게 이용되지 않습니다. 간단한 데이터 유형 (예 : 배열, 객체, 문자열, 숫자 등) 만 처리 할 수 있으며 복잡한 클래스 및 객체를 포함하지 않기 때문입니다.
$data = json_encode($dataArray);
$decodedData = json_decode($data, true);
php.ini 구성 파일에서 개발자가 이러한 기능을 우연히 사용하지 않도록 특정 기능을 비활성화하여 보안을 향상시킬 수 있습니다. 공격자가 unsserialize () 를 통해 보안 취약점을 유발하지 않도록하기 위해 Unserialize () 함수를 비활성화하거나 신뢰할 수있는 범위로 제한 할 수 있습니다.
disable_functions = "unserialize"
PHP 커뮤니티는 정기적으로 업데이트 및 보안 패치를 공개하여 잠재적 인 보안 취약점을 수정합니다. 개발자는 항상 최신 버전의 PHP를 사용하고 보안을 보장하기 위해 적시에 시스템을 업데이트해야합니다.
Serialize () 및 Unserialize () 기능을 직접 보호하는 것 외에도 개발자는 민감한 데이터의 전반적인 보안 관리를 강화해야합니다. 보안 모범 사례는 다음과 같습니다.
암호화 된 민감한 데이터 : 민감한 데이터 저장 또는 전송 된 경우 AES 암호화와 같은 강력한 암호화 알고리즘을 사용하여 암호화하여 공격자가 데이터를 얻는 경우에도 쉽게 갈라질 수 없도록합니다.
입력 확인 : 모든 사용자 입력, 특히 URL, 양식 또는 API를 통해 수신 된 데이터를 엄격하게 확인하십시오. 기존 라이브러리는 SQL 주입, XSS 및 CSRF와 같은 일반적인 공격을 방지하는 데 사용될 수 있습니다.
객체 노출 최소화 : 클라이언트에 직접 민감하거나 복잡한 객체를 노출하지 마십시오. 직렬화 해야하는 데이터에는 필요한 정보 만 포함되어야합니다.
PHP의 Serialize () 및 Unserialize () 함수는 개발자에게 편리한 데이터 저장 및 전송 메커니즘을 제공하지만 제한없이이를 사용하면 심각한 보안 위험이 발생합니다. 합리적인 구성, 입력 검증, 대안 사용 및 PHP 버전의 적시 업데이트를 통해 객체 주입 공격을 효과적으로 방지 할 수 있습니다.
가장 중요한 것은 : 사용자 입력을 신뢰하지 마십시오! 합리적인 보안 전략과 보호 조치는 응용 프로그램의 보안을 효과적으로 향상시키고 잠재적 위험을 줄일 수 있습니다.