首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在尝试远程代码执行时,为什么这个php webshell代码在单引号上失败?

在尝试远程代码执行时,为什么这个php webshell代码在单引号上失败?
EN

Security用户
提问于 2021-07-20 16:39:31
回答 1查看 464关注 0票数 0

在处理易受攻击的框时,我在数据库表中找到了一个字段,可以在其中插入php代码。基于这一利用:

https://www.exploit-db.com/exploits/24044

我试图使用这段代码创建一个php webshell:

代码语言:javascript
复制
?php $cmd=$_GET['cmd'];system($cmd);?

它失败了(结果是死亡的白色屏幕)。但是,如果我将单引号更改为双引号,它就会工作,如下所示:

代码语言:javascript
复制
?php $cmd=$_GET["cmd"];system($cmd);?

我所看到的webshell代码的每一个源代码都围绕着cmd有单引号,不管它是哪一种变体,而且它们都没有提到它需要双引号的可能性。下面是一个页面的示例,其中概述了如何做到这一点:

https://vulp3cula.gitbook.io/hackers-grimoire/exploitation/web-application/rce

有人知道为什么它只适用于双引号吗?为什么我找到的所有其他例子都显示单引号而没有提到需要双引号的可能性?

EN

回答 1

Security用户

发布于 2021-10-10 18:54:50

如果没有看到您正在注入的代码,就很难分辨。很高兴看到你的全部有效载荷。

为了明确起见,参数名,在本例中为cmd,不需要用双引号括起来,单引号也可以,

例如,

代码语言:javascript
复制
$cmd = $_GET['cmd'];
echo system($cmd);

https://example.com/foo.php?cmd=cat+/etc/passwd的请求将有效。这也适用于双引号。

PHP使用双引号和单引号处理字符串的方式有很大的不同;它被称为“变量扩展”。单引号不会扩展变量,但是双引号会。检查一下这个:

Double引号(变量扩展)

代码语言:javascript
复制
    $ip = "127.0.0.1";
    $command = "ping $ip";
    echo $command;

  Output: ping 127.0.0.1

Single引号(没有变量扩展)

代码语言:javascript
复制
    $ip = "127.0.0.1";
    $command = 'ping $ip';
    echo $command;

 Output: ping $ip

注意,$ip变量的值不是派生出来的,因为字符串是用单引号构建的,而单引号不会执行变量插值。如果原始示例的system()调用包含在单引号中,它将失败。

因此,我的猜测是,如果不查看代码库,您试图使用的有效负载将需要在使用字符串的上下文中进行变量扩展。

更简单的解释是单引号破坏了您要注入的代码,f.e、eval('$cmd=$_GET;system($cmd);'),或单引号正在被净化。

附带注意:当处理GET请求中的有效负载时,请记住URL编码。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/252529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档