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

相关推荐
藥瓿锻7 分钟前
2024 CKA题库+详尽解析| 15、备份还原Etcd
linux·运维·数据库·docker·容器·kubernetes·cka
bbsh209916 分钟前
WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤
linux·ubuntu·.netcore·webfuture
太阳之神aboluo23 分钟前
压测软件-Jmeter
java·运维·jmeter
ZZZKKKRTSAE25 分钟前
快速上手Linux全局搜索正则表达式(grep)
linux·服务器·正则表达式
有谁看见我的剑了?26 分钟前
stress 服务器压力测试的工具学习
服务器·学习·压力测试
有谁看见我的剑了?27 分钟前
stress-ng 服务器压力测试的工具学习
服务器·学习·压力测试
余厌厌厌1 小时前
go语言学习 第9章:映射(Map)
服务器·学习·golang
waving-black1 小时前
利用frp和腾讯云服务器将内网暴露至外网(内网穿透)
linux·服务器·腾讯云·frp·内网穿透
stormsha2 小时前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
新加坡内哥谈技术2 小时前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化