攻防世界easyphp

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;
}

?> 

a:

if(isset(a) && intval(a) > 6000000 && strlen($a) <= 3)

  • 这一行检查变量$a是否已设置(即不是nullundefined),并且其整数值大于6000000,同时其字符串长度不超过3个字符。
  • isset($a)检查$a是否已设置。
  • intval($a) > 6000000$a转换为整数并检查其是否大于6000000。
  • strlen($a) <= 3检查$a的字符串长度是否不超过3个字符。

使用科学计数法 例:1e9

b:

if(isset(b) && '8b184b' === substr(md5(b),-6,6))

  • 如果第一个条件满足(即$a满足条件),则进一步检查变量$b
  • isset($b)检查$b是否已设置。
  • '8b184b' === substr(md5($b),-6,6)检查变量$b经过MD5哈希后的字符串的最后6个字符是否等于'8b184b'

写一个python脚本

python 复制代码
import hashlib
for i in range(100000):
    b=i.to_bytes(22, 'big')
    m=hashlib.md5(str(i).encode()).hexdigest()
    if(m[-6:]=="8b184b"):
        print(i)
        print(" ")
        print(m)

得到: 53724

dbab43dabe09e16edf25ac77798b184b

c:

  1. 接收并解码JSON数据 :

    |---|---------------------------------------|
    | | $c=(array)json_decode(@$_GET['c']); |

    • $_GET['c']: 从GET请求中获取名为c的参数值。
    • @: 错误控制运算符,用于抑制错误信息(例如,如果$_GET['c']不存在,json_decode会产生一个警告,@会抑制这个警告)。
    • json_decode(...): 将JSON格式的字符串解码为PHP变量。这里指定了第二个参数为false(通过(array)强制转换实现,因为json_decode默认将对象转换为关联数组需要设置第二个参数为true,但这里通过强制转换实现了类似效果),意味着如果JSON解码后是一个对象,它会被转换成关联数组。
  2. 检查解码后的数据 :

    |---|----------------------------------------------------------------|
    | | if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){ |

    • is_array($c): 检查$c是否为数组。
    • !is_numeric(@$c["m"]): 检查$c数组中的m键对应的值是否不是数字(即,它是一个字符串或其他非数字类型)。
    • $c["m"] > 2022: 检查$c数组中的m键对应的值是否大于2022。
  3. 进一步检查n键对应的值 :

    |---|--------------------------------------------------------------------------|
    | | if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){ |

    • is_array(@$c["n"]): 检查$c数组中的n键对应的值是否为数组。
    • count($c["n"]) == 2: 检查n数组的长度是否为2。
    • is_array($c["n"][0]): 检查n数组的第一个元素是否为数组。
  4. 搜索和条件判断 :

    |---|---------------------------------------|
    | | $d = array_search("DGGJ", $c["n"]); |
    | | $d === false?die("no..."):NULL; |
    | | foreach($c["n"] as $key=>$val){ |
    | | $val==="DGGJ"?die("no......"):NULL; |
    | | } |

    • array_search("DGGJ", $c["n"]): 在n数组中搜索值"DGGJ",返回其键。如果未找到,返回false
    • $d === false?die("no..."):NULL;: 如果DGGJ不在n数组中,脚本终止并输出"no..."
    • foreach($c["n"] as $key=>$val): 遍历n数组的每个元素。
    • $val==="DGGJ"?die("no......"):NULL;: 如果遍历过程中发现值为"DGGJ",脚本终止并输出"no......"

利用php弱类型的特性:字符串与数字比大小时只取字符串前面的数字,如果不是数字开头则当成是0

2023a>2022

[[]0,1],0]

构造url:........?a=1e9&b=53724&c={"m":"2023a","n":[[0,1],0]}

得到flag

相关推荐
人类群星闪耀时27 分钟前
大模型技术优化负载均衡:AI驱动的智能化运维
运维·人工智能·负载均衡
新手上路狂踩坑40 分钟前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox
新时代农民工--小明1 小时前
前端自动化部署更新,自动化打包部署
运维·前端·自动化
一个不秃头的 程序员2 小时前
服务器上加入SFTP------(小白篇 1)
运维·服务器
fnd_LN2 小时前
Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
linux·运维·服务器
MorleyOlsen2 小时前
【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
运维·服务器·深度学习
周周的奇妙编程2 小时前
基于鲲鹏服务器的打砖块小游戏部署
运维·服务器
OopspoO2 小时前
Linux查看键鼠输入
linux
大熊程序猿2 小时前
airflow docker 安装
运维·docker·容器
从后端到QT2 小时前
boost asio 异步服务器
服务器·网络·tcp/ip