如何理解PHP反序列化漏洞

发布时间:2021-10-18 15:46:06 作者:柒染
来源:亿速云 阅读:116

本篇文章为大家展示了如何理解PHP反序列化漏洞,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

序列化

是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。[将状态信息保存为字符串]

反序列化

反序列化就是再将这个状态信息拿出来使用(重新再转化为对象或者其他的)[将字符串转化为状态信息]

特殊写法

<?=$todo>相当于<?php   echo $todo?>

常见函数

__FILE__     获取当前文件路径
show_source()    显示文件源码
print_r()    可以输出非字符串

常见魔术方法

__construct()     对象创建时(new)自动调用,但在unserialize()时不会自动调用
__destruct()       对象销毁时自动调用
__wakeup()        使用unserialize()函数时自动调用
__toString()    当对象被当作字符串输出时自动调用

flag in ./flag.php

<?php
Class readme{
  public function __toString()
  {
      return highlight_file('Readme.txt', true).highlight_file($this->source, true);
  }
}
if(isset($_GET['source'])){
  $s = new readme();
  $s->source = __FILE__;
  echo $s;
  exit;
}
//$todos = [];
if(isset($_COOKIE['todos'])){
  $c = $_COOKIE['todos'];
  $h = substr($c, 0, 32);
  $m = substr($c, 32);
  if(md5($m) === $h){
      $todos = unserialize($m);
  }
}
if(isset($_POST['text'])){
  $todo = $_POST['text'];
  $todos[] = $todo;
  $m = serialize($todos);
  $h = md5($m);
  setcookie('todos', $h.$m);
  header('Location: '.$_SERVER['REQUEST_URI']);
  exit;
}
?>

<html>
<head>
</head>

<h2>Readme</h2>
<a href="?source"><h3>Check Code</h3></a>
<ul>
<?php foreach($todos as $todo):?>
  <li><?=$todo?></li>
<?php endforeach;?>
</ul>

<form method="post" href=".">
  <textarea name="text"></textarea>
  <input type="submit" value="store">
</form>

首先定义了一个类,里面的_toString()是一个魔术方法,
表示将Readme.txt和source里面的代码拼接在一起,并高亮显示。
判断get传参中是否有source字符串,
再创建一个readme类的对象s,并将当前文件路径的值,赋值给变量s的参数source,
最后输入s。
判断cookie传参中是否有todos字符串,
如果有将cookie传参的todos字符串赋给变量c,
变量h表示截取变量c从开始到第32位的字符串,
变量m表示变量c 32位以后构成的字符串,
当变量m进行md5加密后的值等于变量h时,输出反序列化的变量m。
表示遍历输出todos,会触发_toString()方法,
Readme.txt文件是写死的,只有变量source是可控的,
因此可以通过将FILE改为flag.php来返回flag.php的内容。

上述内容就是如何理解PHP反序列化漏洞,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. php反序列化漏洞
  2. PHP内核层反序列化漏洞

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:Python中字符编码的示例分析

下一篇:Python如何重置Django Migrate

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》