教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> CGI >> CGI的安全(二) RSS订阅
CGI的安全(二)
CGI的安全(二)(2)
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   

  eval(’...’) 

 `...` 

  为什么shell很危险呢?有很多的非数字的字符可以通过shell转换成特殊的字符。这些字符被称为元字符(译者注:这里我将metacharacter译为元字符),见表2。 

表2. Shell metacharacters. 
; < > * | ` & $ 
! # ( ) [ ] : { 
} ’ " 


  每一个这种字符在shell中都起着特殊的作用。例如,假如你想利用finger来查询一台计算机并将结果存储到一个文件中,你可以在命令行中如下输入: 

  finger @fake.machine.org > results 

  这会使用finger查询主机fake.machine.org并将查询结果保存到一个文本文 件results中。这个>字符在这里是一个重定向符。如果你要实际地使用>字符——例如,你想将它回显到屏幕上——你将需要在这个字符前加一个反斜杠。举个例子,下面将向屏幕输出一个符号>: 

  echo \> 

  这被称为转义字符(escaping or sanitizing the character string)。 

  hacker是怎样利用这个作为他(她)的优势的?观察以下程序3中用perl编写的finger程序。这个程序所做的是允许用户查询一个用户和一台主机的详细信息,并且,这个CGI可以查询用户并显示结果。 

程序3. finger.cgi. 
#!/usr/local/bin/perl 
# finger.cgi - an unsafe finger gateway 
require ’cgi-lib.pl’; 
print &PrintHeader; 
if (&ReadParse(*in)) { 
  print "\n"; 
  print `/usr/bin/finger $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"; 


  乍一看,这个程序好象没有什么害处。因为是用Perl编写的,不会有bufferoverflow的危险。我使用了finger的完全路径,这样gateway不会被伪造的finger程序所欺骗。如果输入是一个不合适的格式,那么gateway将返回一个错误而不会被人利用。 

  但是,如果我尝试如下的输入会怎样呢(如图1所示) 
  nobody@nowhere.org;/bin/rm -rf / 
  FINGER GATEWAY 
 ___________________________________ 
User@Host: |nobody@nowhere.org ; /bin/rm -rf / | 
 ----------------------------------- 
______________ 
| Submit Query | 
-------------- 
  (图1) 

(译者注:原图是一个浏览器,我仅画出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; 

来源:十度教育
作者:
关键字:CGI,安全
发表日期:2005-9-28 14:26:02

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:关于CGI读写COOKIE的编程   下一篇:CGI的安全(一)


共4页 9 7 [1] [2] [3] [48 :>

2009-1-8 7:49:08
本文的相类似文章
  • 2007年网络安全要注意的七项举措
  • Norton安全特警实用技巧四则
  • 一键修复所有系统安全漏洞!
  • 360安全卫士发布恶意软件判别标准
  • 个人系统的网络安全保护入门
  • 玩转网络银行 便捷安全两不误
  • 网络安全:三分技术加七分管理
  • 2005年中国网络安全十大热点事件
  • 05年网络安全检测报告
  • 打开IE的第五道安全防线
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com