最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入講解PHP的對(duì)象注入(Object Injection)

 更新時(shí)間:2017年03月01日 11:51:49   作者:乘物游心  
這篇文章主要介紹了PHP中對(duì)象注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

雖然這篇文章叫做PHP對(duì)象注入,但是本質(zhì)上還是和PHP的序列化的不正確使用有關(guān)。如果你閱讀了PHP中的SESSION反序列化機(jī)制對(duì)序列化就會(huì)有一個(gè)大致的認(rèn)識(shí)。PHP對(duì)象注入其實(shí)本質(zhì)上也是由于序列化引起的。

基礎(chǔ)知識(shí)

在php類(lèi)中可能會(huì)存在一些叫做魔術(shù)函數(shù)(magic 函數(shù)),這些函數(shù)會(huì)在類(lèi)進(jìn)行某些事件的時(shí)候自動(dòng)觸發(fā),例如__construct()會(huì)在一個(gè)對(duì)象被創(chuàng)建時(shí)調(diào)用, __destruct()會(huì)在一個(gè)對(duì)象銷(xiāo)毀時(shí)調(diào)用, __toString當(dāng)對(duì)象被當(dāng)做一個(gè)字符串的時(shí)候被調(diào)用。常見(jiàn)的魔術(shù)函數(shù)有__construct() 、 __destruct() __toString() 、 __sleep() 、 __wakeup()

舉例如下:

<?php
class test{
 public $varr1="abc";
 public $varr2="123";
 public function echoP(){
  echo $this->varr1."<br>";
 }
 public function __construct(){
  echo "__construct<br>";
 }
 public function __destruct(){
  echo "__destruct<br>";
 }
 public function __toString(){
  return "__toString<br>";
 }
 public function __sleep(){
  echo "__sleep<br>";
  return array('varr1','varr2');
 }
 public function __wakeup(){
  echo "__wakeup<br>";
 }
}

$obj = new test();  //實(shí)例化對(duì)象,調(diào)用__construct()方法,輸出__construct
$obj->echoP();   //調(diào)用echoP()方法,輸出"abc"
echo $obj;    //obj對(duì)象被當(dāng)做字符串輸出,調(diào)用__toString()方法,輸出__toString
$s =serialize($obj);  //obj對(duì)象被序列化,調(diào)用__sleep()方法,輸出__sleep
echo unserialize($s);  //$s首先會(huì)被反序列化,會(huì)調(diào)用__wake()方法,被反序列化出來(lái)的對(duì)象又被當(dāng)做字符串,就會(huì)調(diào)用_toString()方法。
// 腳本結(jié)束又會(huì)調(diào)用__destruct()方法,輸出__destruct
?>

原理

為什么會(huì)用到序列話這樣的方法?主要就是就是方便進(jìn)行數(shù)據(jù)的傳輸,并且數(shù)據(jù)恢復(fù)之后,數(shù)據(jù)的屬性還不會(huì)發(fā)生變化。例如,將一個(gè)對(duì)象反序列化之后,還是保存了這個(gè)對(duì)象的所有的信息。同時(shí)還可以將序列化的值保存在文件中,這樣需要用的時(shí)候就可以直接從文件中讀取數(shù)據(jù)然后進(jìn)行反序列化就可以了。在PHP使用serialize()unserialize()來(lái)進(jìn)行序列化和反序列化的。

而序列化的危害就在于如果序列化的內(nèi)容是用戶可控的,那么用戶就可以注入精心構(gòu)造的payload。當(dāng)進(jìn)行發(fā)序列化的時(shí)候就有可能會(huì)出發(fā)對(duì)象中的一些魔術(shù)方法,造成意想不到的危害。

對(duì)象注入

本質(zhì)上serialize()unserialize()在PHP內(nèi)部實(shí)現(xiàn)上是沒(méi)有漏洞的,漏洞的主要產(chǎn)生是由于應(yīng)用程序在處理對(duì)象、魔術(shù)函數(shù)以及序列化相關(guān)問(wèn)題的時(shí)候?qū)е碌摹?br />

如果在一個(gè)程序中,一個(gè)類(lèi)用于臨時(shí)將日志存儲(chǔ)進(jìn)某個(gè)文件中,當(dāng)__destruct()方法被調(diào)用時(shí),日志文件被刪除。

代碼大致如下:

logfile.php

<?php
class LogClass {
 public $logfilename = "";
 public function logdata($text) {
  echo "log data".$text."<br/>";
  file_put_contents($this->logfilename,$text,FILE_APPEBD);
 }

