-
-
[原创]跟着crownless学Web之(2)calc2
-
发表于:
2019-1-22 16:27
7529
-
[原创]跟着crownless学Web之(2)calc2
本文备份于我的博客
大家好,我是Web安全板块的新版主crownless。最近我将以CTF赛题讲解的形式介绍一系列的Web基础知识,讲解的顺序将是循序渐进,因此不需要读者有任何基础知识。希望能吸引更多人关注看雪的Web安全板块,为板块增加人气和活力。
如果你还没有阅读第一篇教程,建议你先阅读第一篇教程再阅读本文。
在这篇文章中,你将学到:
话不多说,让我们开始吧。首先打开这次的CTF赛题网站:http://139.224.220.67:30008/
你会看到如下php代码:
可以看到,这次的源代码和上一个教程中的源代码基本一致,不过多出了如下部分:
这里strpos的作用是“查找字符串首次出现的位置”。die的作用是立即停止该php后端的运行。那么很明显,这是一种过滤。当str
中包含#
时,php后端将立即停止运行。所以上一篇教程中提到的用#
来注释掉| bc
的方法不再可用。
首先,我们不知道flag在哪里,所以一定要用ls
来列出目录。所以,我们的payload必须包含; ls;
。既然无法注释掉| bc
,那么我们可以传一个空字符串给管道,所以我们的payload可以是; ls; echo
。提交后,我们发现有一个名叫flag
的文件。所以接下来我们要打印这个文件的内容。但是问题来了,如果我们发送; cat flag; echo
这个payload,那么过滤代码就会立即检测到有flag
字符串,从而触发die
。有没有办法绕过这个限制呢?
这里又要涉及到shell的一些技巧。当你使用通配符*
时,就可以绕过这个限制。具体原理可以参考这里。所以我们可以发送; cat f*; echo
这个payload,因为目录下只有一个以f开头的文件flag,所以就相当于执行了; cat flag; echo
,至此,我们学会了一些基本的绕过过滤的技巧。
<center>
<h2>calc</h2>
<?php
$str="";
if(!empty($_GET)){
$str=$_GET["calc"];
if(strpos($str,"#")!==false)
die;
if(strpos($str,"`")!==false)
die;
if(strpos($str,"flag")!==false)
die;
}
?>
<form action="./index.php">
input: <input type="text" name="calc" value="<?php echo $str;?>">
<input type="submit" value="Submit">
</form>
<?php
echo "result:".shell_exec("echo $str | bc");
?>
</center>
<?php
show_source(__FILE__);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-1-22 16:27
被crownless编辑
,原因: