自动扫描全网漏洞的扫描器

“因为我相信你以后一定会成为很厉害的人呀”

设计初衷

    早在17年11月份的时候就有这个想法,可是一直没有去做,后来快到除夕前几天才正式开始整个软件工程的设计。当时的想实现的功能比较简单,就是能做到无限采集到网站使用的CMS,比如www。xx。com使用的是DEDECMS,那么我就把www。xx。com|dedecms这样的数据存到数据库里面,如果下次dedecms爆出新的漏洞后,我能在第一时间内发现哪些网站存在这个漏洞。那么这个软件工程的核心功能就必须满足以下的需求。

  1. 能无限爬行采集互联网上存活的网址链接
  2. 能对采集到的链接进行扫描验证
  3. Mysql数据库和服务器的负载均衡处理

    当然如果只是只检测CMS类型然后保存到数据库肯定是不够的,这样简单的功能并没有多大的优势,于是我选择了加入下列漏洞的扫描验证。

  1. 添加备份文件扫描功能
  2. 添加SVN/GIT/源码泄漏扫描功能,其中包括webinfo信息扫描
  3. 添加编辑器漏洞扫描功能
  4. 添加SQL注入漏洞的自动检测功能
  5. 添加使用Struts2框架的网站验证功能(居心叵测)
  6. 添加xss扫描检测功能(暂未实现)
  7. 添加扫描网站IP并且扫描危险端口功能
  8. 添加外链解析漏洞检测功能(暂未实现)
  9. 暂时想不到别的了,如果你有好的建议请联系我~

结果展示(0.95版本提供扫描结果)

    如图展示的都是扫描到的备份文件,敏感信息泄漏,注入,cms类型识别,st2框架,端口开放等等,挂机刷洞,基本上只要漏洞报告写得详细一点,勤快多写点,都可以通过审核,刷洞小意思,刷排名之类的都不在话下。
备份文件
cms类型
编辑器
端口开放
注入
st2
cnvd

用户交互模式

    需要使用Mysql数据库就无法避免数据库配置问题,首先是存储软件采集到的漏洞信息的数据库,我可以自己写一张数据库的结构的语句,然后让用户自己执行这份SQL文件,创建好这个数据库。

    其次就是数据库的连接问题,关于数据库的地址,帐号,密码等,因为每个人的环境都可能不一样,所以这一步肯定要有交互过程,那么填写数据库配置信息是直接运行软件后让用户输入数据库帐号密码还是新建一个配置文件呢?我选择了后者,新建了一个config.ini,里面不仅仅是填写数据库配置信息,还有这个软件的核心使用功能,比如说你只想无限采集网站和扫描备份文件,那么你可以在这个文件里面做好配置工作。

    为了避免每个人爬行到的数据重复,我的想法是首先让用户采集一些网址作为初始网址,然后基于这些网址开始无限爬行。如果是第一次运行的话应该提示导入初始网址,如果第二次运行呢?是不是还要继续导入初始网址然后继续爬行?那样就太没有艺术性了。我的办法是在上文提到的Config.ini文件里面有一个配置项,如果第一次运行的话会写入第一次运行并保存,然后以后每次运行前都先检测是不是第一次运行要不要导入之类的。(这里可以引伸出来,如果要无限爬行的话会出现一些内存垃圾没有及时回收,然后时间久后整个扫描都会变慢,那么就需要添加自动重启功能。)

    采集到了数据肯定要查看和保存利用,因为数据都在数据库里面,我想过另写一个软件,专门用来导出数据,方便一些不懂Mysql的用户使用。但是后来想想又觉得有些多余,仿佛有点侮辱在座的各位智商的意思。那么来总结一下思路,先写好两个文件=>Config.ini(数据库配置文件以及扫描器配置文件)&database.sql(数据库安装语句)=>然后用户自己先采集一些网站,保存在当前目录下的一个txt文件里面=>配置好相关的文件和环境后,开启扫描程序。

工程构架


    要实现的功能有点多,所以为了以后方便维护就应该把每个功能封闭在一个函数里面,这个函数接受一个参数URL,对传递进来的参数进行验证,验证过程中也有许多要注意的地方,比如无限采集网站函数中,对采集到的网站先访问一次,看看是不是存活的,避免把不能访问的网站添加进数据库,浪费时间和资源。检验存活的方式应该用head头访问方式,判断返回的状态码。

    还有判断CMS类别的话,不应该只限于CMS指纹方式扫描,还有在页面寻找关键词,访问robots.txt判断CMS类别。SQL扫描我一开始是直接爬行页面寻找可疑的注入点,然后加上单引号括号反斜杠之类,匹配数据库报错语句,虽然流程没错,但是在工程上不是很妥当,后来在098版本中,在数据库里面新建表,专门储存爬行到的注入注入链接,如果觉得扫描器自带的监测注入方法不全面,同样可以把这些爬行到的链接导出来,然后用sqlmap -m批量检测注入点。还有很多要注意的此处不表。

提高容错率与优化

    在扫描过程中肯定会出现误报情况,能加强的地方在验证漏洞的函数中,举个例子,使用ST2框架的网址,我的想法是加上常见的关键词后缀,然后判断页面返回关键词和状态码,这里肯定会有误报,需要改进的是多寻找误报页面的关键词,然后过滤。还有编辑器漏洞,我只加载了Webeditor和Fckeditor这两个编辑器的漏洞扫描验证,所以不是很全面(个人精力有限)。

    一般来说这种全网性质的扫描,基本上没有人舍得用自己的宝贝电脑挂机跑,都是丢在服务器。我的服务器是一台腾讯云1C1M2G的主机,运行095版本的时候,基本上开三个线程CPU保持在40%左右,还行。但是运行098版本的时候,同样的配置同样的线程,CPU持续90%左右。服务器负载太大,就不能在运行别的一些服务应用,于是我在程序中做了线程同步处理,还有一些地方做了优化,CPU使用率下降到20-40之间,但是带来的后果就是整个扫描速度变慢,于是我试着开了5个线程,CPU基本上稳定80%。加上自动重启后,自定义重启时间,基本上控制好在40-70之间,还是需要进一步优化。

代码功能补充

    比如在扫描备份文件的时候,办法是导入备份文件的字典。但是有一些网站的备份文件命名方式是以域名为名字。比如www。langzi。fun/langzi.rar这样的备份文件,这里就需要切割域名拼接成字典,当然后缀也不能只限于rar,还有zip,bak,sql,tar.gz,txt等等…检测CMS类别用到了三种方法来逐一检测,如果第一种方法成功识别CMS类别后就不再继续执行后面的两个方法,这样做一来是节省资源和时间,二来是数据浪费,你只需要知道这个网站用的CMS类别就可以了,没必要知道有多少种方式检测到的。

    当然还有SQL注入这一块,Sqlmap检测注入的顺序是B(盲注)E(数据库报错注入)U(union注入)S(多语句注入)T(基于时间注入)。一般来说,存在数据库现错注入,联合注入等方式的注入都支持盲注,什么意思呢,就是说盲注能发现并检测到注入,是最全面并且容错率很高的检测方式。然而这款扫描器用的检测注入识别方式是E(数据库报错),等到以后有机会在更新好了。编辑器漏洞这一方面由于别的编辑器漏洞利用条件有限,而且网上报出的编辑器漏洞基本都是几年前的,我也就没添加进去。还有主程序和自动重启的脚本是分开的,这样做方便服务器用户和个人版用户的使用。

Lang_cms 扫描器雏形 0.93版本

功能介绍

    0.93版本发布的时候是17年12月,那个时候比较匆忙,希望在年前把扫描器写出来,所以犯了一些错误。这个版本非常粗糙,甚至于数据库中的表名都是url_1,url_2这样,可以说是非常非常的难看了- -.其中的核心功能有cms识别,备份文件扫描和url无限采集。要命的是并没有做采集网址数据库去重处理,只是在无限采集函数中有去重,这样就会导致当你扫描了几千个网站后就又会爬行回来,继续采集这重复的几千个网站。

优点与缺点

    优点:速度快。抛开前文提到的诟病,在备份文件扫描这一块速度非常非常快,这得益于扫描器功能比较少,并且我是在我的笔记本上测试,开了20个线程….基本上十分钟之内可以扫到5个左右的备份文件,并且占用的资源CPU和内存都很少。

    缺点:没有数据库去重复,cms验证方式只有cms指纹识别这一个功能,并且每个指纹都会去扫描,数据库名称太丑,代码混乱我自己都看不懂我当时怎么写的。

