从Dradis导入漏洞报告至MediaWiki的自动化脚本指南

本文详细介绍如何通过Ruby脚本将Dradis中的安全漏洞报告批量导入MediaWiki系统,包括数据库连接配置、标题去重处理、媒体维基API集成等关键技术实现,解决跨项目漏洞复用难题。

MediaWiki Dradis导入工具

长期以来我一直计划将所有Dradis问题项导入MediaWiki,以便更轻松地重复使用问题。到目前为止,每次想要重用某个问题时,我都必须打开新浏览器,返回查找使用过该问题的旧项目,然后复制粘贴到新项目中,这非常麻烦。于是我最终下定决心创建了一个MediaWiki虚拟机,设置过程很简单,这里就不赘述了,请参考其安装说明。接下来我创建了一些条目并设置Dradis以确保它能与MediaWiki通信,同样地,这在Dradis指南部分有完整文档,因此我也不再赘述。

随后我拥有了一个完全可用的Wiki以及它与Dradis之间的通信,但问题是我已经编写了大量问题项,它们分散在Dradis的多个项目中,如何将它们提取出来?这就是这个脚本的用武之地。

脚本功能

该脚本打开您的Dradis数据库,查找所有问题项,进行去重,然后以正确格式插入到MediaWiki中。由于我不想弄乱Dradis虚拟机,我认为获取远程数据库访问的最简单方法是使用SSH端口转发,这让我可以从开发机器访问数据库,就像本地访问一样,无需修改虚拟机上的任何内容。

第二个问题是与MediaWiki通信。我最初的想法是直接将条目插入其数据库,但这比我想象的要困难,因为它不像向单个表添加条目那么简单。下一个选择是寻找一个gem来帮我完成,果然我找到了一个——mediawiki-gateway。我尝试从标准gem命令行安装它,但不幸的是由于它似乎依赖于自身而失败,因此我必须从GitHub源代码安装——这可能现在已经修复,但我没有尝试更新后的gem。它似乎也只适用于Ruby < 2,所以我使用了1.9.3。

之后,这是一个相当简单的情况:找出问题项在Dradis数据库中的存储位置,抓取它们,重新格式化并通过gem推送它们。在每个成功导入的问题后,我生成其哈希值,并与每个新页面的哈希值进行比较,以检查并拒绝重复项。有些仍然漏网了,我认为这可能是因为某些重复项末尾有多余的空格,但数量不多,我不需要担心调试它。

标题处理

我基于问题标题来命名MediaWiki文章,这最初来自标记为#[Title]#的字段,如果您对标题使用不同的标签,只需编辑第10行并将值更改为您使用的任何内容。

我还必须解决几个其他问题:MediaWiki将标题限制为255个字符,因此我将标题修剪到该长度。MediaWiki不允许重复标题,因此为了删除这些,我开始在末尾添加随机数字,这意味着我必须从标题中再删除一些字符,但这应该没问题。这工作得很好,直到我遇到一个以数字结尾的标题。在其末尾添加新数字仍然被拒绝为重复项。我试图解决这个问题但放弃了,尝试在数字前面添加,这有效,所以我坚持使用它。

使用说明

一旦安装了gateway gem,脚本只需要配置,这些是您应该编辑的脚本顶部的字段:

1
2
3
4
5
6
7
8
9
TITLE_FIELD = "#[Title]#"
DB_NAME = "dradispro"
DB_USER = "dradispro_db"
DB_PASSWORD = "dradispro_db_pass"
DB_PORT = 3307

MEDIAWIKI_URL = 'http://192.168.0.1/api.php'
MEDIAWIKI_USER = "robin"
MEDIAWIKI_PASSWORD = "x"

然后从本地机器到Dradis盒子进行SSH端口转发:

1
ssh -L 3307:localhost:3306 dradispro@dradispro.local

您可以通过以下方式检查是否工作:

1
mysql --port=3307 -h 127.0.0.1 -u dradispro_db -pdradispro_db_pass -D dradispro

如果您获得连接,则表示工作正常。

现在只需运行脚本:

1
./mediawiki_import.rb

它会输出大量关于正在执行的操作的信息,最后给出导入的问题数量统计。

如果您想从多个Dradis副本导入,请查看脚本中的第31行,它会告诉您如何实现这一点。

下载

下载 mediawiki_dradis_import_1.0.tar.bz2

变更日志

版本1.0

首次发布


该脚本是作为一次性黑客编写的,用于导入我的数据,我不打算维护它,但如果您确实发现问题,请告诉我,我会看看能做什么来修复它。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计