可能:json_encode($data)和shell注入


Possible: json_encode($data) and shell injection?

我有一个用例,我需要从外部API的数据中获取格式化的PHP数组,并将其发送给命令进行进一步处理。

唯一可行的选择是json_encode($data)并将其传递给CLI,然后在另一端传递json_decode($data, true)。由于知道数据清理的重要性,我使用了escapeshellarg(json_encode($data)),但是这会阻止json_decode($data, true)在另一端正确创建我的数组。

所以我的问题,是否有任何可能的shell注入点,如果我们严格发送一个字符串是由json_encode()函数创建的?

$cmd = "php {$artisan_path} my:command " . escapeshellarg(json_encode($data)) . " {$user_id} >> {$log_file} 2>&1 & echo $!;";
system($cmd);

可以对编码后的JSON进行base64编码(并在另一端解码)。这保证给你一个非常有限的字符集(a- za - z0 -9+/=),我相信这些对于shell来说都不重要。

它确实增加了数据的大小(增加了1/3)。

但是,通过管道传递数据可能是更好的选择,特别是如果它可能有点长。

您可以使用serialize()并将结果保存到文件中。然后将文件名传递给命令。

一个更详细的(但很好的)方法是使用proc_open()代替system()。使用proc_open(),您可以完全控制cmd的stdin, stdout, stderr,并可以将数据管道到cmd的stdin。