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

相关推荐
G_whang19 分钟前
centos7 安装jenkins
运维·jenkins
Jiangnan_Cai36 分钟前
Linux 系统 docker 部署 Dify
linux·docker·大模型·dify
言之。1 小时前
借助ssh实现web服务的安全验证
运维·安全·ssh
Two_brushes.1 小时前
【linux网络】深入理解 TCP/UDP:从基础端口号到可靠传输机制全解析
linux·运维·服务器
FJW0208142 小时前
【Linux】系统引导修复
linux·运维·服务器
✧北辰٩(ˊωˋ*)و南冥✧2 小时前
nginx 负载均衡配置(加解决重复登录问题)
运维·nginx·负载均衡
慌糖2 小时前
CentOS 安装 Redis 简明指南
linux·redis·centos
设计师小聂!2 小时前
linux常用命令(一)
linux·运维·服务器
hnlucky2 小时前
《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》
java·linux·服务器·前端·nginx·tomcat·web
hnlucky2 小时前
同时部署两个不同版本的tomcat要如何配置环境变量
java·服务器·http·tomcat·web