37-WEB漏洞-反序列化之PHPJAVA全解(上)

WEB漏洞-反序列化之PHP&JAVA全解(上)

  • 一、PHP 反序列化原理
  • 二、案例演示
    • 2.1、无类测试
      • 2.1.1、本地
      • 2.1.2、CTF 反序列化小真题
      • 2.1.3、CTF 反序列化类似题
    • 2.2、有类魔术方法触发
      • 2.2.1、本地
      • 2.2.2、网鼎杯 2020 青龙大真题
  • 三、参考资料

在这里插入图片描述
在这里插入图片描述

一、PHP 反序列化原理

  • 未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串
unserialize() //将字符串还原成一个对象触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:参考:https://www.cnblogs.com/20175211lyz/p/11403397.html__construct()	//创建对象时触发
__destruct() 	//对象被销毁时触发
__call() 			//在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() 			//用于从不可访问的属性读取数据
__set() 			//用于将数据写入不可访问的属性
__isset() 		//在不可访问的属性上调用 isset()或 empty()触发
__unset() 		//在不可访问的属性上使用 unset()时触发
__invoke() 		//当脚本尝试将对象调用为函数时触发

二、案例演示

在这里插入图片描述

2.1、无类测试

2.1.1、本地

  • unserialize2.php
<?phperror_reporting(0);include "flag.php";$KEY = "xiaodi";$str = $_GET['str'];if (unserialize($str) === "$KEY"){echo "$flag";}show_source(__FILE__);
  • flag.php
<?php$flag='flag{flag_is_here}';
?>
  • serialize在这里插入图片描述

  • unserialize
    在这里插入图片描述

  • 演示:
    在这里插入图片描述

在这里插入图片描述

  • 一点改动:
    在这里插入图片描述
    在这里插入图片描述

2.1.2、CTF 反序列化小真题

  • 链接:
  • 题目:点login咋没反应
    在这里插入图片描述

1、可用发现登录按钮无法使用,只是一个摆设。
在这里插入图片描述

2、查看网页源代码,发现有一个href="admin.css"的可疑信息:

在这里插入图片描述
3、点进去查看,发现提示:
在这里插入图片描述
4、在url后面加上?23727,发现有反馈。
在这里插入图片描述

5、分析代码,可以得出:要想得到flag的值,要让COOKIE的值与KEY的值相等。同时还要满足一个条件:URL上不能够出现23727这个参数,否则执行的是显示源文件的信息,而不是flag的值。

6、抓包,并添加Cookie
在这里插入图片描述

7、获得flag的值。
在这里插入图片描述

2.1.3、CTF 反序列化类似题

在这里插入图片描述
1、在URL后面添上?hint可以查看到代码。
在这里插入图片描述

2、比较COOKIE的值与KEY的值是否相等时,存在一个陷阱。
在这里插入图片描述
3、使用KEY为空的值,进行反序列化。
在这里插入图片描述
在这里插入图片描述
4、获得flag。
在这里插入图片描述

2.2、有类魔术方法触发

2.2.1、本地

  • unserialize3.php
<?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 '对象快死了<br>';

在这里插入图片描述

2.2.2、网鼎杯 2020 青龙大真题

  • 题目链接:https://www.ctfhub.com/#/challenge
    在这里插入图片描述

1、进入环境:
在这里插入图片描述

 <?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") {$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")$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);}}

2、分析代码:

  • 主函数(传递参数有效就将参数反序列化):
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);}}
  • 类之前(包含文件,高亮源代码):
include("flag.php");highlight_file(__FILE__);
  • 类的源代码
// 	- 第一:获取 flag 存储 flag.php
//	- 第二:两个魔术方法__destruct __constructclass FileHandler {protected $op;protected $filename;protected $content;function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}
// 	- 第三:传输 str 参数数据后触发 destruct(反序列化之后,相当于添加了一个对象(但是不会触发construct方法,因为是反序列化得来的)。但是会在最后触发destruct方法),存在 is_valid 过滤(如果OP===2,赋值为1;否则就将content赋值为空,调用process方法) function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";$this->process();}
// - 第四:__destruct 中会调用 process,其中 op=1 就写入, op=2 就调用读取方法并且赋值给res,再打印res(output()为打印),否则就输出坏黑客。public function process() {if($this->op == "1") {$this->write();} else if($this->op == "2") {$res = $this->read();$this->output($res);} else {$this->output("Bad Hacker!");}}// 写入(OP=1写入)// ---如果filename和content都存在,并且content的长度小于100,就将content写入filename,并且输出成功。否则输出失败。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!");}}// #读取(OP=2读取)// ---如果filename存在,就读取文件。并且打印读取的内容。private function read() {$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}
 // - 第五:涉及对象 FileHandler,变量 op 及 filename,content,进行构造输出。
  • 原理解析(涉及:反序列化魔术方法调用,弱类型绕过,ascii 绕过)

    • 使用该类对 flag 进行读取,这里面能利用的只有__destruct 函数(析构函数)。
    • __destruct 函数对$this->op 进行了===判断并内容在 2 字符串时会赋值为 1(但是process 函数中使用==$this->op 进行判断(为 2 的情况下才能读取内容))
    • 因此这里存在弱类型比较,可以使用数字 2字符串' 2'绕过判断。
    • is_valid 函数还对序列化字符串进行了校验,因为成员被 protected 修饰,因此序列化字符串中会出现 ascii 为 0 的字符。经过测试,在 PHP7.2+的环境中,使用 public 修饰成员并序列化,反序列化后成员也会被 public 覆盖修饰。
  • 总结:

    • 传参str --> destruct方法(强类型对比)
    • op值对比 === 对比类型和值
    • op=’ 2’(字符串);op=‘2’ 两者不相等,不成立
    • 成立,强制op=1,反之op=自己设置的值
    • process()弱类型对比,将’ 2’‘2’对比是一致的

