Natas31 Writeup(Perl 远程命令执行)
Natas31:

源码如下:
my $cgi = CGI->new;
if ($cgi->upload('file')) {
my $file = $cgi->param('file');
print '<table class="sortable table table-hover table-striped">';
$i=0;
while (<$file>) {
my @elements=split /,/, $_; if($i==0){ # header
print "<tr>";
foreach(@elements){
print "<th>".$cgi->escapeHTML($_)."</th>";
}
print "</tr>";
}
else{ # table content
print "<tr>";
foreach(@elements){
print "<td>".$cgi->escapeHTML($_)."</td>";
}
print "</tr>";
}
$i+=1;
}
print '</table>';
}
else{
print <<END;
源码是将CSV文件里的数据拆分为表格形式。首先split函数按照“,”将csv中的每行进行分割,返回一个字符串列表。然后遍历列表中的字符串,将其分别使用escapeHTML()函数进行转义。最后将转义后的字符串填入表格中,用print函数输出到屏幕。
进一步找出关键代码如下:
//上传文件,打印内容
my $cgi = CGI->new; //创建新的CGI实例
if ($cgi->upload('file')) { //检查文件是否上传
my $file = $cgi->param('file'); //获取文件描述符
while (<$file>) { //遍历文件的每一行
print "$_"; //打印当前行内容
}
}
这5行代码所做的是,用户上传文件到服务器,然后服务器返回文件内容。在此过程中,服务器并没有保存或者移动这个文件,仅仅是显示了其内容,看起来没有什么不安全的地方。但是事实上真的安全吗?当然不是。
首先,【if ($cgi->upload('file')) {】这行代码中,我们期望upload()负责检查“file”参数值所代表的文件是否已上传,然而实际上upload()检查的是某一“file”参数值所代表的文件是否已上传(用户可构造多个file参数)。换句话说,upload()并不要求所有的file参数都是文件,它只要求其中一个file参数是文件即可。这意味着,我们可以构造2个file参数,一个上传文件,另一个赋一个变量值,这样也可以通过upload()的校验。
然后,【my $file = $cgi->param('file');】这行代码中,我们期望param()返回上传文件的文件描述符,然而实际上,如果我们构造2个file参数,一个上传文件,另一个赋一个变量值。那么param()返回我们输入的所有file参数值的列表。但是$file不能包含两个值,所以在给$file赋值时,程序会取列表中的第一个值赋给$file。所以如果给第一个file参数赋变量值,第二个file参数赋文件描述符,则$file会被赋值为我们输入的变量值,而不是上传的文件描述符。这意味着,此时$file变成了一个常规字符串!
接着,【while (<$file>) {】这行代码中,我们本来期望遍历文件的每一行,但由于此时$file是一个常规字符串,事实上,“<>”仅对文件起作用,对字符串不起作用。但是有一个特例,除非这个字符串是“ARGV”。当字符串是“ARGV”时,“<>”会遍历URL中?后面的每个值(比如POST /test.cgi?/etc/file1 /etc/file2),并把它们当做文件路径插入到一个open()调用中。这意味着,此时我们可以查看任何我们想看的文件内容,而不是仅仅查看我们上传的文件内容。
最后,再说说open()函数。open()的本意是打开一个字符串所代表的文件,但是当在字符串后面加一个“|”的话,open()就会执行这个字符串(比如POST /test.cgi?ipconfig|),就像调用一个exec()一样。
因此,我们可以使用如下2种方法获取flag。
方法一:直接在URL后面输入路径打开密码文件。

方法二:在URL后面调用cat命令打开密码文件。

flag:no1vohsheCaiv3ieH4em1ahchisainge
事实上,上面5行代码来自CGI.PM官方文档,它既没有调用exec()函数,也没有保存文件,仅仅是使用了print打印,谁能想到这几行代码可以被骇客利用形成这么大的漏洞呢?这并不是开发者的错,而是Perl语言本身的问题。Perl拥有默默用光列表,混淆数据类型,执行用户输入等等缺陷,并且至今没有被修复。所以,不要再使用Perl语言!至少不要再使用CGI环境。
参考:
https://www.youtube.com/watch?v=BYl3-c2JSL8(主要参考这个)
https://www.blackhat.com/docs/asia-16/materials/asia-16-Rubin-The-Perl-Jam-2-The-Camel-Strikes-Back.pdf
https://blog.csdn.net/baidu_35297930/article/details/99974886
Natas31 Writeup(Perl 远程命令执行)的更多相关文章
- PHPMailer 远程命令执行漏洞 Writeup
漏洞概述 1.漏洞简介 PHPMailer 小于5.2.18的版本存在远程代码执行漏洞.成功利用该漏洞后,攻击者可以远程任意代码执行.许多知名的 CMS 例如 Wordpress 等都是使用这个组件来 ...
- SSD报告 - QRadar远程命令执行
SSD报告 - QRadar远程命令执行 漏洞摘要 QRadar中的多个漏洞允许远程未经身份验证的攻击者使产品执行任意命令.每个漏洞本身并不像链接那么强大 - 这允许用户从未经身份验证的访问更改为经过 ...
- "Java 反序列化"过程远程命令执行漏洞
一.漏洞描述 国外 FoxGlove 安全研究团队于2015年11月06日在其博客上公开了一篇关于常见 Java 应用如何利用反序列化操作进行远程命令执行的文章.原博文所提到的 Java 应用都使 ...
- FlexPaper 2.3.6 远程命令执行漏洞 附Exp
影响版本:小于FlexPaper 2.3.6的所有版本 FlexPaper (https://www.flowpaper.com) 是一个开源项目,遵循GPL协议,在互联网上非常流行.它为web客户端 ...
- struts2远程命令执行漏洞S2-045
Apache Struts2最新漏洞(CVE-2017-5638,S02-45) struts2远程命令执行漏洞S2-045 Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-04 ...
- python套接字编程实现ntp服务和远程命令执行
python套接字编程实现ntp服务和远程命令执行 目录 基于udp实现ntp服务 基于tcp实现远程命令执行 基于udp实现远程命令执行 tcp与udp的比较 前面关于套接字基础请查阅 https: ...
- 【漏洞公告】高危:Windows系统 SMB/RDP远程命令执行漏洞
2017年4月14日,国外黑客组织Shadow Brokers发出了NSA方程式组织的机密文档,包含了多个Windows 远程漏洞利用工具,该工具包可以可以覆盖全球70%的Windows服务器,为了确 ...
- URI Scheme注册伪协议实现远程命令执行
Windows配置注册表注册伪协议 1.新建伪协议项 WIN+R 输入regedit 打开注册表,在注册表HKEY_CLASSES_ROOT键中新建一个项,项的名字就是你伪协议的名字,例如我注册一个c ...
- Apache Tomcat远程命令执行漏洞(CVE-2017-12615) 漏洞利用到入侵检测
本文作者:i春秋作家——Anythin9 1.漏洞简介 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 fals ...
随机推荐
- onbeforeunload事件兼容性操作
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- springboot 不同类型多数据源配置及使用
springboot多数据源配置: datasource.master.jdbc=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...
- AI在自动化测试领域的应用
阿里QA导读:最近一两年随着深入学习技术浪潮的诞生,智能化测试迎来了新的发展,而AI也会引领下一代测试的新航向.Testin云测CTO陈冠诚先生的分享让我们看到AI在移动自动化测试领域里面的创新机会点 ...
- 任务框架--Quartz 配置文件
配置文件 Quartz 有一个叫做quartz.properties的配置文件,它允许你修改框架运行时环境.缺省是使用 Quartz.jar 里面的quartz.properties 文件.你应该创建 ...
- Jekyll的_config文件配置报错
8 April 2019 by IchiehPan Jekyll 搭建博客时, 修改完_config.yml文件后就收到了github的build error邮件. 大致内容如下: did not f ...
- Linux IO多路复用
监听文件描述符的状态来进行相应的读写操作,3个函数: 123 selectpollepoll 123456789 int (int nfds, fd_set *readfds, fd_set *wri ...
- 浅谈在ES5环境下实现const
最近看到一个面试题--用ES5实现const.作为JS初学者的笔者知道在ES6中有const命令,可以用来声明常量,一旦声明,常量的值就不可改变.例如: 1234567891011 const Pi ...
- 模拟HTTP请求超时时间设置
HTTP请求有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间(请求资源超时时间). 使用curl命令行 连接超时时间用 --connect-timeout 参数来指定 数据传输的最大 ...
- HTML笔记02
网页中的颜色有三种表示方法 颜色单词:blue.green.red.yellow 10进制表示:rgb(255,0,0).rgb(0,255,0).rgb(0,0,255) 16进制表示:#ff000 ...
- 谈谈Vue的递归组件
2月最后一天,而且还四年一遇,然而本月居然一篇博客没写,有点说不过去.所以,今天就来谈谈Vue的递归组件.我们先来看一个例子: See the Pen 递归组件 by imgss (@imgss) o ...