Suctf

1.Guess Next Session

提示说要写Python的一个算法就可以解出来,但是做的时候好像没这么麻烦。

按代码的意思,传入一个password参数,然后password的session和password相等就可以,这道题的正解是随机数,随机生成一些数然后判断和session是否相等,但是我在做这道题的时候第一想到的是password可以随意填写,session也可以随意修改,那么直接构造二者相等应该也可以。

把他们都清空。

答案:flag:CTF{Cl3ar_th3_S3ss1on}

2.FALSE

<?php
if (isset($_GET['name']) and isset($_GET['password'])) {
    if ($_GET['name'] == $_GET['password'])
        echo '<p>Your password can not be your name!</p>';
    else if (sha1($_GET['name']) === sha1($_GET['password']))
      die('Flag: '.$flag);
    else
        echo '<p>Invalid password.</p>';
}
else{
    echo '<p>Login first!</p>';
?>

SHA1加密算法,当SHA1加密遇到数组时,会自动加密为NULL,因此构造name[]=1&password[]=2

答案:CTF{t3st_th3_Sha1}

3.once more

<?php
if (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
    {
        echo '<p>You password must be alphanumeric</p>';
    }
    else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
    {
        if (strpos ($_GET['password'], '*-*') !== FALSE)
        {
            die('Flag: ' . $flag);
        }
        else
        {
            echo('<p>*-* have not been found</p>');
        }
    }
    else
    {
        echo '<p>Invalid password</p>';
    }
}
?>

第一种做法,按条件构造password,这里要求pwd长度小于8,但是pwd数值大于10000000,因此可以用科学计数法+字符截断,构造pwd=1e9%00*-*,另一种解法利用数组绕过。

pwd[]=%00*-*  传给pwd数组一个空值,因为如果不给数组赋值,数组就会是任意值,可以绕过对于数值大小的判断。

Flag: CTF{Ch3ck_anD_Ch3ck}

4.找回密码

进入之后是一个输入框,随便试了几个字符,发现输入一个格式错误的email也可以,而且提示发送到了step2.php。

查看step2的代码。

又找到了submit的表单。

submit只有一行提示,因此这道题的切入点就很明确了,得到管理员登陆的方式。

之后进入submit.php的附加文件中/.submit.php.swp

 这里涉及两个参数token和emailAddress,对于Token的要求,token需要等于0长度还需要等于10 因此token=0e11111111,emailAddress在之前的代码中已经给出了提示,

最后URL:token=0e11111111&[email protected]

 flag is SimCTF{huachuan_TdsWX}

5.天网管理系统

最后一道题,难度不小。

查看代码

意思是username经过md5加密需要等于0,因此找一些字符串加密后以0开头的都可以,例如0abcdefg类似这样的

py随机生成的一个240610708,填写到用户名位置。

 访问一个这个文件。

$unserialize_str = $_POST['password']; 
$data_unserialize = unserialize($unserialize_str); 
if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???')
{ print_r($flag); }

代码意思是把post提交的password值经过"反序列化"得到一个数组,要求数组里的user和pass都等于某个值时就打印flag。

根据后面那句话的提示,可以想到bool中有一个重要的性质,bool中的true值和任意字符串在弱类型判断上可以认定为相等。通俗来讲 '1234a' 这个字符串在弱类型比较中可以认定为1234 即'1234a'=1234

当然 ’0e' = 0,因此可以构造bool类型的序列化数据 ,无论比较的值是什么,结果都为true,

password=a:2:{s:4:"user";b:1;s:4:"pass";b:1}

a:array数组 s:string字符 b:bool 布尔函数

CTF中的题一向都很灵活多变,脑洞大,有时候要顺着出题者思路解题,有时候还要跳出出题者的思路,灵活结题的前题是对于任何基本常识操作都驾轻就熟,例如第四题,给出了一句话action=vim,事实上这句话想表明,这段代码是用vim编辑器写的,vim编辑器的特点就是无论执行任何一段代码,执行的同时都会在本地生成一个.swp文件,只有访问swp文件才可以看到真实的代码,还有php反序列化的构造,构造的前提一定是要懂得序列化的原理。还有一些数组绕过,也叫做MD5碰撞。

      

猜你喜欢

转载自www.cnblogs.com/sylover/p/10652695.html