ueditor v1.3.6 net版本文件上传分析uploadFilecxt.Request.Files[0];originalNameuploadFile.FileName;//1.txtprivateboolcheckType(string[]filetype){currentTypegetFileExt();returnArray.IndexOf(filetype,currentType)-1;}privatestringgetFileExt(){string[]tempuploadFile.FileName.Split(.);//if 1.txt [1,txt] 1.ashx.txt[1,ashx,txt]return.temp[temp.Length-1].ToLower();// all .txt 从这里可知这里代码检测文件后缀只看最后的文件类型}//如果文件 1.ashx.txt文件类型就可以通过 如果想继续利用绕过就得看文件保存文件格式拼接的代码//继续分析if(stateSUCCESS){filenameNameFormater.Format(cxt.Request[fileNameFormat],originalName);//从http请求中获取fileNameFormat参数vartestnamefilename;varai1;while(File.Exists(uploadpathtestname)){testnamePath.GetFileNameWithoutExtension(filename)_aiPath.GetExtension(filename);}uploadFile.SaveAs(uploadpathtestname);URLpathbasetestname;}}catch(Exception){// 未知错误state\u672a\u77e5\u9519\u8bef;URL;}returngetUploadInfo();publicstaticstringFormat(stringformat,stringfilename){// 1. 如果前端没传 fileNameFormat使用默认规则if(String.IsNullOrWhiteSpace(format)){format{filename}{rand:6};}// 2. 获取原始文件名的扩展名关键点①stringextPath.GetExtension(filename);//这里如果源文件为png那么ext值为空// 3. 获取原始文件名去掉扩展名的部分关键点②filenamePath.GetFileNameWithoutExtension(filename);//正常返回png// 4. 替换占位符 {filename} 为原始文件名无扩展名formatformat.Replace({filename},filename);// 5. 替换 {rand:6} 为随机数字默认6位formatnewRegex(\{rand(\:?)(\d)\}).Replace(format,...);// 6. 替换 {time}、{yyyy}、{mm}、{dd}、{hh}、{ii}、{ss} 为当前时间formatformat.Replace({time},DateTime.Now.Ticks.ToString());// ... 其他时间占位符 ...// 7. 过滤非法文件名字符\ / : * ? |formatinvalidPattern.Replace(format,);// 8. 最终 处理后的 format 原始扩展名 extreturnformatext;}//这个漏洞产生的原因主要是应为//1.刚开始的文件后辍检测是自定义的函数进行检测只使用了.split。它不只是“没考虑无点”而是“无点时会返回 . 整个文件名”。这是一个逻辑误判而不是单纯的忽略。//2.然后就是开始上传了上传定义文件时候两个变量数据用户完全可控可以构造拼接
ueditor v1.3.6 net版本 分析
发布时间:2026/6/28 19:55:49
ueditor v1.3.6 net版本文件上传分析uploadFilecxt.Request.Files[0];originalNameuploadFile.FileName;//1.txtprivateboolcheckType(string[]filetype){currentTypegetFileExt();returnArray.IndexOf(filetype,currentType)-1;}privatestringgetFileExt(){string[]tempuploadFile.FileName.Split(.);//if 1.txt [1,txt] 1.ashx.txt[1,ashx,txt]return.temp[temp.Length-1].ToLower();// all .txt 从这里可知这里代码检测文件后缀只看最后的文件类型}//如果文件 1.ashx.txt文件类型就可以通过 如果想继续利用绕过就得看文件保存文件格式拼接的代码//继续分析if(stateSUCCESS){filenameNameFormater.Format(cxt.Request[fileNameFormat],originalName);//从http请求中获取fileNameFormat参数vartestnamefilename;varai1;while(File.Exists(uploadpathtestname)){testnamePath.GetFileNameWithoutExtension(filename)_aiPath.GetExtension(filename);}uploadFile.SaveAs(uploadpathtestname);URLpathbasetestname;}}catch(Exception){// 未知错误state\u672a\u77e5\u9519\u8bef;URL;}returngetUploadInfo();publicstaticstringFormat(stringformat,stringfilename){// 1. 如果前端没传 fileNameFormat使用默认规则if(String.IsNullOrWhiteSpace(format)){format{filename}{rand:6};}// 2. 获取原始文件名的扩展名关键点①stringextPath.GetExtension(filename);//这里如果源文件为png那么ext值为空// 3. 获取原始文件名去掉扩展名的部分关键点②filenamePath.GetFileNameWithoutExtension(filename);//正常返回png// 4. 替换占位符 {filename} 为原始文件名无扩展名formatformat.Replace({filename},filename);// 5. 替换 {rand:6} 为随机数字默认6位formatnewRegex(\{rand(\:?)(\d)\}).Replace(format,...);// 6. 替换 {time}、{yyyy}、{mm}、{dd}、{hh}、{ii}、{ss} 为当前时间formatformat.Replace({time},DateTime.Now.Ticks.ToString());// ... 其他时间占位符 ...// 7. 过滤非法文件名字符\ / : * ? |formatinvalidPattern.Replace(format,);// 8. 最终 处理后的 format 原始扩展名 extreturnformatext;}//这个漏洞产生的原因主要是应为//1.刚开始的文件后辍检测是自定义的函数进行检测只使用了.split。它不只是“没考虑无点”而是“无点时会返回 . 整个文件名”。这是一个逻辑误判而不是单纯的忽略。//2.然后就是开始上传了上传定义文件时候两个变量数据用户完全可控可以构造拼接