3、分析并构造payload:(protected会在前后加上 %00
在这里插入图片描述

?str=O:11:"FileHandler":3:{s:2:"op";s:2:" 2";s:8:"filename";s:8:"flag.php";s:7:"content";s:2:"xd";}
  • 如果使用protected
    在这里插入图片描述

4、运行。
在这里插入图片描述

5、查看网页源代码,获得flag。
在这里插入图片描述

5、更多解法。
https://blog.csdn.net/qq_36438489/article/details/106230811

三、参考资料

  • https://www.cnblogs.com/20175211lyz/p/11403397.html
  • http://www/dooccn.com/php/
  • https://www.ctfhub.com/#/challenge
  • http://php.jsrun.net/php/t/LWKKp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/422075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

码农维权——案例分析之违法解除劳动合同(二)

目录 一、背景 二、案例来源 三、被【非法】解除《劳动合同》后可以主张哪些诉求&#xff1f; 四、案例分析&#xff1a;违法解除劳动合同 A、公司的主张&#xff1a; B、公司的主要证据&#xff08;公司单方面提交的&#xff0c;法院不一定认可采纳&#xff09;&…

龟兔再跑

欢迎来到程序小院 龟兔再跑 玩法&#xff1a;乌龟跳绳&#xff0c;点击鼠标左键乌龟跳跃&#xff0c;两只乌龟一直不停的甩绳子&#xff0c;另外一只乌龟从中跳过&#xff0c;赶快去跳绳吧^^。开始游戏https://www.ormcc.com/play/gameStart/255 html <div class"mai…

kali下-MSF-ftp_login模块破解FTP账号及密码

一、环境准备 两台设备在同一个网络内 一台kali系统&#xff1a;192.168.10.128 一台winserver2016&#xff1a;192.168.10.132 二、MSF介绍 metasploit 全称是The Metasploit Framework&#xff0c;又称MSF&#xff0c;是Kali 内置的一款渗透测试框架&#xff0c;也是全球…

【linux】 查看 Linux 重启历史记录(reboot)

了解 Linux 重启日志 /var/log 目录隐藏着 Linux 日志机制的核心信息&#xff0c;它是记录系统活动的宝贵仓库。然而&#xff0c;仅仅有日志还不够&#xff0c;真正的难题在于&#xff0c;如何从大量数据中提炼出与系统重启相关的关键信息。 在 /var/log 目录中&#xff0c;可…

03--数据库连接池

1、数据库连接池 1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步骤&#xff1a; 在主程序&#xff08;如servlet、beans&#xff09;中建立数据库连接进行sql操作断开数据库连接 这种模式开发&#xff0c;存在的问题:…

爬虫requests+综合练习详解

Day2 - 1.requests第一血_哔哩哔哩_bilibili requests作用&#xff1a;模拟浏览器发请求 requests流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 持续化存储 爬取搜狗首页的页面数据 import requests# 指定url url https://sogou.com # 发起请求 resp…

快乐学Python,如何使用Python处理文件(csv、Excel、html)数据?

在前面的文章中&#xff0c;我们了解了Python爬虫的一些内容。截止到现在&#xff0c;我们已经可以将需要的数据通过爬虫获取&#xff0c;并保存到CSV文件中。 在有了数据集后&#xff0c;接下来我们就开始了解如何将数据集的内容加载到Python中。虽然在之前也有了解简单的读取…

一区优化直接写:KOA-CNN-BiLSTM-Attention开普勒优化卷积、长短期记忆网络融合注意力机制的多变量回归预测程序!

适用平台&#xff1a;Matlab 2023版及以上 KOA开普勒优化算法&#xff0c;于2023年5月发表在SCI、中科院1区Top顶级期刊《Knowledge-Based Systems》上。 该算法提出时间很短&#xff0c;目前还没有套用这个算法的文献。 同样的&#xff0c;我们利用该新鲜出炉的算法对我们的…

一文读懂大语言模型

随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门的研究领域之一。在这一领域中&#xff0c;预训练大语言模型&#xff08;Pre-trained Large Language Models&#xff09;凭借其强大的语言理解和生成能力&#xff0c;逐渐成为了研究…

ChatGPT在国自然基金撰写中的妙用;从申请人的角度,带你一次入门;从评审专家的角度,带您逐一突破

目录 专题一 国自然项目介绍 专题二 基金的撰写技巧&#xff08;从申请人的角度&#xff0c;带你一次入门&#xff09; 专题三 基金的专项技巧&#xff08;从评审专家的角度&#xff0c;带您逐一突破&#xff09; 专题四 ChatGPT在基金撰写中的妙用 更多应用 您的基金撰写…

HarmonyOS 通过Web组件嵌套网络应用

我们今天来说说 在程序中嵌套一个网址地址 HarmonyOS中是通过一个简单的WEB组件来实现 网络应用就是相当于网址地址 通过链接将应用嵌入到手机当中 WEB组件需要两个参数 一个是 src 地址 要嵌套的网址 另一个是 控制器 我们可以先编写代码如下 import webview from "o…

【代码随想录算法训练营第二十四天|回溯算法的理论基础、77. 组合】

代码随想录算法训练营第二十四天|回溯算法的理论基础、77. 组合 回溯算法的理论基础77. 组合 回溯算法的理论基础 这里我觉得《代码随想录》和y总的课都比较好了 《代码随想录》 &#xff1a; https://programmercarl.com/0077.%E7%BB%84%E5%90%88%E4%BC%98%E5%8C%96.html#%E5…