BUUCTF [NewStarCTF] Week1 WEB NotPHP 详解

NotPHP

<?php
error_reporting(0);
highlight_file(__FILE__);
if(file_get_contents($_GET['data']) == "Welcome to CTF"){
    if(md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']){
        if(!is_numeric($_POST['num']) && intval($_POST['num']) == 2077){
            echo "Hack Me";
            eval("#".$_GET['cmd']);
        }else{
            die("Number error!");
        }
    }else{
        die("Wrong Key!");
    }
}else{
    die("Pass it!");
}

php代码审计。

  • 第一层要求将参数data所带的字符串为Welcome to CTF。

    用data://伪协议传入数据流绕过。

  • 第二层要求md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']

    MD5强比较,那么用数组绕过,md5()函数无法处理数组,如果传入的为数组,会返回NULL。== 弱比较可用科学计数法绕过。参考文章:(65条消息) 浅谈PHP中哈希比较缺陷问题及哈希强比较相关问题_末初mochu7的博客-CSDN博客

  • 第三层!is_numeric($_POST['num']) && intval($_POST['num']) == 2077

    is_numeric()判断是不是数字或数字字符串,intval() 函数用于获取变量的整数值,可以使用2077a,2077%00,2077%0a绕过

  • 第四层eval("#".$_GET['cmd']);

    .拼接字符串,#后的被注释了,可以用%0a换行绕过,或者?>闭合。

即可得到flag

posted @ 2022-10-11 10:28  DjkL  阅读(170)  评论(0编辑  收藏  举报