linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 软件开发 >
栏目导栏
资料搜索
热门文章
·Linux 下 C 语言编程
·Linux下的通用线程池创建
·C++字符串转换篇
·linux C 进程操作篇
·linux上的C/C++编译器gcc/egcs
·linux C 文件权限控制篇
·GCC使用手册
·linux C 接口处理篇
·在Redhat Linux上安装 GCC 编译
·GCC使用指南
·C语言运算符
·Linux下C开发环境的构成和安装
·fopen()函数的参数说明
·GCC使用手册与常用命令
·Scheme 语言介绍
最新文章
·在Ubuntu Linux 8.04上构建GCC
·Linux操作系统下Socket编程地址
·将VC程序移植到Linux系统的几点
·Linux下malloc/free与new/dele
·Linux下用GTK和socket实现简单
·Linux操作系统下让Tomcat启动在
·Linux操作系统中如何编译C程序
·几种常被人们忽略的Linux系统下
·Eclipse编程工具 在Ubuntu下的
·Linux操作系统下的网络地址转换
·老手经验谈:Linux驱动程序开发
·Linux操作系统多线程同步Mutex
·Linux操作系统下C程序语言简易
·Linux系统平台下关于GCC编译及
·解决Linux系统下管道被接受方关
Google
 
perl脚本中的一些安全问题
[ 作者:  加入时间:2006-08-26 10:28:30  来自:Linux联盟收集 ]

对一种编程语言而言,在设计这种语言的时候,一般是不会产生安全隐患的,事实上,这种隐患是由程序员引入的。几乎每一种编程语言都有一定这样的漏洞,这种漏洞将会在某种程度上导致不安全软件的产生,但是一个如软件整体的安全性仍然大部分依赖于这个软件制造者的知识面、理解能力和他的安全意识。Perl也有它安全上令人担忧的部分,然而大多数程序员完全没有意识到这些方面。SNaLinux联盟
SNaLinux联盟
  在这篇文章里,我们将会看一下Perl中一些最普遍被误用和忽视的属性。我们将会看到它们的误用将会怎样对运行它们的系统的安全以及它们的用户造成威胁。我们将会演示怎样把这些弱点挖掘出来以及如何去修改、避免它们。SNaLinux联盟
SNaLinux联盟
  用户输入上的弱点 SNaLinux联盟
SNaLinux联盟
  Perl脚本中产生安全问题的一个很大的来源是没有经过正确确认(或根本就没有确认)的用户的输入。每次当你的程序要从一个不信任用户那里获取输入信息的时候,即使采用的是非直接的方式,你都应该小心。举个例子来说吧,如果你在Perl中写CGI脚本,你要预期到恶意的用户将会发送给你假的输入。 不正确的用户输入,如果没有经过确认就被认可并使用了,将会导致许多方面出错。最常见和明显的错误是,没有经过确认就去执行有用户自定义参数的其他程序。SNaLinux联盟
SNaLinux联盟
  syetem()和exec()函数 SNaLinux联盟
SNaLinux联盟
  Perl以能被用作一种“粘合”语言而著称——它能够通过如下方式完成一个出色的工作:在调用其他程序来为它工作的时候,通过采集一个程序的输出,将它重新格式成一种特定的方式后传递到其他程序的输入的方式仔细的协调它们的运行。这样各个程序就能很好的运行了。SNaLinux联盟
SNaLinux联盟
  正如Perl发布标语告许我们的,我们有不止一种方法可以做同样的事。一种执行一个外部程序和一个系统命令的方法事通过调用exec()函数。当Perl遇到一个exec()语句的时候,它审视exec()被调用处的参数,然后启动一个新的进程来执行这条特定的命令。Perl从不会返回控制给调用exec()的原来的那个进程。SNaLinux联盟
SNaLinux联盟
  另一个相似的函数是sys_tem(去掉"_")()。sys_tem(去掉"_")()的运行方式非常象exec()。它们之间的唯一的大的区别是Perl会首先从父进程中分叉出一个子进程,子进程作为提供给sys_tem(去掉"_")()的一个参数。父进程等到子进程结束运行后再接着运行程序的其余部分。我们将会在下面更详细的讨论sys_tem(去掉"_")()调用,但这些讨论大部分也适用于exec()。SNaLinux联盟
