跟着crownless学Web之(2)calc2
戳下文链接,即可阅读 :
本文是由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