首页 > 解决方案 > AWS上的美元符号密码破解mysqldump

问题描述

我在 Elastic Beanstalk 上托管了一个 Laravel 应用程序。我有一个运行的工匠命令mysqldump

$command = 'mysqldump -h%s -u%s -p%s %s > ' . storage_path($filename);
$c = sprintf(
            $command,
            config('database.connections.host'),
            config('database.connections.username'),
            config('database.connections.password'),
            $destinationDatabase
        );
$this->process = new Process($c);

这在密码(我存储在环境变量中)没有美元符号时有效。但是当密码中确实有美元符号时,它会被切断,然后命令就会失败。例如,如果密码是“test$me”,我会收到以下错误:

命令“mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -ptest db_name > db.sql”失败

即,它不是插入“test$me”作为密码,而是插入“test”。

我尝试在环境变量中的密码周围添加单引号,同样的事情发生了:

命令“mysqldump -hhostname.eu-central-1.rds.amazonaws.com -urandomname -p'test' db_name > db.sql”失败

标签: phplaravelamazon-web-servicesamazon-elastic-beanstalk

解决方案


美元符号。但是当密码中确实有美元符号时,它会被切断,然后命令就会失败。例如,如果密码是“test$me”

看起来调用正在使用非转义字符串,然后由 shell 解析(它也用于$表示变量)。您必须转义使用escapeshellarg()传递的所有参数以反击:

$c = sprintf(
            $command,
            escapeshellarg(config('database.connections.host')),
            escapeshellarg(config('database.connections.username')),
            escapeshellarg(config('database.connections.password')),
            escapeshellarg($destinationDatabase)
        );

推荐阅读