今天,没事干,点进这个靶场。就是一个简单审计
贴出源码,分析下
<?php include 'flag.php'; $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}'; if(isset($_GET['gg'])&&isset($_GET['id'])) { $id=$_GET['id']; $gg=$_GET['gg']; if (md5($id) === md5($gg) && $id !== $gg) { echo 'You got the first step'; if(isset($_POST['passwd'])) { $passwd=$_POST['passwd']; if (!is_numeric($passwd)) { if($passwd==1234567) { echo 'Good Job!'; highlight_file('flag.php'); die('By Retr_0'); } else { echo "can you think twice??"; } } else{ echo 'You can not get it !'; } } else{ die('only one way to get the flag'); } } else { echo "You are not a real hacker!"; } } else{ die('Please input first'); } }Please input first
需要绕过的就是一个md5比较,md5函数不能处理数组,处理数组会报错,就会返回null,然后经过md5就相等了,传入的参数不同,gg和id的值就不同,
测试一下:
<?php if (md5([])===md5([])){ echo "相等"; }else{ echo "不相等"; } ?> //打印 相等
还有一个就是is_numeric()函数,它的作用就是判断参数是否为数字或者是字符串数字,如果不是则返回false。然后就是==的弱类型比较,我们需要进入里面的if语句,所以我们必须让is_numeric()函数返回为false
<?php
$b='1234567a';
var_dump(is_numeric($b)); //返回bool(false)
var_dump($b==1234567); //返回bool(true)
?>
且弱类型比较时还需要等于1234567 好绕过,php的弱类型比较 1234567a==1234567这两个肯定返回true
于是我们构造payload:get方式提交gg[]=111&id=222同时post传参passwd=1234567a
于是获得flag{fe9822ad-a24e-4f7c-8d41-e8e850ff0331}