[英]param does not work when setuid bit is on in perl cgi script
当这个脚本的权限是u=rwx,g=rwx,o=r
脚本工作得很好......但是,我需要打开setuid位,因此对smartctl的调用会返回所需的数据而不是错误。
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard);
my $device = param("device") || "sda";
print header("text/plain");
print "device = $device\n\n";
$ENV{"PATH"} = "/usr/sbin";
open( PS, "smartctl -A /dev/$device |" );
while( <PS> )
{
print $_ . "\n";
}
close( PS );
当我将权限设置为u=rwxs,g=rwxs,o=r
,脚本在查询未指定device
时起作用。 但是当指定device
时, print "device = $device\\n\\n";
后没有任何内容返回print "device = $device\\n\\n";
您需要查看Perl的配置。
perl -MConfig -e 'print "d_suidsafe = $Configu{d_suidsafe}\n"; }'
如果它没有说什么(在=
之后没有任何可见),那么Perl被告知将SUID脚本视为不安全。 它以不同于常规脚本的方式对待它们。 检查'污点'系统( -T
命令行选项); 它应该警告下面提到的“脚本注入”问题。
编码建议:
open
的三参数形式。 open
成功。 像这样:
open my $PS, "-|", "smartctl -A /dev/$device"
or die "Could not popen smartctl: $!";
好吧,可能不会die
,但干净地报告错误,不要使用未打开的文件句柄。
if (open my $PS, "-|", "smartctl -A /dev/$device")
{
while (<$PS>)
{
print "$_\n";
}
close $PS;
}
else
{
print "Failed to open device: $!";
}
请注意,您需要拒绝或清理写入的人的输入: sda; cp /bin/sh /tmp/...; chmod 6777 /tmp/...
sda; cp /bin/sh /tmp/...; chmod 6777 /tmp/...
sda; cp /bin/sh /tmp/...; chmod 6777 /tmp/...
在设备参数字段中。 这有点像SQL注入,只是这一次,它是'Perl脚本注入'。 他们可能比那更残酷: sda; rm -fr / 2>/dev/null &
sda; rm -fr / 2>/dev/null &
在清理脚本setuid可以修改的用户的文件和目录系统方面做得相当不错。 在最好的时候,你不能相信用户一英寸。 在setuid程序中,完全信任用户是一个严重的问题。 当访问来自Web浏览器时,所有这些都是双倍的(如果不是倍增的话)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.