Perl 与 PHP 结合的常见漏洞

Perl 是什么?

Perl 是 “Practical Extraction and Report Language” 的缩写,是一种功能强大、灵活、富有表现力的脚本语言。它最早由 Larry Wall 在 1987 年发布,最初的目标是用来处理文本文件、进行系统管理,还有一些报表处理的工作

Perl 的特点:

  1. 强大的文本处理能力
    Perl 的正则表达式功能超级强,几乎是所有语言中最强之一,特别适合处理各种日志、网页内容、配置文件等
  2. 跨平台
    Perl 能在 Unix、Linux、Windows、MacOS 等等平台上运行
  3. CPAN 模块丰富
    Perl 有一个超强的模块库系统叫 CPAN(Comprehensive Perl Archive Network),上面有数万个模块,可以帮你快速完成很多功能。
  4. 自由而有弹性
    Perl 的口号是 “There’s more than one way to do it”(不止一种方法可以做到),你可以用很多种方式实现同一个功能,自由度极高
  5. 脚本语言
    Perl 是解释型语言,写完脚本直接运行,不需要编译,适合快速开发和测试。

1. Perl 的 open() 管道执行漏洞

后面咱们讲的这个题就是:

shell_exec("GET " . escapeshellarg($_GET["url"]));
  • Perl 的 open() 支持 file:|command 的语法
  • GET 工具会调用 open → 触发 RCE

条件: 使用了 Perl 的 GET 工具,或者后台处理脚本用 Perl


2. Perl 的 system() 命令注入(参数未过滤)

假设 PHP 写了个 wrapper 调用 Perl:

shell_exec("perl myscript.pl " . $_GET['param']);

myscript.pl 里写了:

system("ls $_[0]");

如果没有适当过滤,传入 ;id&& whoami 就可能执行任意命令


3. Perl 的 eval 注入

如果 Perl 脚本中不小心用了:

eval($user_input);

比如用 GET 参数构造代码:

my $code = param("code");
eval $code;

PHP 调用 Perl 的时候传递这个参数,就可以注入恶意 Perl 代码,比如:

?code=system('cat /flag')

4. Perl 脚本中的 requiredo 动态包含

比如有 Perl 脚本:

my $mod = param("mod");
require "$mod.pm";

如果 PHP 没有限制传入内容,攻击者可能可以构造恶意模块文件,然后通过 require 加载并执行任意代码。


5. Perl 脚本当作过滤器时使用 PHP 文件名注入

假设:

  • Perl 脚本会处理文件路径
  • PHP 把文件名交给 Perl
  • 如果文件名中有特殊字符(如管道 |、回车符、反引号 ` 等),就可能触发 Perl 执行命令

举个例子:

$filename = $_GET["name"];
shell_exec("perl convert.pl " . escapeshellarg($filename));

而 Perl 中是这样读取文件:

open(my $fh, "<", $ARGV[0]) or die "Can't open file";

只要文件名是:

"|ls"

就可以进行rce

 

因为我并没有了解过perl语言,所以只能简单的看懂一点皮毛,更详细的内容建议看这篇文章超硬核:深入讲解Perl安全之代码审计——perl脚本中存在的问题与存在的安全风险_perl 输入验证错误漏洞(cve-2016-2381)-CSDN博客

[HITCON 2017]SSRFme

这道题用到了perl语言的漏洞:

因为GET函数在底层调用了perl语言中的open函数,但是该函数存在rce漏洞。当open函数要打开的文件名中存在管道符(并且系统中存在该文件名),就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行

题解就是先通过路径遍历漏洞找到flag和readflag脚本,然后通过这个漏洞运行readflag脚本,虽说我并没有复现出来,但是我看懂了。

 

 

posted @ 2025-04-14 20:24  ALe_#3  阅读(14)  评论(0)    收藏  举报  来源