补充说明

    虽然这个版本可以跑起来没错,但是需要进一步修改和优化的地方还有很多。比如数据库去重,cms识别多元化,附加更多的功能等等,这是一个很让人头疼的问题。我也因此滞留了一段时间,后来由于刘佩瑶的加入,帮我重新构架整个代码的工程,功能集成函数也是她提出来,基于她的重写代码和框架,0.95版本诞生了。

下载地址

    停止提供下载

Yoland_Liu 敏感情报扫描器 0.95版本

功能介绍

    某天无意和刘佩瑶聊起这个话题,见她有兴趣我就详说了这个扫描器的核心功能和工程设计思维(其实是这货毕业设计项目找不到合适的,跑过来问我有没有项目可以接手),但是我前面的构架代码写的太难看自己都不想去维护。接下来整个项目都交给她,基于核心思想上,写出了新版本,并且添加了新的功能。所以说刘老师鉴定了扫描器的代码命名,为后来我继续更新的0.98版本提供了更加完善的构架基础。为了纪念刘老师作出的杰出贡献,所以0.95版本的名字也叫Yoland_Liu危险情报采集扫描器。

优点与缺点

    优点:数据库数据重复处理,CMS验证方式新增为3种,包括识别页面关键字,robots.txt文件关键词识别,另外添加使用ST2框架网站的扫描,数据库优化,原始代码重写,更加稳定方便维护。

    缺点:虽然整体的框架优化好了,但是却没有做内存垃圾回收,线程的方面没有控制好,导致如果一直挂着的话后面速度会越来越慢。因为专业性的问题,还有一些漏洞扫描功能并没有添加进去,所以造轮子这个活就落在我身上,后面更新版本都是基于0.95版本上加上其他漏洞扫描功能。

补充说明

    这个0.95版本虽然在内存上没有做好优化,但是却可以通过加上自动重启功能来解决问题,并且与后来我写的0.98版本对比来说,0.95速度更快(因为需要扫描的项目功能比较少),更加稳定(0.98版本虽然功能添加很多,但是对服务器负载很重,虽然我在0.98版本中做了内存优化处理,并且也添加了自动重启功能,但是最多也只能开5个线程(CPU:80+%),最少开3个线程(CPU:40+%)),要注意的是,开启多线程最少要开3个。

下载地址

    停止提供下载

Yoland_Liu 敏感情报扫描器 0.98版本

功能介绍

    0.98版本完成于18年3月14日,暂时还没有想法去写0.99版本。但是对0.99版本的设想大致出来了,应该会添加xss,文件包含,外链解析,并且把SQL注入检测部分重写,检测注入方式用盲注检测等等,从一开始有点类似H产性质的扫描到后来专门为白帽子刷洞,添加更多敏感信息检测。

优点与缺点

    优点:这个版本的备份文件扫描功能中,添加了多元化切割网址,然后拼接备份文件后缀,以前的版本是提取主域名,整个网址再加上后缀作为备份文件路径。现在不止于这些,还有所有域名加上2017这样的路径等等,反正扫描更加全面彻底。添加了编辑器漏洞扫描功能,添加了 SQL扫描日志到数据库,可以把这些日志导出来然后用sqlmao -m来检测。添加了扫描网址对应IP的端口功能,还有优化数据库插入语句,在一定程度上减轻了服务器的负载。
    缺点:为了减轻服务器的负载,整个扫描器在核心功能上都做了延迟处理,虽然CPU负载下来了,但是效率也降低了30%左右。还有编辑器漏洞这一方面,因为没有找到编辑器漏洞的更多样本,所以在少量基数上写出的编辑器漏洞扫描还不是很准确全面。

补充说明

    总的来说,0.98是到目前为止功能最强扫描最彻底的一个版本,0.95是扫描效率最高的,并且有数据库去重,无限采集,备份文件,CMS类别等等核心功能都有。两者对比优缺点也很明显,0.95效率最高,如果你用自己的笔记本跑的话,可以开20个线程,速度起飞,服务器的话看你的配置,我的服务器1C1M2G开6个线程妥妥的.0.98版本在服务器我只敢开3个线程,开大了其他应用服务也别想运行了。

下载地址

    停止提供下载

使用说明

配置文件

    当你解压文件后要注意下面这几个文件,这些文件关系到数据库配置,软件个性化扫描,线程设置,初始扫描导入网站等等。

文件 文件说明
主程序.exe 启动的主程序
Config.ini 程序配置文件(设置数据库帐号密码,线程数,是否只执行某一个扫描功能)
mysql.sql 创建数据库文件
rar.txt 备份文件字典
cms.txt CMS检测的指纹

使用方法

  1. 首先安装好mysql数据库
  2. 把mysql.sql文件执行,然后刷新以下会发现多了一个数据库
  3. 配置Config.ini,上面部分是数据库配置相关设置,下面是软件扫描功能设置。

    需要注意的是Config.ini这个配置文件,上面的数据库配置很好理解,数据库地址设置127.0.0.1或者localhost都可以。

    为了更加多元化的使用,你可以选择性的使用某些功能,具体看参数是0还是1,这里0就是关闭的意思,1就是开启的意思,如果你想只检测cms,就设置cmsscan=1,另外thread_s对应的是线程数,new_start是检测是否第一次扫描,默认是1,设置1的话,每次打开都会提示让你导入一些网站作为初始网站。程序检测到加载初始网站后,会自动把这个参数改成0。关于导入初始网站,你可以采集一些网址,然后保存在主程序文件夹里面的一个文本中,当提示导入的时候输入这个文本的名字即可。第二次运行的时候,无需配置,扫描器会自动从数据库获取数据然后无限爬行扫描,如果这一方面还有疑问的话可以加我QQ联系我。

结语

    在这款扫描器诞生前一年,也就是17年2月份的时候,我也写过一款失败的扫描器(Iosmosis Scan),说来现在最新的0.98版本依稀可以看到ios scan的一点影子。不可否认ios scan是失败的,但是为现在的扫描器鉴定了大部分框架蓝图,比如备份文件和源码泄漏功能都是直接从那里继承过来的。ios scan还集成了数据库,ftp,telnet等爆破功能…说来感觉还是有点呆。

    0.98版本不会是结束,在未来的日子里会不断更新添加新的功能,遵循此扫描器的核心思想>>>>无限永久自动爬行。无限自动检测就是这款扫描器的灵魂,就像一只孜孜不倦的蜘蛛,把网织得越来越大。尽请期待。

Yoland_Liu 敏感情报扫描器 0.98优化版

添加一个新的脚本,能对扫描器实现自动重启,然而和0.98版本并没有什么区别。只是每隔一个小时自动重启扫描器罢了。

Yoland_Liu 敏感情报扫描器 0.98纪念版

扫描器核心思想

自动无限永久爬行采集网站链接,自动化漏洞扫描检测,实现挂机自动化挖掘漏洞。

简述

1.0.98纪念版就是0.99测试版本的前身,数据库配置完全一样,主界面也一模一样,自动导出扫描结果也一样。唯一的区别就是相对于0.99版本少了几种未授权漏洞的扫描功能,漏洞页面的准确率差了点,运行速度差了点,其他的都一样。
2.不过0.98纪念版和之前所有版本的区别就是一个天一个地了,不仅数据库结构改变,还多了新的未授权漏洞扫描功能,运行主界面改变,自动导出数据到本地。方便查询,自动发现漏洞后自动获取漏洞的标题,更加直观,漏洞的分类报告也更加详细。
3.并且在线程上进一步优化,Cython代码重构,运行速度提升120%左右,导致我的服务器上限最多只能开5个线程。
4.请务必关闭windows problem reporting服务和Windows Error Reporting Service服务(自行百度)
5.因为运行速度的提升,占用的资源相对提升,我在我的本机做测试,如果不关闭windows problem reporting|Windows Error Reporting Service的话,程序占用内存300-1600M,占用最高达到CPU16.8%(我的CPU八核),占用宽带最高0.7M/s。

使用方法

1 安装数据库
2 配置好config.ini
    按照对应的功能设置是否扫描即可
    1就是开启 0就是结束 最下面是线程数
    第一次运行设置new_start=1
