Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->CGI ->CGI的安全(二)
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 windows下Perl开发环境的安装和配置(04-28)
perl与Mysql连接(04-28)
实战 FastCGI(04-28)
获取随机的密码(04-28)
perl模块和包的使用(04-28)
精采文章排行
精采文章排行 CGI教学:CGI常用环境变量(04-28)
关于CGI读写COOKIE的编程(04-28)
CGI的安全(二)(04-28)
CGI的安全(一)(04-28)
获取随机的密码(04-28)
  ·关于CGI读写COOKIE的编程·CGI的安全(二)·CGI的安全(一)·获取随机的密码·在CGI中实现session的想法和实现·CGI绝对路径和相对路径的简便设置方法·使用脚本下载网页·利用Perl开发Internet/Intranet应用之二(·利用Perl开发Internet/Intranet应用之二(

CGI的安全(二)

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-04-28 [收藏] [投稿]

  IE是否经常中毒?推荐您


(译者注:原图是一个浏览器,我仅画出HTML页中的部分。) 

  我们来看一下下面的程序行会如何处理这样的输入: 
  
  print `/usr/bin/finger $in` 

  由于你使用了向后的标记,首先它会执行一个shell。然后它将执行如下的命令: 

/usr/bin/finger nobody@nowhere.org ; /bin/rm -rf / 

  这将会怎样呢?假设在命令行像这样输入。它会删除所有的文件和目录,从root的目录开始。我们需要sanitize这个输入来render the semicolon(;)metacharacter harmless.在Perl中,利用表4中的函数可以很容易的实现。(C中的这些等价函数在表5中;它们来自cgihtml的C库。) 


程序4. Perl中的escape_input(). 
sub escape_input { 
  @_ =~ s/([;<>\*\|`&\$!?#\(\)\[\]\:’"\\])/\\$1/g; 
  return @_; 


程序5. C语言中的escape_input(). 
char *escape_input(char *str) 
/* takes string and escapes all metacharacters.should be used before 
 including string in system() or similar call. */ 

  int i,j = 0; 
  char *new = malloc(sizeof(char) * (strlen(str) * 2 + 1)); 
  for (i = 0; i < strlen(str); i++) { 
  printf("i = %d; j = %d\n",i,j); 
  switch (str[i]) { 
  case ’|’: case ’&’: case ’;’: case ’(’: case ’)’: case ’<’: 
  case ’>’: case ’\’’: case ’"’: case ’*’: case ’?’: case ’\\’: 
  case ’[’: case ’]’: case ’$’: case ’!’: case ’#’: case ’;’: 
  case ’`’: case ’{’: case ’}’: 
  new[j] = ’\\’; 
  j++; 
  break; 
  default: 
  break; 
  } 
  new[j] = str[i]; 
  j++; 
  } 
  new[j] = ’\n’; 
  return new; 



  这将返回一个带有跟随在\后的shell转义字符的字符串。这个修正的finger.cgi网关在程序6中。 

程序6. 一个安全的finger.cgi. 
#!/usr/local/bin/perl 
# finger.cgi - an safe finger gateway 


require ’cgi-lib.pl’; 
sub escape_input { 
  @_ =~ s/([;<>\*\|`&\$!#\(\)\[\]\:’"])/\\$1/g; 
  return @_; 

print &PrintHeader; 
if (&ReadParse(*in)) { 
  print "\n"; 
  print `/usr/bin/finger &escape_input($in)`; 
  print "\n"; 

else { 
  print " \n"; 
  print "\n"; 
  print "\n\n"; 
  print "Finger Gateway\n"; 
  print "\n"; 
  print "User@Host: \n"; 
  print "\n"; 
  print "\n"; 
  print " \n"; 


  这次,如果你使用前述相同的输入,将派生出一个shell,它将尝试这样执 
行: 

  /usr/bin/finger nobody@nowhere.org \: /bin/rm -rf / 

  这样,那个恶意的企图将无法生效.它不再试图删除系统中所有的目录,而是尝试finger用户nobody@nowhere.org,:,/bin/rm,-rf和 /。由于后面的字符组合未必是你的系统中的用户,因此可能会返回一个错误。 

  记住几个问题。首先,如果你的Web服务器正确的配置了(例如,以非root 身份运行),那么,删除文件系统中的所有内容的企图不会成功。(如果服务器以root身份运行,那么潜在的危害将是不可估量的。千万不要这样做!)另外,用户还假定rm命令在/bin目录中。他或她假定了rm在这个路径中。然而,所这些只是对大多数的Unix系统的乐观的假设,并不是完全适用的。在一个hrooted系统环境中,这个目录中并没有rm命令。那么hacker的努力将是徒劳的。从理论上说,通过安全防范和正确配置你的Web服务器,你可以将潜在的危害降低到几乎为0,即使是书写了糟糕的脚本。 

  然而,你没有理由在编写CGI程序时可以掉以轻心。事实上,大多数的Web环境并不是chrooted的,仅仅是因为它禁止了很多人需要在Web服务器中需要的灵活性。即使服务器不是以root身份运行,用户不能将文件系统中的文件全部删除,一些人可以仅仅通过如下的输入,将/etc/passwd文件寄给me@evil.org作为可能的攻击途径: 


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 2 34 5 6 下一页

上一篇:CGI的安全(一)   下一篇:关于CGI读写COOKIE的编程
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·CGI教学:CGI常用环境变量

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。