CTF PHP代码审计 正则表达式 弱类型比较

一进来就是PHP正则表达式
在这里插入图片描述
这个比较难的地方在于正则表达式里面的符号代表什么含义,网上去找了下资料。
在这里插入图片描述
在有了上面那个的基础后就比较容易了,分段来说明。

if  ("POST" == $_SERVER['REQUEST_METHOD'])

需要用POST方式提交。

if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password))
    {
        echo 'Wrong Format';
        exit;
    }

这里只需要有连续12个以上的非控制字符就可以,比如空格tab等。

$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
     if (6 > preg_match_all($reg, $password, $arr))
            break;

这里有点难理解,这里指的是将$password分成连续的符号punct或者数字digit或者大写upper或者小写lower能分成6段以上即可。
在这里插入图片描述
这个函数也能分割出数组,只是有点小奇怪的是$arr这个变量没看到,可能是在flag.php里面有吧。。。
接着看下一段。

$ps = array('punct', 'digit', 'upper', 'lower');
        foreach ($ps as $pt)
        {
            if (preg_match("/[[:$pt:]]+/", $password))
                $c += 1;
        }
        if ($c < 3) break;

在密码里面至少要看到符号数字大写小写至少出现三种。

       if ("42"==intval($password)&&"42"!=$password) echo $flag;
        else echo 'Wrong password';
        exit;

这里就是典型的弱类型比较了,只要满足上面的要求即可,随便测试了下42.Hell0World!就可以了。
在这里插入图片描述
在这里插入图片描述
成功拿到flag,这里多说一下,不是非得用科学计数法才行,我看所有的writeup里面都写的42.0000000e+1这种。。。

发布了265 篇原创文章 · 获赞 266 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u014029795/article/details/105032422