3 把采集的网址保存在当前目录下的Yolanda_get_url.txt当中,然后程序自动导入该文本内保存的网址(网址要加上http://)
4 配置好用户专属KEY.ini文件
5 启动 YolAnda_scan0.98纪念版.exe
6 扫描结果自动分类保存到result目录下

数据库存储数据类型

url_index:所有主域名
url_check:所有扫描过的和没有扫描过的主域名网站
url_2index:所有子域名
url_2check:所有扫描过的和没有扫描过的子域名网站
url_backup:扫描备份文件,源码泄露
url_editor:扫描编辑器漏洞
url_cms:扫描验证cms类型
url_inj:扫描sql注入漏洞
url_inj_log:爬行到的可疑注入点
url_port:扫描网站的ip开放端口
url_st2:扫描使用struts2搭建的网站
url_unauthorized:未授权访问漏洞弱口令漏洞

扫描功能

1  备份文件扫描(根据域名生成特定字典,本地加载字典,添加备份目录)
2 源码泄露(Svn,Git源码泄露,webinfo信息泄露)
3 编辑器漏洞(Fck编辑器漏洞)
4 Sql注入漏洞(数据库报错判断注入,基于时间的盲注判断注入)
5 爬行网站的可疑注入点(导出,然后使用sqlmap -m批量检测)
6 Cms类型识别(内置三种方式识别Cms类型,导出,然后批量刷某cms的exp)
7 网站IP开放的危险端口扫描(扫描46个危险端口)
8 使用Struts2框架的网站(导出,然后批量刷st2漏洞)
9 未授权漏洞扫描功能包括:
 • Mongodb数据库未授权访问漏洞
 • Redis数据库未授权访问漏洞
 • ZooKeeper未授权访问漏洞
 • Elasticsearch未授权访问漏洞
 • Memcache未授权访问漏洞
 • Docker未授权访问漏洞
 • CouchDB未授权访问漏洞
 • Tomcat example 应用信息泄漏漏洞
 • Tomcat远程部署弱口令漏洞
 • Axis2弱口令漏洞
 • PHPmyadmin弱口令漏洞
 • Mysql数据库弱口令漏洞
 • Mssql数据库弱口令漏洞
 • FTP弱口令漏洞
 • Telnet弱口令漏洞
 • SSH弱口令漏洞
 • PHP探针泄漏信息漏洞
 • Tomcat后台管理弱口令漏洞
注意:弱口令账号密码内置字典,并不提供用户自定义字典输入。 

优化部分

1. 编辑器漏洞验证,扫描成功率接近100%
2. svn、git源码泄漏修复,扫描成功率100%
3. 扫描备份文件路径更加彻底,定义在备份文件前加上www/data/backup的目录,虽然这种做法很大程度的提高了扫描成功率,但是需要消耗三倍的时间,所以还是要做一些取舍。最终取消了www/data这两个目录级。
4. Sql注入稍作优化,提高一定的准确率。
5. 使用Cython重构代码,经过实验与0.98优化版对比,同样的网址扫描,速度提升了120%左右。
6. 因为编码问题无法匹配部分漏洞页面(就是说之前的版本有些漏洞扫描到了但是没办法验证)在0.98纪念版做了修复,但是并不能达到100%漏洞页面匹配。

数据库文件展示





下载地址:

停止提供下载

Yoland_Liu 敏感情报扫描器 0.99测试版本

扫描器核心思想

自动无限永久爬行采集网站链接,自动化漏洞扫描检测,实现挂机自动化挖掘漏洞。

简述

其实0.99测试版本和0.98纪念版基本完全一样,用的数据库也是一样的。稍微有几点区别:

1. 0.98纪念版禁止扫描gov和edu的网站。
2. 在未授权漏洞扫描插件中,0.98优化版比0.99测试版少6种漏洞扫描。
3. 在漏洞页面匹配中,做了更加全面的匹配度,相对于0.98纪念版可以匹配到更多的漏洞页面(同样不能达到100%匹配)
4. Python字符节重新编译成C++文件,官网说运行速度至少可以提升0-258%,经过与0.98优化版作对比,同样的网址扫描,速度提升了200%左右。
5. 因为速度相对于之前的版本提升将近两倍,这同时意味着相对于之前版本在同一时刻发起的网络请求次数会提升两倍,但是我服务器宽带上限是1M,所以非常可能造成网络堵塞,0.98优化版提升120%的速度就只能开3个线程,在服务器做测试开了3个线程,查看服务器状态的时候内存溢出了。这个时候就需要更高配置的服务器,这也是一个缺点吧。
6.请务必关闭windows problem reporting服务和Windows Error Reporting Service服务(自行百度)
7.因为运行速度的提升,占用的资源相对提升,我在我的本机做测试,如果不关闭windows problem reporting|Windows Error Reporting Service的话,程序占用内存600-3500M,占用最高达到CPU19.9%(我的CPU八核),占用宽带最高0.7M/s。

使用方法

1 安装数据库
2 配置好config.ini
    按照对应的功能设置是否扫描即可
    1就是开启 0就是结束 最下面是线程数
    第一次运行设置new_start=1
3 配置好用户专属KEY.ini文件
4 把采集的网址保存在当前目录下的Yolanda_get_url.txt当中,然后程序自动导入该文本内保存的网址(网址要加上http://)
5 启动 YolAnda_scan0.99测试版.exe
5 扫描结果自动分类保存到result目录下
7 需要确保计算机安装Visual C++ Redistributable Package 安装运行使用 Visual Studio 2012 生成的 C++ 应用程序所必需的运行时组件。
下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=30679

数据库存储数据类型

url_index:所有主域名
url_check:所有扫描过的和没有扫描过的主域名网站
url_2index:所有子域名
url_2check:所有扫描过的和没有扫描过的子域名网站
url_backup:扫描备份文件,源码泄露
url_editor:扫描编辑器漏洞
url_cms:扫描验证cms类型
url_inj:扫描sql注入漏洞
url_inj_log:爬行到的可疑注入点
url_port:扫描网站的ip开放端口
url_st2:扫描使用struts2搭建的网站
url_unauthorized:未授权访问漏洞弱口令漏洞

扫描功能

1  备份文件扫描(根据域名生成特定字典,本地加载字典,添加备份目录)
2 源码泄露(Svn,Git源码泄露,webinfo信息泄露)
3 编辑器漏洞(Fck编辑器漏洞)
4 Sql注入漏洞(数据库报错判断注入,基于时间的盲注判断注入)
5 爬行网站的可疑注入点(导出,然后使用sqlmap -m批量检测)
6 Cms类型识别(内置三种方式识别Cms类型,导出,然后批量刷某cms的exp)
7 网站IP开放的危险端口扫描(扫描46个危险端口)
8 使用Struts2框架的网站(导出,然后批量刷st2漏洞)
9 未授权漏洞扫描功能包括:
 • Mongodb数据库未授权访问漏洞
 • Redis数据库未授权访问漏洞
 • ZooKeeper未授权访问漏洞
 • Elasticsearch未授权访问漏洞
 • Memcache未授权访问漏洞
 • Docker未授权访问漏洞
 • CouchDB未授权访问漏洞
 • Tomcat example 应用信息泄漏漏洞
 • Tomcat远程部署弱口令漏洞
 • Axis2弱口令漏洞
 • PHPmyadmin弱口令漏洞
 • Mysql数据库弱口令漏洞
 • Mssql数据库弱口令漏洞
 • Oralce数据库弱口令漏洞
 • Postql数据库弱口令漏洞
 • FTP弱口令漏洞
 • Telnet弱口令漏洞
 • SSH弱口令漏洞
 • PHP探针泄漏信息漏洞
 • Tomcat后台管理弱口令漏洞
 • CGI文件读取漏洞
 • DNS域传送漏洞
 • Resin远程文件读取漏洞
 • JBoss后台上传漏洞
 • Weblogic后台管理弱口令漏洞
 • JOnAS后台管理弱口令漏洞
 • Weblogic CVE-2018-2628漏洞
 • MS17-010 SMB远程溢出漏洞
 • HTTP.sys远程代码执行漏洞
 • Glassfish弱口令漏洞
 • Grafana弱口令漏洞
 • Zabbix latest SQL注入漏洞
 • Wordpress弱口令漏洞

注意:弱口令账号密码内置字典,并不提供用户自定义字典输入。

效果演示

与0.98纪念版展示效果一致

文件描述

运行界面

结果展示







停止提供下载

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%