久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

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

這篇文章主要介紹了PHP中對象注入的相關資料,文中通過示例代碼介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。

前言

雖然這篇文章叫做PHP對象注入,但是本質上還是和PHP的序列化的不正確使用有關。如果你閱讀了PHP中的SESSION反序列化機制對序列化就會有一個大致的認識。PHP對象注入其實本質上也是由于序列化引起的。

基礎知識

在php類中可能會存在一些叫做魔術函數(magic 函數),這些函數會在類進行某些事件的時候自動觸發,例如__construct()會在一個對象被創建時調用, __destruct()會在一個對象銷毀時調用, __toString當對象被當做一個字符串的時候被調用。常見的魔術函數有__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();  //實例化對象,調用__construct()方法,輸出__construct
$obj->echoP();   //調用echoP()方法,輸出"abc"
echo $obj;    //obj對象被當做字符串輸出,調用__toString()方法,輸出__toString
$s =serialize($obj);  //obj對象被序列化,調用__sleep()方法,輸出__sleep
echo unserialize($s);  //$s首先會被反序列化,會調用__wake()方法,被反序列化出來的對象又被當做字符串,就會調用_toString()方法。
// 腳本結束又會調用__destruct()方法,輸出__destruct
?>

原理

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

而序列化的危害就在于如果序列化的內容是用戶可控的,那么用戶就可以注入精心構造的payload。當進行發序列化的時候就有可能會出發對象中的一些魔術方法,造成意想不到的危害。

對象注入

本質上serialize()unserialize()在PHP內部實現上是沒有漏洞的,漏洞的主要產生是由于應用程序在處理對象、魔術函數以及序列化相關問題的時候導致的。

如果在一個程序中,一個類用于臨時將日志存儲進某個文件中,當__destruct()方法被調用時,日志文件被刪除。

代碼大致如下:

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);
 }
}
?>

在其他類中使用LogClass

logLogin.php

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

上面的這段代碼就是一個正常的使用LogClass類來完成日志記錄的功能。

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

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

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

上面顯示的代碼使用了LogClass對象同時還會從用戶那里接受輸入進行發序列化轉化為一個User對象。

當我們提交如下的數據

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

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

但是如果提交的數據為:

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

那么最后就會輸出delete .htaccess

可以看到通過構造的數據,導致執行了LogClass中的__destruct()方法然后刪除了網站中重要的配置文件。

從上面這個例子也可以看出來,如果沒有嚴格控制用戶的輸入同時對用戶的輸入進行了反序列化的操作,那么就有可能會實現代碼執行的漏洞。

注入點

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

主站蜘蛛池模板: jizz18国产| 午夜欧美a级理论片915影院 | 欧美日韩综合 | 成人精品啪啪欧美成 | 亚洲国产一区二区在线 | 一区二区三区四区在线免费观看 | 91亚洲国产精品 | 免费黄视频网站 | 亚洲一区亚洲二区 | 亚洲一区免费 | 久久久久久国产精品 | 自拍偷拍中文字幕 | 91精品麻豆日日躁夜夜躁 | 日韩精品在线免费观看视频 | 99精品国产成人一区二区 | 日韩高清中文字幕 | www312aⅴ欧美在线看 | 欧美电影网| 天天草视频| 欧美一级特黄aaa大片在线观看 | 国产做爰| 在线视频一区二区 | 国产午夜精品一区二区三区四区 | 国产视频一区二区 | 国产一区二区不卡 | 三级黄色片在线播放 | 欧美一区二区三区四区视频 | 亚洲福利视频网 | 狠狠爱视频 | 亚洲精品欧美 | 久久成人免费观看 | 成人免费看黄网站在线观看 | 99热精品国产 | 日韩福利在线观看 | 羞羞视频在线观看网站 | 欧美精品一区二区三区四区 | 国产欧美一区二区三区久久人妖 | 国产欧美视频一区二区 | 亚洲网站在线观看 | 国产偷自视频区视频 | 国产综合久久 |