[ 登录 ][ 注册 ] 天极传媒: 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
您现在的位置: IT专家网 > 安全子站 > 评论分析

php escapeshellcmd多字节编码漏洞解析

作者: T_Torchidy,  出处:Xfocus, 责任编辑: 张帅, 
2008-05-27 00:00
  近日安全研究人员在对PHP进行测试中发现,一些允许如GBK,EUC-KR, SJIS等宽字节字符集的系统都可能受安全威胁,本文做就就相关漏洞解释和一些自己的想法来和用户分享。

  漏洞公告在http://www.sektioneins.de/advisories/SE-2008-03.txt

  PHP 5 <= 5.2.5

  PHP 4 <= 4.4.8

  一些允许如GBK,EUC-KR, SJIS等宽字节字符集的系统都可能受此影响,影响还是非常大的,国内的虚拟主机应该是通杀的,在测试完这个漏洞之后,发现还是十分有意思的,以前也有过对这种类型安全漏洞的研究,于是就把相关的漏洞解释和一些自己的想法都写出来,也希望国内的一些有漏洞的平台能迅速做出响应,修补漏洞。

  这个漏洞出在php的用来转义命令行字符串的函数上,这些函数底层是用的php_escape_shell_cmd这个函数的,我们先来看看他的处理过程:

      /* {{{ php_escape_shell_cmd
  Escape all chars that could possibly be used to
  break out of a shell command
  This function emalloc's a string and returns the pointer.
  Remember to efree it when done with it.
  *NOT* safe for binary strings
  */
  char *php_escape_shell_cmd(char *str) {
  register int x, y, l;
  char *cmd;
  char *p = NULL;
  l = strlen(str);
  cmd = safe_emalloc(2, l, 1);
  for (x = 0, y = 0; x < l; x++) {
  switch (str[x]) {
  case '"':
  case '\'':
  #ifndef PHP_WIN32
  if (!p && (p = memchr(str + x + 1, str[x], l - x - 1))) {
  /* noop */
  } else if (p && *p == str[x]) {
  p = NULL;
  } else {
  cmd[y++] = '\\';
  }
  cmd[y++] = str[x];
  break;
  #endif
  case '#': /* This is character-set independent */
  case '&':
  case ';':
  case '`':
  case '|':
  case '*':
  case '?':
  case '~':
  case '<':
  case '>':
  case '^':
  case '(':
  case ')':
  case '[':
  case ']':
  case '{':
  case '}':
  case '$':
  case '\\':
  case '\x0A': /* excluding these two */
  case '\xFF':
  #ifdef PHP_WIN32
  /* since Windows does not allow us to escape these chars, just remove them */
  case '%':
  cmd[y++] = ' ';
  break;
  #endif
  cmd[y++] = '\\';
  /* fall-through */
  default:
  cmd[y++] = str[x];
  }
  }
  cmd[y] = '\0';
  return cmd;
  }
  /* }}} */

  可以看到,php通过将",',#,&,;.....等等在shell命令行里有特殊意义的字符都通过在前面加上\变成\".\',\#,\&,\;......来进行转义,使得用户的输入被过滤,来避免产生command injection漏洞。在php看来,只要过滤了这些字符,送入到system等函数中时,参数就会是安全的,php手册中给出的利用例子如下:

<?php
$e = escapeshellcmd($userinput);
// here we don't care if $e has spaces
system("echo $e");
$f = escapeshellcmd($filename);
// and here we do, so we use quotes
system("touch \"/tmp/$f\"; ls -l \"/tmp/$f"");
?>
?3?? 1 2 3 :
  • 本文关键词:

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。

相关文章

邮件订阅


    • 解析Windows密码安全问题(第三部分)评论
      在前两部分文章中,我们讨论了Windows密码政策的问题以及它是如何在Active Directory环境被控制等问题,大家应该还记得在默认情况下密码政策和相关的设置位于默认域策略中(Default Domain Policy)。另外同样探讨了可以使用哪些技术破获windows密码,以及每种攻击方式的限制问题。那么,在本文中,我们将讨论如何让windows密码变得更加安全,以及如何能够解决在前两部分文章中出现的所有问题。本文将涉及Windows2002/2003/2008Active Directory默认安装带来的可能性以及其他能够整体提高密码安全的技术。
    • IDC创新和安全白皮书:合作或竞争评论
      业务创新是业务发展战略非常重要的一部分,并而日益成为公司保持竞争优势的决定性因素。由于创新的战略重要性,导致了我们越来越关注信息安全机制在抑制甚至扼杀业务创新方面起到的作用。IDC认为公司不仅是需要找到业务创新和有可能扼杀这种创新的信息安全机制,而且需要在这两者之间找到一个简洁的平衡来满足自己的业务需求。成功的企业能够在商业竞争中占有优势,是因为他们懂得去合理的利用两者使之成为一种具有杠杆作用的机制,而其它的企业只是单单强调其中的一个。
    • 预防企业数据丢失的6种最佳实践评论
      根据“私有权清算中心”(一家非赢利性消费者信息和倡导组织)的统计,自2005年1月以来,有将近2200万条记录遭到破坏。数据失窃和丢失案件数量惊人,这不仅是因为安全入侵事件正在以惊人的速度持续增长,数据丢失引发的财产损失事件也同样在飞速增加。根据美国政府的估计,所谓的“企业数据丢失”在去年使商业界损失了近1050亿美元。根据波尼蒙研究所(Ponemon Institute)的统计,仅仅内部人士导致的数据受损一项,每年给商业界造成的损失为平均每家公司3-4百万美元。产业分析公司Gartner集团估计,恢复数据的开销可以达到每条破坏记录150美元之高——这一数字还没有包括重拾客户信任和重建品牌价值、可能的罚款以及法律诉讼代理费的资金投入。在企业数据丢失案件有增无减的同时,公司也正在不断搜集更多数据,以求优化商业流程,改善客户服务,以及提升与合作伙伴的关系。更多的数据转化为相关数据在整个企业中数量不断增多的信息系统之间更广泛的传播。其结果就是——随着公司内外越来越多的用户获得接入系统的权限,敏感数据遭到破坏的风险也在不断增大。
    • RSA白皮书:管理银行的信息风险评论
      信息是银行的基础,但直到现在,金融机构还往往满足于以业务封闭式的方式管理风险。然而,行业的压力促使银行开始对这种战略展开思考。