传递给sys_tem(去掉"_")()的参数是一个列表——列表里的第一个元素是要被执行的这个程序的程序名,其他元素是传给这个程序的参数。然而,如果只有一个参数的的话,sys_tem(去掉"_")()的执行方式会发生差异。在那种情形下,Perl将会扫描这个参数看它是不是包含任何shell转换字符。如果有的话,它就要把这些字符通过shell来解释。所以产生一个shell命令行来工作。不然,Perl会降字符串拆成单词然后调用效率更高的c库函数execvp(),这个函数不能理解特殊的shell字符。SNaLinux联盟
SNaLinux联盟
  现在假设我们有一张CGI表单,它要询问用户名,然后显示包含这个用户统计信息的一个文件。我名可以如下使用sys_tem(去掉"_")()来调用"cat"实现那种要求:SNaLinux联盟
SNaLinux联盟
  sys_tem(去掉"_") ("cat /usr/stats/$username");SNaLinux联盟
SNaLinux联盟
  用户名来自这样的一个表单: SNaLinux联盟
SNaLinux联盟
  $username = param ("username");SNaLinux联盟
SNaLinux联盟
  . 举个例子,当用户在表单里添上username = jdimov,然后提交后。Perl在字符串``cat /usr/stats/jdimov中没有找到任何转换字符创,所以它就调用execvp()函数运行”cat”后返回到我们的脚本中。这个脚本也许看起来没有害处可言,但是它容易被一个恶意的攻击者所利用。SNaLinux联盟
SNaLinux联盟
  问题是这样的,通过在表单的”username”域内使用特殊的字符,一个攻击者可以通过 shell来执行任何命令。举个例子,我们可以这样说,如果攻击者传递这样的字符串"jdimov; cat /etc/passwd",Perl会把分号当作一个转换字符,然后把它传递到shell中:SNaLinux联盟
SNaLinux联盟
  cat /usr/stats/jdimov; cat /etc/passwdSNaLinux联盟
SNaLinux联盟
  攻击者既可以获得亚元文件,又可以获得密码文件。如果攻击者想要搞破坏的话,他只要发送"; rm rf /*"就可以了。SNaLinux联盟
SNaLinux联盟
  我们在前面提到sys_tem(去掉"_")()有一个参数表,并且将第一个元素看作命令来执行,而将其余的元素作为参数来传递。所以我们可以稍微改变一下我们的脚本,使只有我们想让执行的程序能够被执行:SNaLinux联盟
SNaLinux联盟
  sys_tem(去掉"_") ("cat", "/usr/stats/$username");SNaLinux联盟
SNaLinux联盟
  既然我们分开来指定程序的参数,那么shell就永远也不会被调用了。所以发送";rm -rf /*"也就不会起作用了,因为攻击字符串将只会被解释成一个文件名而已。SNaLinux联盟
SNaLinux联盟
  只要是谈及安全的,上面论及system()函数的任何内容也适用于exec().SNaLinux联盟
open (STATFILE, "<$username.html");SNaLinux联盟
SNaLinux联盟
  当用户通过表单中传递username=jdimo的时候,脚本显示jdimov.html。这里仍然有被攻击的可能。不同于c++和c ,perl不用空字节来结束字符串,这样的话字符串jdimov/”jdimov/lo/bah在绝大数c库调用中解释为”jdimo”,但是在Perl中却是”jdimov\0blah”。当perl传递一个含空字符的字符串给用c写的程序的时候,这个问题就突出了。UNIX内核以及绝大多数UNIX 和shell 都 是纯c 语言的。Perl自身也主要是且c编写,当用户如下调用我们的脚本:SNaLinux联盟
SNaLinux联盟
  statscrit.plusername=jdimov/%00SNaLinux联盟
SNaLinux联盟
  会发生什么呢?我们的程序传递字符串”jdimov/%。html”到对应的系统调用里以打开它,但是因为那些系统调用是用c编写,接受的是空字节的字符串方式。结果怎样呢?如果有文件”jdimov”的话就会显示这个文件,可能并没有这个文件,即使有也不是很有用。但是如果用"statscript./pusername=statscript。p/%"来调用脚本,会发生什么呢?如果脚本和我们的html文件在同一个目录下的话,这样我们可以用这个输入来期骗脚本,来显示给我们所有的内容。在这种情况下或许不是 SNaLinux联盟

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息