跟着谁学php,跟着crownless学Web之(2)calc2

原标题:跟着crownless学Web之(2)calc2

戳下文链接,即可阅读 :

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

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

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

php die函数;

php strpos函数;

一些绕过过滤的技巧。

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

http://139.224.220.67:30008/

你会看到如下php代码:

calc

$str="";

if(!empty($_GET)){

$str=$_GET["calc"];

if(strpos($str,"#")!==false)

die;

if(strpos($str,"`")!==false)

die;

if(strpos($str,"flag")!==false)

die;

}

?>

input: ">

echo"result:".shell_exec("echo $str | bc");

?>

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

320a71805ffb74ec7db7563f61be2b84.png

作者:周信安

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

个人博客地址:

https://zhouxinan.github.io

- End -

看雪ID:crownless

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

本文由看雪论坛crownless原创

转载请注明来自看雪社区

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值