CTF_WEB题

WEB题目地址:http://ctf3.shiyanbar.com/web/good/index.php

<?php 
show_source(__FILE__); 
$a=0; 
$b=0; 
$c=0; 
$d=0; 
if (isset($_GET['x1'])) 
{ 
        $x1 = $_GET['x1']; 
        $x1=="1"?die("ha?"):NULL; 
        switch ($x1) 
        { 
        case 0: 
        case 1: 
                $a=1; 
                break; 
        } 
} 
$x2=(array)json_decode(@$_GET['x2']); 
if(is_array($x2)){ 
    is_numeric(@$x2["x21"])?die("ha?"):NULL; 
    if(@$x2["x21"]){ 
        ($x2["x21"]>2017)?$b=1:NULL; 
    } 
    if(is_array(@$x2["x22"])){ 
        if(count($x2["x22"])!==2 OR !is_array($x2["x22"][0])) die("ha?"); 
        $p = array_search("XIPU", $x2["x22"]); 
        $p===false?die("ha?"):NULL; 
        foreach($x2["x22"] as $key=>$val){ 
            $val==="XIPU"?die("ha?"):NULL; 
        } 
        $c=1; 
} 
} 
$x3 = $_GET['x3']; 
if ($x3 != '15562') { 
    if (strstr($x3, 'XIPU')) { 
        if (substr(md5($x3),8,16) == substr(md5('15562'),8,16)) { 
            $d=1; 
        } 
    } 
} 
if($a && $b && $c && $d){ 
    include "flag.php"; 
    echo $flag; 
} 
?>

题目要求传入三个参数x1,x2,x3;

首先看x1;

switch ($x1)
{
case 0:
case 1:
$a=1;
break;
}

switch语句只要不break,就会一直执行下去,所以X0时,a=1。

 

 

再看x2.

$x2=(array)json_decode(@$_GET[‘x2’]);
if(is_array($x2)){
is_numeric(@$x2[“x21”])?die(“ha?”):NULL;
if(@$x2[“x21”]){
($x2[“x21”]>2017)?$b=1:NULL;
}
if(is_array(@$x2[“x22”])){
if(count($x2[“x22”])!==2 OR !is_array($x2[“x22”][0])) die(“ha?”);
$p = array_search(“XIPU”, $x2[“x22”]);
$p===false?die(“ha?”):NULL;
foreach($x2[“x22″] as $key=>$val){
$val===”XIPU”?die(“ha?”):NULL;
}
$c=1;
}
}

 

 

x2要是数组,这里用php的json_encode()函数就可以简单转换。

 

X2中的“x21”项不能是数字,但是下面又要比2017大,这就要了解php数字和字符串的大小比较就可以了,只要前面包含比2017大的数就可以使得题目中的比较为true,那就随便选一个数字加多个a:2222a,

 

X2中的“x21”项要是包含两个项的数组,同时第一项要是一个数组,那就[1]吧

array_search(“XIPU”, $x2[“x22”]);
要求次函数返回为真,但是后面的代码要求每一项不包含XIPU,

arry_search()函数有个漏洞,当字符串不能找到时,会将他强制转化为整形再寻找,

运行intval(“XIPU”)的值为0,所以第二项为0;

 

于是x2= {“x21″:”2222a”,”x22″:[[1],0]}

 

X3是一个MD5局部碰撞,而且字符串中要包含XIPU,写个php脚本跑一下就行了

http://134.175.49.230:8888/test2.php

<?php

$t=substr(md5("15562"),8,16);

$i=15562;

while(1){

$flag="XIPU";

$flag.=$i;

$fmd5=substr(md5($flag),8,16);

if($fmd5==$t){

echo $flag."<br>";

echo $fmd5."<br>";

var_dump($fmd5==$t);

break;

}

$i++;

}

所以x3= XIPU18570

所以答案是http://ctf3.shiyanbar.com/web/good/index.php?x1=0&x2={%22×21%22:%222222a%22,%22×22%22:[[1],0]}&x3=XIPU18570

发表评论