[极客大挑战 2020]Greatphp 原生类绕过

本文详细讲述了作者如何利用PHP的`__wakeup`函数中的反序列化漏洞,通过构造payload绕过MD5和SHA1校验,并巧妙地利用原生类Error进行代码执行。重点讨论了包括数组技巧、eval函数限制和包括文件路径的编码策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
error_reporting(0);
class SYCLOVER {
    public $syc;
    public $lover;

    public function __wakeup(){
        if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
           if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
               eval($this->syc);
           } else {
               die("Try Hard !!");
           }
           
        }
    }
}

if (isset($_GET['great'])){
    unserialize($_GET['great']);
} else {
    highlight_file(__FILE__);
}

?>

扫了一眼,反序列化的wakeup利用,里面的if语句很简单,利用数组绕过就行了,syc属性会经过一次正则表达式

preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)

那我们先试试传入最基础的php代码试一试

 发现成功的绕过了正则输出了自己设的代码echo flag,但是eval函数执行不了,难道是数组的原因么,独立做一个程序试试

发现eval函数无法只能数组的php语句,这里就陷入为难了,一方面要利用数组绕过md5和sha1的强比较,但是我们构造的payload无法执行,看来超出我的知识储备了,找找资料去浅析PHP原生类 - 百度文库

又考到了原生类,这里利用的是Error类,当当作字符串的时候会触发toString函数导致XSSPHP原生类的利用_长球的鱼的博客-优快云博客

利用原生类错误代码的不显现来绕过两个参数的不同,这里可以看到报错了行数,因此要把两个代码放在同一行上 

可以看到报错信息一样,因此可以绕过md5和sha1了 

绕过成功,现在要想怎么构造payload了,因为过滤了( )  ‘  “啥的, 这里就用到网上wp的include函数吧,第一次直到可以不用打括号php中return,require,include加括号和不加括号的区别 - 百度文库

我们可以用 include /flag来读取flag(因为我感觉日常不是注入的话不会为难你题目文件,一般都是flag.php或者/flag,其实就是自己懒了,不想写脚本跑不可见字符来跑显示目录的命令) 

习惯好记得urlencode编码一下,避免一些不注意的不可见字符导致失败,url编码后直接上传就行

但其实我有点想不通的是为什么不直接include /flag,它又不需要引号,也没有过滤一些东西,但是实践出来是打不开这个文件,很疑惑

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值