【网络安全/CTF】easyphp 江苏工匠杯

本题考察PHP语言相关绕过知识

正文

开门见山给代码

php 复制代码
 <?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;

$a = $_GET['a'];
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
    if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
        $key1 = 1;
        }else{
            die("Emmm...再想想");
        }
    }else{
    die("Emmm...");
}

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
        $d = array_search("DGGJ", $c["n"]);
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;
        }
        $key2 = 1;
    }else{
        die("no hack");
    }
}else{
    die("no");
}

if($key1 && $key2){
    include "Hgfks.php";
    echo "You're right"."\n";
    echo $flag;
}

?> Emmm...

考察代码分析能力,看最后一个if:

php 复制代码
if($key1 && $key2){
    include "Hgfks.php";
    echo "You're right"."\n";
    echo $flag;
}

也就是说,当key1、key2为1时即可文件包含Hgfks.php,那么接下来的思路就很简单了。

1.get传参a,满足isset($a) && intval($a) > 6000000 && strlen($a) <= 3,则a为2e9即可

2.get传参b,满足isset($b) && '8b184b' === substr(md5($b),-6,6),

substr(md5($b),-6,6)用于提取b经过 MD5 加密后的字符串的最后 6 个字符,也就是说这6个字符要等于8b184b,首先想到的是将8b184b进行md5解密,再赋值给b。而md5是不可逆算法,故此法失效。

php的强比较利用环境一般为:

复制代码
md5($a)===md5($b)

在这里也行不通

因此可以写一个脚本,通过遍历b并且做判断(这里判断b为纯数字)

故b为53724即可

3.再看参数c的要求:

php 复制代码
$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
        $d = array_search("DGGJ", $c["n"]);
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;
        }
        $key2 = 1;
    }

get传参经过json编码的c,且c为数组,数组c中的值m不是数字且m>2022;数组c中的值n为数组、数组n有两个元素且第一个元素也是数组。

对于m,当PHP中进行数字与字符的比较时,字符的前缀数字会被保留,即

复制代码
33<34php=34

所以将m赋为2023v即可,而对于n,即可写成n\[x,y]的形式

而

php 复制代码
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;

表示在n中查找为DGGJ的元素,找不到就终止脚本

利用当函数接入不符合类型,则返回0的特性,将n改为

复制代码
n[[x],0]

如果找到DGGJ,也终止脚本,将n中的数组改为任意不是DGGJ的元素即可:

复制代码
n[[1],0]

最后将c进行json编码即可

传参得到flag:

附言

在处理

c 复制代码
isset($b) && '8b184b' === substr(md5($b),-6,6)

时,可以使用PHP循环及Python脚本得到变量b,代码在:
【网络安全 | MD5截断比较】PHP、Python脚本利用 | CSDN秋说

相关推荐
程序员-Benothing9 小时前
Linux安全加固指南:账号、权限、服务、审计基线
linux·运维·安全
数据库安全14 小时前
AI数据访问安全 |如何控制AI访问权限,防止越权
数据库·安全
2501_9377671614 小时前
面向设计 / 研发部门:终端文件统一归档 + 服务器定时备份实践
运维·安全
珠海西格电力15 小时前
物联网(IoT)在零碳园区中的关键作用:万物互联与数据采集
大数据·人工智能·物联网·安全·系统架构·能源
安教安全员通关宝16 小时前
【证书管理】安全员 C 证延续:条件、时间窗口与各省口径对照
安全
网易易盾18 小时前
直播话术合规改造:六类违规表述判定与改写规则
大数据·人工智能·安全
dk_tjy18 小时前
迪康加密系统技术解析:驱动层透明加密的机制、策略与工程权衡
运维·安全·网络安全·终端安全管理·数据防泄漏
龙亘川18 小时前
城市公共安全治理如何从“人海战术“走向“数据驱动“?
大数据·数据库·人工智能·安全·microsoft·智慧城市·数据可视化
合尘猫18 小时前
给 AI 客服加权限边界:12 项自查清单与一次越权测试
人工智能·安全·llm
QYR_1120 小时前
憎水涂料市场分析:2032年全球规模将达46.49亿美元
网络·安全