查看原文
其他

跟着crownless学Web之(2)calc2

crownless 看雪学院 2019-05-25


戳下文链接,即可阅读 :


跟着crownless学Web之(1)神奇的计算器


本文是由Web安全版块的新版主crownless原创讲解【神奇的计算器】的第二部分。(建议先了解第一部分)


在这篇文章中,你将学到:

  • php die函数;

  • php strpos函数;

  • 一些绕过过滤的技巧。



话不多说,让我们开始吧。首先打开这次的CTF赛题网站:

http://139.224.220.67:30008/


你会看到如下php代码:

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


可以看到,这次的源代码和上一个教程中的源代码基本一致,不过多出了如下部分:

if(strpos($str,"#")!==false)
   die;
if(strpos($str,"`")!==false)
   die;
if(strpos($str,"flag")!==false)
   die;


这里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,至此,我们学会了一些基本的绕过过滤的技巧。



作者:周信安


看雪ID: crownless,毕业于复旦大学软件工程专业,看雪WEB安全版块 新版主,研究方向为WEB安全、Android、系统安全。


个人博客地址:

https://zhouxinan.github.io





- End -


看雪ID:crownless               

https://bbs.pediy.com/user-833800.htm


本文由看雪论坛 crownless 原创

转载请注明来自看雪社区



热门图书推荐:

立即购买!



(点击图片即可进入)



热门技术文章:        





公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com


点击下方“阅读原文”

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存