【JAVA审计】拓宽思路,记一次Minecraft插件的审计过程

发布于 2023-12-14  3011 次阅读


AI 摘要

标题:【JAVA审计】打开新思路!回忆一次审计可爱的Minecraft插件过程正文:使用的软件:JD-GUIMinecraft 1.16.5 / Spigot 1.16.5使用的编程语言:JAVA前言最近,我在浏览外站时偶然看到一个关于MC服务器插件漏洞的视频,突然想到MC服务器的插件也是一个有输入输出的过程。那会不会也同样存在像WEB那样的漏洞呢?我有一点点Bukkit插件开发的经验,如果想要从Bukkit服务端影响到服务器上的其他应用,首先得存在类似的功能点。比如HolographicDisplays插件的readtext指令,因为可以存在"../",所以存在任意文件读取的漏洞。那么,Bukkit服务端和服务器其他应用交互最多且允许玩家输入的地方无疑就是SQL了。会不会存在SQL注入呢?我进行了如下的尝试。本篇文章仅提供思路,如果有更好的方法,欢迎讨论哟~1. 使用JD-GUI反编译我这次使用了JD-GUI反编译工具,因为我刚刚开始接触这方面,如果有更好的工具,请多指教!首先,需要确定一点,由于JAVA的语言特性,例如prepareStatement函数就能有效地防止注入问题,所以很少出现SQL注入的情况。那么我首先是寻找插件中调用SQL语句的地方,然后判断是直接拼接语句执行还是调用prepareStatement函数进行的SQL操作。如果是使用prepareStatement的,基本上可以放心地排除SQL注入的可能性哦~

使用的软件:

  • JD-GUI
  • Minecraft1.16.5 / Spigot 1.16.5

使用的编程语言

  • JAVA

前言

前几天在逛外站的时候偶然看到一个关于MC服务器插件漏洞的视频,突然想到MC服务器的插件也是一个输入输出的过程,那会不会也同样存在和WEB类似的漏洞呢。结合原来一点点的Bukkit插件开发经验,如果想要从Bukkit服务端影响到服务器上的其他应用,首先得存在类似的功能点,例如HolographicDisplays插件的readtext指令因为可以存在"../",所以存在任意文件读取的漏洞。那么Bukkit服务端和服务器其他应用交互最多且允许玩家输入的地方无疑就是SQL了。那么会不会存在SQL注入呢。我进行了如下的尝试。

本文章仅提供思路,如果有更好的方法,欢迎讨论


1.JD-GUI反编译分析

我这里使用JD-GUI反编译,因为刚刚接触这一块没多久,如果有更好的工具请多指教。

首先要确定的是,JAVA由于其语言特性的问题,例如prepareStatement函数就能有效的防止注入问题,所以很少出现SQL注入的问题,那么我这里首先是寻找插件调用SQL语句的地方,然后判断其是直接拼接语句执行还是调用prepareStatement函数进行的SQL操作,如果是prepareStatement基本上就可以放弃SQL注入了。

此图片的alt属性为空;文件名为1702532618-QQ20231214134315-1024x481.png

打开JAR,可以在mysql包中看到关于SQL操作的代码,这里虽然使用了prepareStatement函数,但并没有使用prepareStatement函数传入参数,依然是使用直接拼接的方式带入参数的,所以可以初步判断这些位置存在SQL注入的可能

回到最开始命令输入的地方,观察参数是从什么地方传过来的。根据插件的介绍,一共存在两个传参命令,分别是Accept和Check,其中Accept是玩家可以操作的变量,优先测试。

图中可以看到当玩家执行accept指令后,调用onAcceptCommand函数,第二个参数inputCode即玩家输入。追踪过去

onAcceptCommand函数首先会调用isContainsCode函数判断数据库中是否包含玩家输入。追踪进isContainsCode函数看一下。

可以很明显的看到这里也是使用的直接拼接的方式拼接变量。
那么我们就可以简单搭建一个Spigot服务器,装上这个插件进服务器构造一个payload试试看。

可以看到,这里我使用accept指令,构造了一段payload传参

1'+sleep(5)#

成功执行sleep语句。那么基本可以判断,此处存在SQL注入。

(经过测试,插件在输入的地方均存在SQL注入)