攻防世界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

相关推荐
chennalC#c.h.JA Ptho10 分钟前
Bodhi linux 系统详解
linux·经验分享·笔记·系统架构·系统安全
monstercl11 分钟前
游戏资源传输服务器
运维·服务器·游戏
运维开发王义杰17 分钟前
PAC文件:智能代理配置的瑞士军刀
运维
网硕互联的小客服25 分钟前
服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?
运维·服务器
QX_hao40 分钟前
【docker】--镜像管理
运维·docker·容器
敲上瘾43 分钟前
MySQL数据库表的约束
linux·数据库·sql·mysql·数据库开发·数据库架构·数据库系统
u0109362651 小时前
Linux电源管理(五),发热管理(thermal),温度控制 (结合设备树 和ACPI Source Language(ASL)分析)
linux
GreatNXY1 小时前
【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法
服务器·阿里云·云计算
itachi-uchiha1 小时前
Linux上的rm和srm 命令
linux·运维·服务器
快乐肚皮1 小时前
深入解析Docker:核心架构与最佳实践
java·运维·docker·容器