在处理易受攻击的框时,我在数据库表中找到了一个字段,可以在其中插入php代码。基于这一利用:
https://www.exploit-db.com/exploits/24044
我试图使用这段代码创建一个php webshell:
?php $cmd=$_GET['cmd'];system($cmd);?它失败了(结果是死亡的白色屏幕)。但是,如果我将单引号更改为双引号,它就会工作,如下所示:
?php $cmd=$_GET["cmd"];system($cmd);?我所看到的webshell代码的每一个源代码都围绕着cmd有单引号,不管它是哪一种变体,而且它们都没有提到它需要双引号的可能性。下面是一个页面的示例,其中概述了如何做到这一点:
https://vulp3cula.gitbook.io/hackers-grimoire/exploitation/web-application/rce
有人知道为什么它只适用于双引号吗?为什么我找到的所有其他例子都显示单引号而没有提到需要双引号的可能性?
发布于 2021-10-10 18:54:50
如果没有看到您正在注入的代码,就很难分辨。很高兴看到你的全部有效载荷。
为了明确起见,参数名,在本例中为cmd,不需要用双引号括起来,单引号也可以,
例如,
$cmd = $_GET['cmd'];
echo system($cmd);对https://example.com/foo.php?cmd=cat+/etc/passwd的请求将有效。这也适用于双引号。
PHP使用双引号和单引号处理字符串的方式有很大的不同;它被称为“变量扩展”。单引号不会扩展变量,但是双引号会。检查一下这个:
Double引号(变量扩展)
$ip = "127.0.0.1";
$command = "ping $ip";
echo $command;
Output: ping 127.0.0.1Single引号(没有变量扩展)
$ip = "127.0.0.1";
$command = 'ping $ip';
echo $command;
Output: ping $ip注意,$ip变量的值不是派生出来的,因为字符串是用单引号构建的,而单引号不会执行变量插值。如果原始示例的system()调用包含在单引号中,它将失败。
因此,我的猜测是,如果不查看代码库,您试图使用的有效负载将需要在使用字符串的上下文中进行变量扩展。
更简单的解释是单引号破坏了您要注入的代码,f.e、eval('$cmd=$_GET;system($cmd);'),或单引号正在被净化。
附带注意:当处理GET请求中的有效负载时,请记住URL编码。
https://security.stackexchange.com/questions/252529
复制相似问题