 public function __destruct() {
  echo 'deletes'.$this->logfilename;
  unlink(dirname(__FILE__).'/'.$this->logfilename);
 }
}
?>

在其他類(lèi)中使用LogClass

logLogin.php

<?php
include "index.php";
$obj = new LogClass();
$obj->logfilename = "login.log";
$obj->logdata('記錄日志');
?>

上面的這段代碼就是一個(gè)正常的使用LogClass類(lèi)來(lái)完成日志記錄的功能。

下面顯示的是存在對(duì)象注入漏洞的使用例子。

news.php

<?php
include "logfile.php";
// some codes the use the LogClass
class User {
 public $age = 0;
 public $name = '';
 public function print_data() {
  echo "User".$this->name."is".$this->age."years old.<br/>";
 }
}

// 從用戶接受輸入發(fā)序列化為User對(duì)象
$usr = unserialize($_GET["user"]);
?>

上面顯示的代碼使用了LogClass對(duì)象同時(shí)還會(huì)從用戶那里接受輸入進(jìn)行發(fā)序列化轉(zhuǎn)化為一個(gè)User對(duì)象。

當(dāng)我們提交如下的數(shù)據(jù)

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

這樣的語(yǔ)句是可以正常使用的,也是程序員希望使用的方法。

但是如果提交的數(shù)據(jù)為:

news.php?user=O:8:"LogClass":1:{s:11:"logfilename";s:9:".htaccess";}

那么最后就會(huì)輸出delete .htaccess。

可以看到通過(guò)構(gòu)造的數(shù)據(jù),導(dǎo)致執(zhí)行了LogClass中的__destruct()方法然后刪除了網(wǎng)站中重要的配置文件。

從上面這個(gè)例子也可以看出來(lái),如果沒(méi)有嚴(yán)格控制用戶的輸入同時(shí)對(duì)用戶的輸入進(jìn)行了反序列化的操作,那么就有可能會(huì)實(shí)現(xiàn)代碼執(zhí)行的漏洞。

注入點(diǎn)

PHP對(duì)象注入一般在處在程序的邏輯上面。例如一個(gè)User類(lèi)定義了__toString()用來(lái)進(jìn)行格式化輸出,但是也存在File類(lèi)定義了__toString()方法讀取文件內(nèi)容然后進(jìn)行顯示,那么攻擊者就有可能通過(guò)User類(lèi)的反序列化構(gòu)造一個(gè)File類(lèi)來(lái)讀取網(wǎng)站的配置文件。

user.php

<?php
class FileClass {
 public $filename = "error.log";
 public function __toString() {
 echo "filename發(fā)生了變化==>" . $this->filename ;
  return @file_get_contents($this->filename);
 }
}

class UserClass {
 public $age = 0;
 public $name = '';
 public function __toString() {
  return 'User '.$this->name." is ".$this->age.' years old. <br/>';
 }
}

$obj = unserialize($_GET['usr']);
echo $obj;  //調(diào)用obj的__toString()方法
?>

正常情況下我們應(yīng)該傳入U(xiǎn)serClass序列化的字符串,例如user.php?usr=O:9:"UserClass":2:{s:3:"age";i:18;s:4:"name";s:3:"Tom";} ,頁(yè)面最后就會(huì)輸出User Tom is 18 years old. 。

這也是一個(gè)理想的使用方法。

但是如果我們傳入的數(shù)據(jù)為user.php?usr=O:9:"FileClass":1:{s:8:"filename";s:10:"config.php";} ,頁(yè)面最后的輸出是filename發(fā)生了變化==>config.php,執(zhí)行了FileClass中的__toString()方法。

這樣就可以讀取到config.php中的源代碼了。

漏洞挖掘

這類(lèi)洞一般都是很難挖掘的,雖然顯示看起來(lái)很簡(jiǎn)單,但實(shí)際上需要的條件還是相當(dāng)?shù)目量痰模艺覍?duì)象注入的漏洞一般都是通過(guò)審計(jì)源代碼的方式來(lái)進(jìn)行尋找,看unserialize()的參數(shù)是否是可控的,是否存在反序列化其他參數(shù)對(duì)象的可能。

防御

要對(duì)程序中的各種邊界條件進(jìn)行測(cè)試

