【发布时间】:2017-03-08 00:26:23
【问题描述】:
centos-6.8 perl, v5.10.1 (*) 为 x86_64-linux-thread-multi 构建
这个问题来自这个Where is the shell command called which invokes OpenSSL commands?。简而言之,我正在破解一个非常古老的 Perl 脚本,用于维护内部私有 PKI,以便默认签名哈希和密钥大小满足当前浏览器的要求。
我有这些sn-ps的代码:
. . .
$args->{keypass} = $self->getPassword("Private key password",1)
unless $args->{keypass};
$self->warn("# Password argument: $args->{keypass}\n") if $ENV{CSPDEBUG};
my $cmd = "-out $args->{keyfile} $args->{keysize}";
$cmd = "-des3 -passout pass:$args->{keypass} ".$cmd if defined($args->{keypass});
$self->{openssl}->cmd('genrsa',$cmd,$args);
. . .
$self->{openssl}->cmd('req',"-x509 $common_args -new -out $cacert",$args);
. . .
use IPC::Run qw( start pump finish timeout new_appender new_chunker);
. . .
sub cmd
{
my $self = shift;
my $cmd = shift;
my $cmdline = shift;
my $args = shift;
my $conf;
my $cfgcmd;
. . .
$self->{_handle}->pump while length ${$self->{_in}};
. . .
如果用户提供的密码参数值不包含空格,则此代码将按需要执行。如果它确实包含嵌入的空白,则代码会静默失败。如果传递给 keypass 的参数与开始和结束单引号连接,则代码同样会静默失败。在这两种失败情况下,脚本仍然报告成功。
为什么?
无论用户输入是否包含空格,都需要进行哪些更改才能使此代码正常工作?
【问题讨论】:
-
让我正确地回答问题,您正试图消除密码字段中的任何空格以确保其正常工作?或者专门让它工作,即使密码中有空格?
-
@user2082599 来自上一个问题和这里的描述,我相信密码可能包含空格。如果是这样,程序将失败,因为空格在命令行参数中丢失了。并且引用它不起作用。
-
@James 您能否突出显示哪个参数是密码?我不清楚。
-
@simbabque:我很确定是
$args->{keypass}。 -
顺便说一句,注意在命令行上传递密码通常被认为是不安全的:如果任何不受信任的用户可以在同一台服务器上运行代码(即使在非特权帐户下),他们只需运行即可看到密码
ps ax。 openssl manual 注意到了这一点,并警告pass:“只能在安全性不重要的情况下使用。”