记一次发现 MiOJ 漏洞

1024 程序员节参加了公司的线上比赛,用的我们自己的 MiOJ,很久没刷题了,只拿到 13/270 的名次。但是引发了我对 OJ 平台的一些认识。

发现漏洞

OJ 这一类用户拥有代码上传权限的平台应该很容易会产生上传漏洞,特别是像 Python 一类的脚本语言,很容易做到沙箱逃逸。经过一番尝试,发现的确大部分 OJ 平台都能拿到执行权限。以 MiOJ 为例:

我们可以看到用户直接就能拉到 os 模块(我尝试过 LeetCode 也是如此),那么后面可以做的事情就多了。我发现测试用例直接在当前执行路径下的 sampleIn.txt 文件中,打印一下试试:

再尝试执行一下 shell 指令:

再尝试写文件的时候,发现脚本执行用户的文件写入的权限被限制了:

总结

经过测试,LeetCode 和 MiOJ 都能通过 os.popen 执行 shell,但是权限只读。我想既然 LeetCode 都这么干了,那应该也算业界公认了。不过 MiOJ 的测试用例直接就放在了容器内部,这样一来拿到测试用例的用户就能够直接通过枚举刷题,也很不公平了。

本文内容仅供学习交流