欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

没有准考证号我是如何暴力查询英语六级成绩的

来源:本站整理 作者:FlashYo 时间:2017-08-24 TAG: 我要投稿

8月22日上午9时,CET6级成绩开始查询了。然而,忘记自己准考证号的也不在少数,而我,非常幸运,成为其中一员。仔细想了想,自己的准考证号是不太可能找回来了。
1.    下载CET6准考证的网站关了,虽然Chrome还保存着账号密码,但没用
2.    准考证本来拍照保存了的,但因为刷机手机图片也丢失了
3.    CET6准考证的打印PDF不知道还在不在电脑上,用Everything搜索*.pdf,没有发现在6月17日(那天CET6考试)左右的可疑文件
4.    考场号及座位号完全忘记,另外考场内好像也没熟人
5.    网上的99宿舍这次没用了,无法找回准考证号,只能获取前10位
6.    截止当日,说好的支付宝免准考证号查询成绩并没有来
显然,正常渠道,我是不太可能获取到自己的准考证号了。要等到学校下发6级的成绩单或者班级的成绩单,我估计没半个月是见不到成绩了,甚至更久!
与其等那么久,不如想想有什么办法。

准考证的前10位,毫无疑问,我们知道。那么需要解决的也就是后面的5位了。即使是暴力猜测,也不过10000次。
CET6成绩查询的网站是http://cet.neea.edu.cn/cet/,查询流程很简单,输入准考证号、姓名、验证码即可。
通过抓包,我们获取了如下几个API:
1.    获取验证码图片URL API
HTTP方式
URL
GET
http://cache.neea.edu.cn/Imgs.do?ik={准考证号}&t=0.6002525141319914
返回的内容:
result.imgs("/Article/UploadPic/2017-8/201782420613614.png");
通过正则表达式,提取出图片URL即可。
提示:调用该api记得发送GET请求时需要加上相应的cookie。
2.    提交查询API
HTTP方式
URL
POST
http://cache.neea.edu.cn/cet/query
提交的内容:
data=CET6_171_DANGCI%2C准考证号%2C姓名&v=验证码
解码一下:
data:CET6_171_DANGCI,准考证号,姓名v:6wbn
提示:该api提交记得带上相应的cookie
现在,CET暴力查询的整体思路,体现在如下几个模块:
A. 图片获取模块 1. 获取随机的准考证号 2. 获取相应的图片文件
大概获取200张左右图片,之后进行人工图片标记
B. 机器学习模块 1. 标记好下载的验证码图片 2. 图片灰度化、二值化、图片切割 3. 图片转特征矩阵,准备好特征向量与分类标签 4. SVM分类算法进行分类
C. 暴力查询模块 1. 根据输入的前10为准考证号,暴力破解后5为准考证号(考场号3位 + 座位号2位) 2. 指定准考证号ID获取指定验证码图片 3. 图片输入机器学习模块,获取验证码值 4. 提交验证码进行查询,获取相应的结果:验证码错误/无结果/非上述两者,查询成功
难点在于如何对验证码进行识别。
1.    我们先下载好200张左右的验证码图片
通过第一个API接口,编码文件如下所示:
get_images.py
# coding: utf-8
import re
import requests
from settings import img_api_headers, image_api
def get_random_id():
    """获取随机的准考证号"""
    return "360450171200100"
def get_image_url_and_filename(text):
    """获取api返回的图片地址"""
    url = re.findall(r"imgs\(\"(.*?)\"\)",text)
    name = re.findall(r"imgs/(.*?\.png)",text)
    if url:
        r = url[0]
    else:
        raise ValueError
    return r, name[0]
def save_url_image_to_file(url, filename):
    """请求图片url,并保存至指定文件"""
    r = requests.get(url)
    with open("images/" +filename, "wb") as f:
        f.write(r.content)
def main():
    for i in range(200):
        ik = get_random_id()
        u = image_api.format(id=ik)
        r = requests.get(u, headers=img_api_headers)
        url, filename =get_image_url_and_filename(r.text)
        save_url_image_to_file(url, filename)
if __name__ == '__main__':
    main()
运行上述文件,我们获得了足够多的图片,然后需要做的是手工对图片进行重命名,文件名为验证码的值。

2. 标记好图片之后,我们再写一个python文件将图片进行切割,将切割后的图片放置在以标签命名的文件夹下。
classify_images.py
# coding: utf-8"""1. 切割标记好的图片2. 将切割的图片分类保存至指定文件夹"""import osfrom PIL import Imagefrom utils import do_image_cropclassify_dir = "predict_images"def classify_croped_image_to_folder(img_list, img_name):    """通过文件名将块图片存储至指定文件夹"""    for n, word in enumerate(img_name[:4]):        file_dir = os.path.join(classify_dir, word)        if not os.path.exists(file_dir):            os.mkdir(file_dir)        img_list[n].save(os.path.join(classify_dir,word, img_name))def main():    name_list = os.listdir(classify_dir)    for name in name_list:        if not name.endswith(".png"):            continue        img = Image.open(os.path.join(classify_dir,name))        piece_img_list =do_image_crop(img.copy())       classify_croped_image_to_folder(piece_img_list, name)if __name__ == '__main__':    main()

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载