[GDOUCTF 2023]受不了一点 0x00
这个就是代码审计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <?php error_reporting (0 );header ("Content-type:text/html;charset=utf-8" );if (isset ($_POST ['gdou' ]) && isset ($_POST ['ctf' ])) { $b = $_POST ['ctf' ]; $a = $_POST ['gdou' ]; if ($_POST ['gdou' ] != $_POST ['ctf' ] && md5 ($a ) === md5 ($b )) { if (isset ($_COOKIE ['cookie' ])) { if ($_COOKIE ['cookie' ] == 'j0k3r' ) { if (isset ($_GET ['aaa' ]) && isset ($_GET ['bbb' ])) { $aaa = $_GET ['aaa' ]; $bbb = $_GET ['bbb' ]; if ($aaa == 114514 && $bbb == 114514 && $aaa != $bbb ) { $give = 'cancanwordflag' ; $get = 'hacker!' ; if (isset ($_GET ['flag' ]) && isset ($_POST ['flag' ])) { die ($give ); } if ($_POST ['flag' ] === 'flag' || $_GET ['flag' ] === 'flag' ) { die ($get ); } foreach ($_POST as $key => $value ) { $$key = $value ; } foreach ($_GET as $key => $value ) { $$key = $$value ; } echo $flag ; } else { echo "洗洗睡吧" ; } } else { echo "行不行啊细狗" ; } } } else { echo '菜菜' ; } } else { echo "就这?" ; } } else { echo "别来沾边" ; }
0x01
这个地方只需要进行数组绕过就可以了
设置cookie
两个等号这个是弱比较
php比较绕过(强比较“===”/弱比较“==“)-CSDN博客
这个地方只需要设置一个flag,而且这个部分并没有对其他的参数进行过滤,我们只需要将其他参数设置成flag然后Falg使用这个参数就可以了
[鹤城杯 2021]Middle magic 0x00
运用的知识点
换行符的url编码为 %0a
空格的编码为 %20
正则匹配
0x01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <?php highlight_file (__FILE__ );include "./flag.php" ;include "./result.php" ;if (isset ($_GET ['aaa' ]) && strlen ($_GET ['aaa' ]) < 20 ){ $aaa = preg_replace ('/^(.*)level(.*)$/' , '${1}<!-- filtered -->${2}' , $_GET ['aaa' ]); if (preg_match ('/pass_the_level_1#/' , $aaa )){ echo "here is level 2" ; if (isset ($_POST ['admin' ]) and isset ($_POST ['root_pwd' ])) { if ($_POST ['admin' ] == $_POST ['root_pwd' ]) echo '<p>The level 2 can not pass!</p>' ; else if (sha1 ($_POST ['admin' ]) === sha1 ($_POST ['root_pwd' ])){ echo "here is level 3,do you kown how to overcome it?" ; if (isset ($_POST ['level_3' ])) { $level_3 = json_decode ($_POST ['level_3' ]); if ($level_3 ->result == $result ) { echo "success:" .$flag ; } else { echo "you never beat me!" ; } } else { echo "out" ; } } else { die ("no" ); } } else { echo '<p>out!</p>' ; } } else { echo 'nonono!' ; } echo '<hr>' ; }?> nonono!
话不多说了我们来看看第一关说了个啥
他的意思就是说aaa最后是字符串pass_the_level_1#
但是上面他又会以level为界限分为两个部分,但是请注意
他只会匹配一行,这个函数我们如果没有的匹配的话就会直接使用get传入的aaa
来做一个实验
发现可行,直接执行
最后还要将#
编码一下,因为这个是url里锚点
0x02
我们继续来看
这个是一个弱比较
本身不一样,但是值一样
直接使用数组绕过
0x03
直接看这个的意思就是说
json解密之后,然后一个弱比较
PHP: PHP 类型比较表 - Manual
就一个一个尝试
发现不需要填写就可以绕过了
也就是值为null