WEB攻防- PHP反序列化&属性权限特征&原生类 TIPS&字符串逃逸&CVE 绕过漏洞

目录

PHP-属性权限特征-共有&私有&保护

PHP-绕过漏洞-CVE&字符串逃逸

PHP-原生类获取&利用&配合

原生类利用简单案例Demo-XSS


PHP-属性权限特征-共有&私有&保护

1、对象变量权限:

public(公共的):在本类内部、外部类、子类都可以访问

protect(受保护的):只有本类或子类或父类中可以访问

private(私人的):只有本类内部可以使用

2、序列化数据显示:

public 属性序列化的时候格式是正常成员名

private 属性序列化的时候格式是%00 类名%00 成员名

protect 属性序列化的时候格式是%00*%00 成员名

%00代表 NULL 字节,下面代码为了直观显示,使用var_export函数进行转义显示未\0

PHP-绕过漏洞-CVE-2016-7124

1、CVE-2016-7124(__wakeup 绕过)

漏洞编号:CVE-2016-7124

影响版本:PHP 5<5.6.25; PHP 7<7.0.10

漏洞危害:如存在__wakeup 方法,调用 unserilize()方法前则先调用__wakeup 方

法,但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup 执行

php 复制代码
<?php
header("Content-type: text/html; charset=utf-8");
//public private protected 说明
class test{
    public $name;
    private $age;
    protected $sex;

    public function __construct($name,$age,$sex){
        echo "__construct被调用\n";
    }

    public function __wakeup(){
        echo '反序列化时__wakeup被执行!!!';
    }
}

unserialize($_GET['x']);

正常情况下在反序列化时,__weakeup被调用

但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup 执行

测试使用的php版本在漏洞范围内

案例:

极客大挑战 2019\]PHP ![](https://i-blog.csdnimg.cn/direct/d912834d2a8047b9a8b372a7f3ccd096.png) 1、下载源码www.zip分析,触发 flag 条件 ![](https://i-blog.csdnimg.cn/direct/3f4140c6d46441c6b5b10677e48d281a.png) ![](https://i-blog.csdnimg.cn/direct/5a4c442cec1141f3a466fc2b05caf909.png) 2、从代码上看,需要username=admin才能输出flag,但是由于反序列化必然会执行__wakeup 强制改变 username 值,且通过传入select参数反序列化 ![](https://i-blog.csdnimg.cn/direct/439fb407d12f49a797a7e62e077be71d.png) 3、利用语言漏洞绕过 CVE-2016-7124,随便传入一个值可以看到php版本在漏洞范围内 ![](https://i-blog.csdnimg.cn/direct/3d220799783b411eb4b11c1f0b4e323d.png) 4、构造 payload 后 修改满足漏洞条件触发 payload:O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";} 注意改变属性个数![](https://i-blog.csdnimg.cn/direct/2e87c8d35806458f986f71c4f9a0f35d.png) ## PHP-原生类获取\&利用\&配合 原生类(Native class)是指在编程语言的核心库或标准库中提供的类,这些类是语言本身提供的,而不是由用户自定义的类。原生类通常包含语言内置的功能和特性,用于解决常见的编程任务和操作。 PHP原生类使用场景:在代码中没有看到魔术方法的情况下使用的,如果对方环境没有开启相关模块功能,那么是没用的。 使用脚本在本地生成原生类,需要再php.ini文件中尽可能打开多的模块,这样可以生成更多可利用的原生类。代码如下: ```php ``` 思路: 1.先看能触发的魔术方法-echo能够触发__toString方法 2.代码中没写魔术方法调用逻辑,那就需要用到原生类 3.使用魔术方法的原生类去利用 4.获取魔术方法的原生类(使用脚本去生成,生成多少与当前环境模块开关有关 默认的原生类生成脚本有太多原生类和方法了,这里只保留__toString方法,生成其有的原生类) ![](https://i-blog.csdnimg.cn/direct/7bee52f9caeb48818235f8ad8feeb750.png) 创建一个异常对象,并序列化 ```php alert('xiaodi')"); echo urlencode(serialize($a)); ?> ``` ![](https://i-blog.csdnimg.cn/direct/16650175306442969882e872f0916ca3.png) ![](https://i-blog.csdnimg.cn/direct/2347b27f13b64a12abde30b488bd45e1.png) 代码中echo一个反序列化的对象,是会异常的,php中对象不能转换为字符串,故而形成了pop链。 创建异常对象(产生异常返回xss代码) -\> 传入序列化后的异常对象 -\> echo 反序列化得到异常对象 -\> 对象不能转字符串(异常返回xss代码) -\> echo触发toString将返回的xss代码输出被浏览器渲染

相关推荐
欣然~10 分钟前
基于蒙特卡洛方法的网格世界求解
开发语言·python·信息可视化
海晨忆14 分钟前
JS—事件委托:3分钟掌握事件委托
开发语言·javascript·ecmascript·事件委托·事件冒泡
froxy33 分钟前
C++11 引入了的新特性与实例说明
开发语言·c++
珹洺34 分钟前
Java-servlet(七)详细讲解Servlet注解
java·服务器·开发语言·hive·servlet·html
珊瑚里的鱼38 分钟前
第一讲 | 解锁C++编程能力:基础语法解析
开发语言·c++·笔记·visualstudio·学习方法·visual studio
goTsHgo1 小时前
完整的类在JVM中的生命周期详解
java·开发语言·算法
大模型铲屎官1 小时前
玩转C#函数:参数、返回值与游戏中的攻击逻辑封装
开发语言·游戏·c#·编程·参数·函数·返回值
车载测试工程师1 小时前
车载以太网网络测试-17【传输层-TCP】
网络·经验分享·网络协议·tcp/ip·php
进击的_鹏2 小时前
【C++】多态
开发语言·c++
不是伍壹2 小时前
【R语言】使用ALDEx2对微生物组进行差异分析
开发语言·r语言