来源:自学PHP网 时间:2015-04-17 13:02 作者: 阅读:次
[导读] 该编辑器在韩国使用比较广泛,www.hani.co.kr、www.kbs.co.kr、www.joinsmsn.com中都有使用。由于涉及大大站,具体程序名称就不便直接发布了。以下只对问题代码做简要分析。主要问题在于上传...
该编辑器在韩国使用比较广泛,www.hani.co.kr、www.kbs.co.kr、www.joinsmsn.com中都有使用。由于涉及大大站,具体程序名称就不便直接发布了。以下只对问题代码做简要分析。
主要问题在于上传类在对文件扩展名做验证的时候不严谨导致攻击者可上传PHP。By Ca3tie1 先看上传函数: if ($file->getFileSize("Filedata") > 0) { $save_name = $req->get("save_name"); if ($save_name == null || $save_name == "") $save_name = $file -> nameUnique('ph_'); $file_name = $file->getFileName("Filedata"); if ($file -> isUploadable($file_name)) //扩展名的验证,如果验证不过则扩展名定死为tmp。 $file_ext = $file->name2Ext($file_name); //取出扩展名 else $file_ext = 'tmp'; $save_name = uniqid(date('ymd_')); $file_server = $file->file_Copy("Filedata", $savearea.$save_name.'.'.$file_ext); } 跟进isUploadable函数: function isUploadable($fileName) { return !(rainUtil::find($this->forbidden_extension_patten, $fileName)); } //这里涉及到forbidden_extension_patten,定义为:var $forbidden_extension_patten = '(html|htm|php|php3|cgi|phtml|shtml|jsp|asp|exe|com|dll)$'; 再继续跟进find函数:www.2cto.com function find($patternStr, $str, $reg = Array()) { return (ereg($patternStr,$str, $reg)) ? true:false; //问题就在这里了,ereg函数是区分大小写的!只要我们提交的文件名的扩展名为pHp即可绕过此处验证。 } 绕过扩展名验证后继续看上传函数中的取出扩展名的代码: $file_ext = $file->name2Ext($file_name); 我们继续跟进name2Ext函数: function name2Ext($fileName) { $tar_file_extension = ""; if ($fileName != "") { if (ereg("\.([^\.]+)$", $fileName, $tmp_reg)) $tar_file_extension = substr(strtolower($tmp_reg[1]), 0, 4); //最终会将文件名中的扩展名转换成小写!! else $tar_file_extension = "tmp"; } else $tar_file_extension = ""; return $tar_file_extension; } 完美绕过,这是韩国棒子写的程序,当然和国内的没法比。若分析有误望指出!拜谢! 摘自 Ca3tie1的空间 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com