本公众号由于种种原因更新比较慢,不过力求少而精,尽可能不水(当然水文也不少)
打包下载地址在后面,如有不会的地方或者需要配置,可联系作者协助解决。QQ:417230867(仅限空闲时间)
演示如下:
执行脚本
执行后会在当前目录生成【ID】.html文件
打开文件
(这个页面模板是自己写的,后面我会发出来)
脚本如下:
#Create:2021/03/08
#Update:2021/03/09
#公众号:墨雪飘影
#公众号:F12sec
#QQ:417230867
from pyecharts.charts import Page,Pie,Bar
from pyecharts import options as opts
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@latest/dist/"
import requests
import re
#使用新方法
'''
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt2
'''
low=0
mid=0
high=0
critical=0
name=''
percent=0.0
#定义漏洞类型和数量
bugsName=['SQL注入漏洞','文件上传漏洞','代码执行漏洞','命令执行漏洞','XSS漏洞','CSRF漏洞','SSRF漏洞','点击劫持漏洞','弱口令','敏感信息泄露','水平权限绕过','垂直权限绕过','其他漏洞']
bugsCount=[0,0,0,0,0,0,0,0,0,0,0,0,0]
#定义漏洞等级和数量
bugsLevel=['低危','中危','高危','严重']
print(' __ ____ _________ __')
print(' | \/ \ \ / / __ \ \ / /')
print(' | \ / |\ V /| |__) \ \_/ / ')
print(' | |\/| | > < | ___/ \ / ')
print(' | | | |/ . \| | | | ')
print(' |_| |_/_/ \__| |_| ')
print()
print('本工具仅适用于未登录情况!(当然工具压根就没有登录,这是废话,但是要说)')
id=input('请输入用户ID:')
for i in range(1,999):#此处设置为999为了不用控制页数,使用try进行中断
userHomeUrl='https://src.sjtu.edu.cn/profile/'+id+'/?page='+str(i)
backInfo=requests.get(userHomeUrl)
#print(backInfo.text)
try:
#终止循环
break_str='?page='+str(i)
#if backInfo.text.find(break_str)==-1:
if backInfo.text.find(break_str)==-1 and i!=1:#完成后修改,防止页数不足一页而跳出循环
print('第'+str(i)+'页,不存在,循环终止!')
break
#正则规则中保留尖括号为了提高准确率,防止匹配到用户昵称和用户签名
r_name=r'<title>.+ 的个人中心'
r_total=r'总提交漏洞数量:.+'
r_valid=r'已审核通过漏洞数量:.+'
r_rank=r'Rank:d+'
r_low=r'>低危<'
r_mid=r'>中危<'
r_high=r'>高危<'
r_critical=r'>严重<'
if name=='':
name=re.search(r_name,backInfo.text).group().replace('<title>','')
name=name.replace(' 的个人中心','')
total=re.search(r_total,backInfo.text).group().replace('总提交漏洞数量:','')
valid=re.search(r_valid,backInfo.text).group().replace('已审核通过漏洞数量:','')#此处采用偷懒式写法,偷懒但有效,注意冒号后有一个空格
rank=re.search(r_rank,backInfo.text).group().replace('Rank:','')
#计算各类型漏洞个数
#print(len(bugsName))
for ii in range(len(bugsName)):
#print(ii)
bugsCount[ii]=len(re.findall(bugsName[ii],backInfo.text))+bugsCount[ii]
low_result=re.findall(r_low,backInfo.text)
mid_result=re.findall(r_mid,backInfo.text)
high_result=re.findall(r_high,backInfo.text)
critical_result=re.findall(r_critical,backInfo.text)
#开始计算总通过率
#print(total)
if percent==0.0:
percent='%.4f'%(float(valid)/float(total))
percent_str='%.2f'%(float(percent)*100.00)+'%'
#percent_str=str(float(percent)*100.00)+'%'
#修改写法,解决输出精度问题-2021-02-19
#percent_str='%.2f'%(float(percent)*100.00)+'%'
#计算完毕
#计算各等级漏洞数
low=low+len(low_result)
mid=mid+len(mid_result)
high=high+len(high_result)
critical=critical+len(critical_result)
#状态报告
print('第'+str(i)+'页,已处理!')
#开始计算等级占比
#开发中途废弃,原因为:各个用户可能存在不同等级漏洞为0的情况。
'''
low_percent='%.4f'%(float(low)/float(total))
low_percent_str=str(float(low_percent)*100.00)+'%'
mid_percent='%.4f'%(float(mid)/float(total))
mid_percent_str=str(float(mid_percent)*100.00)+'%'
high_percent='%.4f'%(float(high)/float(total))
high_percent_str=str(float(high_percent)*100.00)+'%'
critical_percent='%.4f'%(float(critical)/float(total))
critical_percent_str=str(float(critical_percent)*100.00)+'%'
'''
#print(percent_str)
except:
print('出现异常,中断进程')
break
#打印空行
print('n')
for i in range(len(bugsName)):
print(bugsName[i]+':'+str(bugsCount[i]))
#打印空行
print('')
print('计算完毕n用户昵称:'+name+'n总漏洞:'+str(total)+'t总Rank:'+rank+'t已通过:'+str(valid)+'t通过率:'+percent_str+'n低危:'+str(low)+'t中危:'+str(mid)+'t高危:'+str(high)+'t严重:'+str(critical))
#删除0值数据
#这里我自己已经看不懂了,但是可以用,测试后无法使用,废弃,2021/03/08
'''
for j in bugsName:
for jj in bugsCount:
if jj==0:
bugsName.remove(j)
bugsCount.remove(jj)
'''
'''经过测试,这个方法行不通,废弃。2021/03/08
#获取需要删除的元素的下标
delValues=[]
for j in range(len(bugsName)):
if(bugsCount[j]==0):
delValues.append(j)
print(bugsName)
print(bugsCount)
#通过下标删除元素
for d in delValues:
print(d)
del bugsName[d]
del bugsCount[d]
'''
#新办法启动,获取元素值然后删除
#首先获取元素的值
delName=[]
for j in range(len(bugsName)):
if(bugsCount[j]==0):
delName.append(bugsName[j])
#使用数组remove方法删除指定的值,因为漏洞名称是唯一的,可以使用该方法遍历删除
for d in delName:
bugsName.remove(d)
#同样的使用上面的方法删除漏洞数,因为是指定删除0,只需要删除一次即可,放他妈的屁,测试不行,要删除指定次数的0,无法一次删除完
for dc in range(len(bugsCount)-len(bugsName)):#这里贼复杂,可以简化,但是没有。
bugsCount.remove(0)
#最后修改成功,使用上面的办法
#画出危害等级比例图
#首先获取元素的值
bugsLevelCount=[low,mid,high,critical]
delLevelName=[]
for l in range(len(bugsLevel)):
if(bugsLevelCount[l]==0):
delLevelName.append(bugsLevel[l])
#使用数组remove方法删除指定的值,因为漏洞名称是唯一的,可以使用该方法遍历删除
for dl in delLevelName:
bugsLevel.remove(dl)
#同样的使用上面的方法删除漏洞数,因为是指定删除0,只需要删除一次即可,放他妈的屁,测试不行,要删除指定次数的0,无法一次删除完
for dlc in range(len(bugsLevelCount)-len(bugsLevel)):#这里贼复杂,可以简化,但是没有。
bugsLevelCount.remove(0)
#最后修改成功,使用上面的办法
#2021/03/10使用新表
'''
#画图
#解决中文乱码
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#圆饼图
colors=['m','r','g','y','c','m','y','b','c','g','c','r','y','c']
plt.pie(bugsCount,labels=bugsName,colors=colors,autopct='%3.2f%%')
plt.legend(loc='upper left')
plt.title(name+'各类型漏洞比例')
plt.axis('equal')
plt.show()
#画图
#解决中文乱码
plt2.rcParams['font.family'] = ['sans-serif']
plt2.rcParams['font.sans-serif'] = ['SimHei']
plt2.rcParams['axes.unicode_minus']=False #用来正常显示负号
#圆饼图
colors2=['c','b','y','r']
plt2.pie(bugsLevelCount,labels=bugsLevel,colors=colors2,autopct='%3.2f%%')
plt2.legend(loc='upper left')
plt2.title(name+'漏洞危害等级比例')
plt2.axis('equal')
plt2.show()
'''
title=name+'n总漏洞:'+str(total)+'t总Rank:'+rank+'t已通过:'+str(valid)+'t通过率:'+percent_str
page=Page(layout=Page.SimplePageLayout)
bar=Bar()
bar.__init__(opts.InitOpts(width="800px",height="400px"))
bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts={"interval":"0","rotate":45}),title_opts=opts.TitleOpts(title=title,subtitle='Data Analysis By MXPY',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_left='left'))
bar.add_xaxis(bugsName)
#错误写法
'''
for i in range(len(bugsName)):
bar.add_yaxis(bugsName[i],bugsCount[i])
'''
bar.add_yaxis(name+'各类型漏洞数',bugsCount)
page.add(bar)
pie=Pie()
pie.__init__(opts.InitOpts(width="800px",height="400px"))
colors=['#3BB4F2','#0E90D2','#F37B1D','#DD514C']
'''
低危 #3BB4F2
中危 #0E90D2
高危 #F37B1D
严重 #DD514C
'''
#pie.add("",[list(z) for z in zip([bugsLevel[0]],[bugsLevelCount[0]])],itemstyle_opts=opts.ItemStyleOpts(color=['red']))
#pie.add("",[list(z) for z in zip([bugsLevel[1]],[bugsLevelCount[1]])],itemstyle_opts=opts.ItemStyleOpts(color=['yellow']))
pie.add("",[list(z) for z in zip(bugsLevel,bugsLevelCount)])
#pie.add("",[list(z) for z in zip(bugsLevel[1],bugsLevelCount[1])])
pie.set_colors(colors)
pie.set_global_opts(title_opts=opts.TitleOpts(title=name+'漏洞危害比例',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"))
pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True,formatter="{b}:{c}"))
page.add(pie)
page.page_title=name
page.render(str(id)+".html",template_name='mxpy.html')
这里有个坑,网上都是说的旧版本的用法,pyechart后来有了新版本,我查了很多资料才明白怎么用。
page=Page(layout=Page.SimplePageLayout)
bar=Bar()
bar.__init__(opts.InitOpts(width="800px",height="400px"))
bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts={"interval":"0","rotate":45}),title_opts=opts.TitleOpts(title=title,subtitle='Data Analysis By MXPY',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_left='left'))
bar.add_xaxis(bugsName)
bar.add_yaxis(name+'各类型漏洞数',bugsCount)
page.add(bar)
pie=Pie()
pie.__init__(opts.InitOpts(width="800px",height="400px"))
colors=['#3BB4F2','#0E90D2','#F37B1D','#DD514C']
'''
低危 #3BB4F2
中危 #0E90D2
高危 #F37B1D
严重 #DD514C
'''
#pie.add("",[list(z) for z in zip([bugsLevel[0]],[bugsLevelCount[0]])],itemstyle_opts=opts.ItemStyleOpts(color=['red']))
#pie.add("",[list(z) for z in zip([bugsLevel[1]],[bugsLevelCount[1]])],itemstyle_opts=opts.ItemStyleOpts(color=['yellow']))
pie.add("",[list(z) for z in zip(bugsLevel,bugsLevelCount)])
#pie.add("",[list(z) for z in zip(bugsLevel[1],bugsLevelCount[1])])
pie.set_colors(colors)
pie.set_global_opts(title_opts=opts.TitleOpts(title=name+'漏洞危害比例',pos_left='center'),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"))
pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True,formatter="{b}:{c}"))
page.add(pie)
page.page_title=name
page.render(str(id)+".html",template_name='mxpy.html')
{% import 'macro' as macro %}
<html>
<head>
<meta charset="UTF-8">
<title>{{ chart.page_title }}</title>
{{ macro.render_chart_dependencies(chart) }}
{{ macro.render_chart_css(chart) }}
</head>
<body>
<style>.box { {{ chart.layout }} margin-top:50px;};
a{
text-decoration: none;
}
/*这里是伪类选择器*/
a:link {color:#FF0000;} /* 未访问的链接 */
a:visited {color:#00FF00;} /* 已访问的链接 */
a:hover {color:#FF00FF;} /* 鼠标划过链接 */
a:active {color:#0000FF;} /* 已选中的链接 */
</style>
{% if chart.download_button %}
<button onclick="downloadCfg()">Save Config</button>
{% endif %}
<div class="box">
<br />
{% for c in chart %}
{% if c._component_type in ("table", "image") %}
{{ macro.gen_components_content(c) }}
{% else %}
{{ macro.render_chart_content(c) }}
{% endif %}
{% for _ in range(chart.page_interval) %}<br/>{% endfor %}
{% endfor %}
</div>
<script>
{% for js in chart.js_functions.items %}
{{ js }}
{% endfor %}
</script>
<div style="text-align:center;">
<a href="https://data.shikangsi.com" target="_blank" />墨雪飘影</a><br />QQ:417230867<br />公众号:墨雪飘影
<br />
<!--
作者:墨雪飘影
时间:2021-04-17
描述:修改为查询页二维码
-->
<img src="https://p6-tt.byteimg.com/origin/pgc-image/0870757c026d46e7a49de671897b651a.png" width="160px" height="160px" alt="墨雪飘影"/>
<br />
<a href="https://data.shikangsi.com" target="_blank" />长按扫码查询或点我查询</a>
</div>
</body>
</html>
END
本文始发于微信公众号(F12sec):新版edusrc用户数据统计脚本【开源&分享】
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论