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代码输出被浏览器渲染

相关推荐
用户962377954482 小时前
CTF 伪协议
php
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1236 天前
matlab画图工具
开发语言·matlab