php项目ueditor上传pdf文件,防止XSS攻击

做渗透测试的时候,ueditor附件上传一个包含javascript代码的pdf文件,直接保存成功。

通过浏览器访问这个保存好的文件,会执行javascript代码。被评定为高危漏洞。

项目使用的ueditor1.4.*,发现ueditor只做了文件大小和后缀的验证,没有做内容是否包含javascript代码的验证。

思路是在ueditor处理文件上传成临时文件验证的地方(移动之前),加上验证,不通过就直接返回,跳过文件移动。

修改ueditor包含的Uploader.class.php文件可以实现

1、添加ERROR_XSS错误提示,只加末尾那一行

php 复制代码
private $stateMap = array( //上传状态映射表,国际化用户需考虑此处数据的国际化
        "SUCCESS", //上传成功标记,在UEditor中内不可改变,否则flash判断会出错
        "文件大小超出 upload_max_filesize 限制",
        "文件大小超出 MAX_FILE_SIZE 限制",
        "文件未被完整上传",
        "没有文件被上传",
        "上传文件为空",
        "ERROR_TMP_FILE" => "临时文件错误",
        "ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件",
        "ERROR_SIZE_EXCEED" => "文件大小超出网站限制",
        "ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许",
        "ERROR_CREATE_DIR" => "目录创建失败",
        "ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限",
        "ERROR_FILE_MOVE" => "文件保存时出错",
        "ERROR_FILE_NOT_FOUND" => "找不到上传文件",
        "ERROR_WRITE_CONTENT" => "写入文件内容错误",
        "ERROR_UNKNOWN" => "未知错误",
        "ERROR_DEAD_LINK" => "链接不可用",
        "ERROR_HTTP_LINK" => "链接不是http链接",
        "ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确",
        "ERROR_XSS" => "文件内容包含代码",
    );

2、添加一个验证方法,建议加在 private function checkSize()方法后面:

php 复制代码
/**
     * 文件内容检测
     * @return bool
     */
    private function checkXSS($tmp_file)
    {
        $text = file_get_contents($tmp_file);
        $text = str_replace(array("\r\n","\r","\n"), " ", $text);
        preg_match('/javascript/i', $text, $matches);
        if($matches){
            return false;
        }
        return true;
    }

3、upFile方法开头调用这个checkXSS方法验证

php 复制代码
private function upFile()
    {
        $file = $this->file = $_FILES[$this->fileField];
        if (!$file) {
            $this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND");
            return;
        }
        if ($this->file['error']) {
            $this->stateInfo = $this->getStateInfo($file['error']);
            return;
        } else if (!file_exists($file['tmp_name'])) {
            $this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND");
            return;
        } else if (!is_uploaded_file($file['tmp_name'])) {
            $this->stateInfo = $this->getStateInfo("ERROR_TMPFILE");
            return;
        } else if (!$this->checkXSS($file['tmp_name'])) { //检查是否包含javascript代码
            $this->stateInfo = $this->getStateInfo("ERROR_XSS");
            return;
        }
// 加了上面末尾三行
相关推荐
SamChan909 小时前
PDF翻译API的JWT签名鉴权与速率限制设计:安全实战指南
网络·安全·pdf
东宇科技12 小时前
让网页执行cmd命令
php
持敬chijing14 小时前
PHP开发-环境搭建-安装phpstudy-vscode工具
开发语言·vscode·php
AmyLin_200114 小时前
PDF 脱敏技术【1】:PDF 脱敏不是盖黑框:为什么敏感信息仍能被复制,正确的保护方式是什么?
安全·pdf·sdk·脱敏·文档安全·pdf 脱敏·智能脱敏
MC皮蛋侠客15 小时前
TDengine C++ 系列(6):高性能写入——参数绑定、批量与 Schemaless
c++·php·tdengine
Hello_Damon_Nikola15 小时前
AC7911从入门到精通
开发语言·嵌入式硬件·物联网·php
云水一下16 小时前
零基础玩转bWAPP靶场(五十一):XSS - Reflected (Login Form)
web安全·xss·bwapp·reflected·login form
sbjdhjd17 小时前
大三网安秋招核心学习前言(AI 安全 + Web 漏洞 + 内网渗透全考点)
人工智能·网络协议·学习·安全·网络安全·开源·php
运维行者_18 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
Full Stack Developme19 小时前
跨站脚本攻击 (XSS) 是什么 设计及工作原理
前端·xss