避免用戶對(duì)于unserialize()參數(shù)是可控的,可以考慮使用json_decode方法來(lái)進(jìn)行傳參。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • php依賴注入知識(shí)點(diǎn)詳解

    php依賴注入知識(shí)點(diǎn)詳解

    在本文里小編給大家整理的是關(guān)于php依賴注入知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2019-09-09
  • WIN8.1下搭建PHP5.6環(huán)境

    WIN8.1下搭建PHP5.6環(huán)境

    很多人喜歡用linux搭建php網(wǎng)頁(yè)語(yǔ)言運(yùn)行環(huán)境,但由于linux高度自定義化,經(jīng)常需要root運(yùn)行命令,略顯高端,相對(duì)應(yīng)的微軟的windows操作系統(tǒng),用戶體驗(yàn)不錯(cuò),可以借助windows自帶的IIS組件+PHP程序包,搭建一個(gè)合適的運(yùn)行環(huán)境。
    2015-04-04
  • php的擴(kuò)展寫(xiě)法總結(jié)

    php的擴(kuò)展寫(xiě)法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于怎么寫(xiě)php的擴(kuò)展的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。
    2019-05-05
  • PHP抽象類(lèi)和接口用法實(shí)例詳解

    PHP抽象類(lèi)和接口用法實(shí)例詳解

    這篇文章主要介紹了PHP抽象類(lèi)和接口用法,結(jié)合實(shí)例形式詳細(xì)分析了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)中抽象類(lèi)與接口的相關(guān)概念、原理、區(qū)別及使用技巧,需要的朋友可以參考下
    2019-07-07
  • 詳解PHP用mb_string處理windows中文字符

    詳解PHP用mb_string處理windows中文字符

    如果想批處理以前下載的一堆文件,把文件里的關(guān)鍵內(nèi)容用正則匹配出來(lái),集中處理。操作文件時(shí)遇到一個(gè)問(wèn)題,就是windows操作系統(tǒng)中的編碼問(wèn)題。本文將帶著大家詳細(xì)探討此問(wèn)題。
    2021-05-05
  • php遇到錯(cuò)誤Call to undefined function ImageCreate()解決方法

    php遇到錯(cuò)誤Call to undefined function ImageCreate()解決方法

    剛配置好服務(wù)器,運(yùn)行php的時(shí)候提示Call to undefined function imagecreate錯(cuò)誤,經(jīng)過(guò)百度發(fā)現(xiàn)是php不支持gd庫(kù),linux服務(wù)器需要重新make,windows下比較簡(jiǎn)單了,下面是具體的方法
    2021-09-09
  • php使用Jpgraph繪制3D餅狀圖的方法

    php使用Jpgraph繪制3D餅狀圖的方法

    這篇文章主要介紹了php使用Jpgraph繪制3D餅狀圖的方法,涉及jpgraph使用PiePlot3D創(chuàng)建3D餅狀圖的技巧,需要的朋友可以參考下
    2015-06-06
  • 圖文詳解vscode配置運(yùn)行php項(xiàng)目完整版

    圖文詳解vscode配置運(yùn)行php項(xiàng)目完整版

    前段時(shí)間項(xiàng)目中有寫(xiě)點(diǎn)PHP頁(yè)面的需求,架設(shè)了一個(gè)PHP的運(yùn)行環(huán)境,下面這篇文章主要給大家介紹了關(guān)于vscode配置運(yùn)行php項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • PHP 常見(jiàn)郁悶問(wèn)題答解

    PHP 常見(jiàn)郁悶問(wèn)題答解

    [綠色]PHP 常見(jiàn)郁悶問(wèn)題答解...
    2006-11-11
  • PHP設(shè)計(jì)模式之中介者模式淺析

    PHP設(shè)計(jì)模式之中介者模式淺析

    這篇文章主要介紹了PHP設(shè)計(jì)模式之中介者模式,中介者模式(Mediator Pattern)是一種常用的設(shè)計(jì)模式,用于解決各個(gè)對(duì)象之間的復(fù)雜依賴關(guān)系,使得各個(gè)對(duì)象之間可以獨(dú)立地改變自己的行為,而不需要與其他對(duì)象發(fā)生直接的交互
    2023-04-04

最新評(píng)論

南部县| 博白县| 仁布县| 沈阳市| 东乡| 长葛市| 抚顺市| 宁陵县| 左云县| 淅川县| 巴青县| 偃师市| 桂林市| 安新县| 墨竹工卡县| 临夏市| 长治县| 庆安县| 天峨县| 黔西县| 榆树市| 阳曲县| 公主岭市| 陇南市| 仁寿县| 洪湖市| 鹤壁市| 黑河市| 且末县| 赣榆县| 元江| 兴海县| 班戈县| 民权县| 格尔木市| 临漳县| 青铜峡市| 阿合奇县| 原阳县| 临夏市| 池州市|