Perl 与 PHP 结合的常见漏洞
Perl 是什么?
Perl 是 “Practical Extraction and Report Language” 的缩写,是一种功能强大、灵活、富有表现力的脚本语言。它最早由 Larry Wall 在 1987 年发布,最初的目标是用来处理文本文件、进行系统管理,还有一些报表处理的工作
Perl 的特点:
- 强大的文本处理能力
Perl 的正则表达式功能超级强,几乎是所有语言中最强之一,特别适合处理各种日志、网页内容、配置文件等 - 跨平台
Perl 能在 Unix、Linux、Windows、MacOS 等等平台上运行 - CPAN 模块丰富
Perl 有一个超强的模块库系统叫 CPAN(Comprehensive Perl Archive Network),上面有数万个模块,可以帮你快速完成很多功能。 - 自由而有弹性
Perl 的口号是 “There’s more than one way to do it”(不止一种方法可以做到),你可以用很多种方式实现同一个功能,自由度极高 - 脚本语言
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 脚本中的 require、do 动态包含
比如有 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脚本,虽说我并没有复现出来,但是我看懂了。

浙公网安备 33010602011771号