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

时间:2014-08-02 11:29:22

标签: php shell security laravel-4 php-5.4

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

更精细(但很好)的方法是使用proc_open()而不是system()。使用proc_open(),您可以完全控制cmd的stdin,stdout,stderr,并可以将数据传输到cmd的stdin中。