Files
webmin/filemin/paste.cgi
Ilia Ross 04ae776e6a
Some checks failed
webmin.dev: webmin/webmin / build (push) Has been cancelled
Fix to validate action paths
* Note: Validate File Manager action name/file parameters as checked paths under the current directory and `allowed_paths` before operations, blocking traversal and symlink escapes.
2026-05-12 01:25:57 +02:00

86 lines
1.6 KiB
Perl
Executable File

#!/usr/local/bin/perl
require './filemin-lib.pl';
use Cwd 'abs_path';
&ReadParse();
get_paths();
open(my $fh, "<".&get_paste_buffer_file())
or die "Error: $!";
my @arr = <$fh>;
close($fh);
my $act = $arr[0];
my $dir = $arr[1];
chomp($act);
chomp($dir);
$from = abs_path($base.$dir);
if (!defined($from)) {
print_errors($text{'error_pasting_nonsence'});
}
elsif ($cwd eq $from) {
print_errors($text{'error_pasting_nonsence'});
}
else {
&check_allowed_path($from);
my @errors;
for (my $i = 2; $i <= scalar(@arr) - 1; $i++) {
chomp($arr[$i]);
my $name = $arr[$i];
my $source;
{
local $cwd = $from;
$source = &validate_filename_path($name);
}
my ($target_name) = fileparse($source);
my $target = &validate_filename_path($target_name);
if ($act eq "copy") {
if (-e $target) {
push @errors,
"$target " .
"$text{'error_exists'}";
}
else {
system("cp -r ".
quotemeta($source).
" ".quotemeta($cwd)
) == 0 ||
push @errors,
"$source " .
"$text{'error_copy'}" .
" $!";
}
}
elsif ($act eq "cut") {
if (!can_move($source, $from, $cwd)) {
push @errors,
"$source" .
" - " .
"$text{'error_move'}";
}
elsif (-e $target) {
push @errors,
"$target " .
"$text{'error_exists'}";
}
else {
system("mv ".
quotemeta($source).
" ".quotemeta($cwd)
) == 0 ||
push @errors,
"$source " .
"$text{'error_cut'}" .
" $!";
}
}
}
if (scalar(@errors) > 0) {
print_errors(@errors);
}
else {
&redirect(
"index.cgi?path=".&urlize($path));
}
}