首页 > 编程语言 >[LCTF 2018]bestphp's revenge php原生类的利用以及php_session反序列化相关

[LCTF 2018]bestphp's revenge php原生类的利用以及php_session反序列化相关

时间:2024-06-17 16:14:07浏览次数:24  
标签:LCTF php session call user 序列化 SoapClient

今天继续来一道反序列化的题目。

点击查看代码
<?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!
说是只有本地才能够访问flag,但是这题是反序列化,所以没有想的那么简单,没有发现反序列化的文件,第一时间想到原生类,但还是一脸懵,看看wp思路。 主要就是利用SoapClient原生类来进行ssrf来达到我们的目的,那么开始。 做之前先去看看SoapClient的利用,我们发现由于SoapClient原生类中包含__call方法,并且我们知道:当调用一个对象中不存在的方法时候,会执行call()魔术方法。因此在CTF中通常会出现一种存在调用不存在的方法、并且需要我们伪造请求头的题目。所以最主要是要触发SoapClient的__call,而__call是在调用不存在的方法是触发,看看有哪些能利用的。 可以看到如果我们将call_user_func($b, $a);的参数b变为call_user_func,$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');变为$a = array("SoapClient", 'welcome_to_the_lctf2018');,那么call_user_func就会创建一个call_user_func调用SoapClient类的welcome_to_the_lctf2018方法,但是SoapClient类中没有这个方法,就会触发__call魔术方法来达到我们的目的。

那么接下来的问题就是如何让b=call_user_func,在$b = 'implode';call_user_func($_GET['f'], $_POST);可以看到参数f可以控制,我们试图让其为extract来进行变量覆盖来达到我们的目的,那么f=extract&name=SoapClient,且post中提交b=call_user_func来达到目的,但是这还不够,要进行利用SoapClient来进行ssrf,我们还可以发现让f=session_start来达到控制session的目的,这里还涉及到了session反序列化,大概提一下。

session反序列化
| session.save_handler            | session保存形式。默认为files        
| session.save_path               | session保存路径。                
| session.serialize_handler       | session序列化存储所用处理器。默认为php。   
| session.upload_progress.cleanup | 一旦读取了所有POST数据,立即清除进度信息。默认开启 
| session.upload_progress.enabled | 将上传文件的进度信息存在session中。默认开启。  

当 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:4:"|username”;},然后用php引擎反序列化时,|被当做分隔符,于是key值是a:1:{s:4:"name";s:4:" ,而username则被当做是value去做反序列化。
在知道session反序列化后我们就有思路了,控制session,让serialize_handler=php_serialize,name传入|你的序列化值,来达到我们的目的。 payload:
点击查看代码
<?php
$target='http://127.0.0.1/flag.php';
$b = new SoapClient(null,array('location' => $target,
    'user_agent' => "npfs\r\nCookie:PHPSESSID=123456\r\n",
    'uri' => "http://127.0.0.1/"));

$se = serialize($b);
echo "|".urlencode($se);

//注意下,这个脚本想要执行,需要将php.ini里的 php_soap.dll 前面的分号去掉

注意是要先将序列化值传进去,在通过call_user_func来调用SoapClient原生类来达到ssrf。

总结:

  1. session 反序列化

  2. SoapClient原生类的利用(ssrf)

  3. 变量覆盖与call_user_func

标签:LCTF,php,session,call,user,序列化,SoapClient
From: https://www.cnblogs.com/jocker-love-you/p/18252609

相关文章

  • 银行为什么要进行实名制?PHP身份证二三要素实名认证接口
    生活中,我们经常会遇到,在银行进行开卡需要携带身份证进行实名认证,如果预留在银行的信息不完善、身份信息过期等,均需要进行个人信息的重新更新,那么在银行办理业务为什么要进行实名制呢?又将如何通过PHP实现身份证实名认证接口的集成呢?银行账户实名制的原因:为了方便国家机构......
  • 浅拷贝、深拷贝与序列化【初级Java必需理解的概念】
    浅拷贝首先创建两个类,方便理解浅拷贝@DataclassStudentimplementsCloneable{//年龄和名字是基本属性privateintage;privateStringname;//书包是引用属性privateBagbag;publicStudent(intage,Stringname,Bagbag){this.......
  • PHP 程序员转 Go 语言的经历分享
    大家好,我是码农先森。之前有朋友让我分享从PHP转Go的经历,这次它来了。我主要从模仿、进阶、应用这三个方面来描述转Go的经历及心得。模仿是良好的开端,进阶是艰难的成长,应用是认知的提升。希望我的经历对大家能有所启发。模仿著名艺术家毕加索说过「模仿是人类一切学习的......
  • 【源码】2024最新陪诊小程序uniapp+thinkphp
    202024最新陪诊小程序uniapp+thinkphp资源来源:52codes.cc20最新陪诊小程序uniapp+thinkphp简介:随着社会逐渐步进入老龄化越来越多的老年人或者不经常去医院的用户对于医院繁琐的流程很是苦劳于是陪诊这个行业开始兴起。小白陪诊开发理念,为了满足用户就医陪......
  • [安洵杯 2019]easy_serialize_php1
    知识点:1.php代码审计       2.序列化与反序列化       3.键值对逃逸进入之后开始代码审计~<?php$function=@$_GET['f'];functionfilter($img){$filter_arr=array('php','flag','php5','php4','fl1g'......
  • PHP面试宝典之Laravel
    Laravel是一个流行的PHPWeb应用框架,以其优雅、简洁的代码风格和强大的功能而著称。如果你准备参加一个涉及Laravel的面试,以下是一些可能被问到的问题和概念,以及如何准备:Laravel的基本概念Laravel的核心特性:如MVC架构、ORM(Eloquent)、模板引擎(Blade)、路由系统等。生命周期......
  • PHP框架详解 - Symfony框架
    PHP框架详解-Symfony框架引言在当今快速发展的Web开发领域,PHP作为一种流行的服务器端脚本语言,一直以其简洁性和高效性受到开发者的青睐。随着Web应用的复杂性不断增加,PHP框架应运而生,为开发者提供了一套更加结构化和模块化的开发方式。在众多PHP框架中,Symfony以其强大的......
  • PHP用stomp对ActiveMQ连接
    在PHP中使用STOMP协议连接ActiveMQ,你可以使用Stomp-PHP库,这是一个实现了STOMP1.0和STOMP1.1协议的PHP客户端。以下是使用Stomp-PHP库连接到ActiveMQ的基本步骤:安装Stomp-PHP库:使用Composer来安装Stomp-PHP库。在你的项目目录中运行以下命令: composerrequirestomp......
  • PHP 变量:基础与应用
    在PHP编程中,变量是一个重要的概念,它允许我们存储和访问数据。变量是存储在内存中的值,这些值可以是数字、文本、布尔值等。在PHP中,变量通过$符号后跟变量名来声明。变量的声明与赋值在PHP中,变量不需要显式声明其类型,PHP会根据赋值的内容自动确定变量的类型。下面......
  • PHP EOF(Heredoc)使用说明
    在PHP编程中,heredoc(也称为EOF,但EOF只是一个常用的标识符,你可以使用任何唯一的标识符)是一种定义字符串的方法,它可以包含跨越多行的文本,且无需担心转义字符的问题。它特别适用于包含大量文本或HTML内容的字符串。什么是Heredoc?Heredoc是一种特殊的字符串字面量,允......