Suctf
Posted sylover
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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碰撞。
以上是关于Suctf的主要内容,如果未能解决你的问题,请参考以下文章