使用的软件:
- 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注入了。
打开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注入)
Comments NOTHING