首页 > 编程语言 >[攻防世界][江苏工匠杯]easyphp

[攻防世界][江苏工匠杯]easyphp

时间:2022-12-18 12:34:29浏览次数:35  
标签:攻防 数字 die 工匠 json 字符串 easyphp array 2023a

打开靶机url,上来就代码审计
<?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...
easyphp 不easy

从代码上看 必须 key1key2都为true 或者都为 1 才能回显 flag

  1. 先看key1 = 1 的条件
1. 首先需要字符串a转为整型后 > 6000000,且a字符串的长度要小于等于3
通过科学计数法绕过 a = 1e9     (1e9 = 1000000000)

2. 要求b 的md5值后六位为 8b184b
只能通过撞库得到,编写撞库脚本
<?php
for ($i = 1; $i < 100000; $i++) {
     if('8b184b' === substr(md5($i),-6,6)){
         echo($i);
     }
}
?>
得到b的值为53724,这里只能是猜测b和a一样是数字字符串,否则很难撞出来,只能说是解题思路吧,撞不出来就有点无解了,或者说有md5字典库去搜索吧

这里就知道 a=1e9, b = 53724
2. 再看key2=1的条件

1.c 必须是一个json字符串,并可以json_decode转化为array
2. 这个json里有一个key是m,且m 传入is_numeric返回false,且m对应的value大于2022
从这里可以看出,必然是要考察绕过is_numeric的检查

知识点:
基础知识:
数字字符串: 如: '123456', '1e123', '123.4'
数字字符串在与数字或者前导数字字符串比较时会转化为数字进行比较

前导数字字符串   如:  '1234abcd', '1e123abcd', '123.4abcd'
前导数字字符串在与数字进行比较,且是弱类型比较时才会转化为数字进行比较,两个前导字符串比较不会转化为数字

其他字符串 如: 'abcd' 'abcd1234'
对于其他字符串,在与数字进行弱类型比较时会转化为数字,但只能转化为0

is_numberic()函数绕过
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。

2.1 那么绕过is_number 只要是一个前导字符串就可以了,比如:m => '2023a'   (== > < 都是弱类型比较)

3. json里有一个key是 n,n是一个数组,长度为2,n的第一个元素也是数组
3.1 这里又有一个奇怪的逻辑:数组中有一个字符串是 "DGGJ", 同时下一行如果数组中有值是'DGGJ',就返回die,不给flag了
说明这里在考察字符串比较绕过
考点:此处利用array_search函数在比较两者是否相等时是使用的弱类型比较
其他字符串在与数字比较的时候会转为0,那么传入是0 的话 0==0 就会返回true
所以 n => [array(1,2), 0]

那么到这里 m,n 对应的值就都知道了,构造代码
<?php
$a = array('m' => '2023a', 'n' => array(array(1,2), 0));
var_dump($a);
echo json_encode($a);
?>

执行得到:
array(2) {
  ["m"]=>
  string(5) "2023a"
  ["n"]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      int(1)
      [1]=>
      int(2)
    }
    [1]=>
    int(0)
  }
}

{"m":"2023a","n":[[1,2],0]}
构造url
http://61.147.171.105:56947?a=1e9&b=53724&c={"m":"2023a","n":[[1,2],0]}

boom 得到flag cyberpeace{ce51bcd2ab60cd08a6c842b94aae1e77}

标签:攻防,数字,die,工匠,json,字符串,easyphp,array,2023a
From: https://www.cnblogs.com/gradyblog/p/16990173.html

相关文章

  • [攻防世界][江苏工匠杯]unseping
    打开靶机对应的url上来就是代码审计<?phphighlight_file(__FILE__);classease{private$method;private$args;function__construct($method,......
  • [攻防世界][Web]ics-06
    打开靶机对应的url,展开是一个网站的样子,其实啥也么有所有tab都点一遍,发现只有报表中心有内容,url为http://61.147.171.105:49797/index.php?id=1猜测这里是题眼,使用burp......
  • [攻防世界][Web]PHP2
    打开靶机对应的url就一行字Canyouanthenticatetothiswebsite?第一感觉就需要做目录文件扫描使用御剑和dirsearch进行扫描,发现一个文件index.phps知识点:phps......
  • 城市消费券之地理位置攻防
    近期,顶象发布了《城市消费券安全调研报告》(以下简称《调研报告》)。《调研报告》从城市消费券的发放规模、核销情况、风险出发,进一步分析除了黑灰产的作弊手段以及作弊工具......
  • 攻防世界-easyphp(前导数字字符串、数字字符串、数字弱类型比较)
    一道php代码审计题,利用了字符与数字弱类型比较的漏洞。 一、基础知识数字字符串形如数字形式的字符串叫做数字字符串,例如:'123456','1e56112'(科学计数法),'1......
  • 攻防世界-unseping(序列化,Bash shell)
    这是一道序列化的题目,结合了LinuxBashshell知识一、基础知识点序列化  序列化的概念:  序列化(Serialization)是将对象的状态信息转换为可以......
  • 信息安全之网络安全-windows系统基础知识DHCP服务器原理、部署和攻防
    DHCP服务器原理、部署和攻防0引言1DHCP概述2原理2.1DHCP原理☆☆☆2.2续约原理3部署DHCP服务器——以Windows为例3.1前言3.2部署DHCP服务器3.3地址租期3.4保留特......
  • 保障业务安全,如何做到“未知攻,焉知防” 安全防护中的“未知攻,焉知防”是什么意思 “未
    保障业务安全,如何做到“未知攻,焉知防”安全防护中的“未知攻,焉知防”是什么意思“未知攻,焉知防”,业务安全的攻防之道2013年秋天的一次网络安全大会上,知名网络安全专家于......
  • 网络安全攻防之缓冲区溢出攻击
    什么是缓冲区溢出?缓冲区溢出是一种异常现象,当软件向缓冲区中写入数据使缓冲区容量溢出时,会导致相邻存储器位置被覆盖。换句话说,过量的信息被传递到没有足够空间的容器中,而这......
  • 攻防世界-fileinclude
    一道简单的文件包含题目,源代码如下 一、代码分析此题中关键代码为  分析此处代码可知,$lan的值是cookie中language所对应的值,当该值不为english时,会将$lan的值与.p......