depy

It is a long and beautiful life.

开发一个渗透报告文档生成系统-从0到1

网络安全

前言

每次公司出去做渗透测试,我每次日内网日的都很爽。写报告的时候一直喷自己妈的挖这么多写的好累。

于是想到了使用一个框架,通过接口方法引用phpword把要写的东西放到模版里,这样又省力又简单(真的很讨厌office)。

所以我的期望是,通过前端的表单,把漏洞名称、漏洞详情、修复方法设置成键值对,然后变成变量引入模版中。之后就是省时省力的下载表格发给公司了。然后申请个软著薅公司羊毛。

开始写

现在在上c#的课程,实在听不懂,所以开始写吧。

我这里使用的框架是phpword,根据网上的代码 先测试一遍文件是否有问题

6052ea3b6dad9.png

<?php
include_once "vendor/autoload.php";
 
$tmp=new \PhpOffice\PhpWord\TemplateProcessor('a.docx');//打开模板
$tmp->setValue('name','XX教育局');//替换变量
$tmp->setValue('author','小北');//替换变量
// $tmp->setImageValue('picture', ['path' => '1.png','width'=>500,'height'=>500]);//添加图片
$tmp->saveAs('b.docx');//另存为

生成后打开word 发现成功覆盖了变量

之后学习块复制和行复制的有关知识 成功覆盖

类似:

6052f677cfb67.png

6052f68bb60a7.png

代码如下:

<?php
include_once "vendor/autoload.php";
$tmp=new \PhpOffice\PhpWord\TemplateProcessor('a.docx');//打开模板
$tmp->setValue('name','教育局');//替换变量
$tmp->setValue('author','小北');//替换变量
$tmp->setValue('write_time','2021-03-08');//替换变量
$tmp->setValue('objectlist','*');//替换变量
$tmp->setValue('testtime','*');//替换变量
$tmp->setValue('buglevel','高危');//替换变量

$arr=[
    ['bug'=>'漏洞1','bug_num'=>'3'],
    ['bug'=>'漏洞2','bug_num'=>'1'],
    ['bug'=>'漏洞3','bug_num'=>'1'],
];
$rows=count($arr);//总行数
$tmp->cloneRow('bug',$rows);//复制行
for($i=0;$i<$rows;$i++){
    $tmp->setValue("bug#".($i+1),$arr[$i]['bug']);//替换变量
    $tmp->setValue("bug_num#".($i+1),$arr[$i]['bug_num']);
}

$tmp->cloneBlock('WIN_BLOCK',$rows,true,true);
for($i=0;$i<$rows;$i++){
    $tmp->setValue('bug_name#'.($i+1),$arr[$i]['bug']);
    $tmp->setValue('bug_detail#'.($i+1),$arr[$i]['bug']);
    $tmp->setValue('bug_fix#'.($i+1),$arr[$i]['bug']);
}
// $tmp->setImageValue('picture', ['path' => '1.png','width'=>500,'height'=>500]);//添加图片
$tmp->saveAs('b.docx');//另存为

差不多学习了一遍前端的表单

这里使用layui 作为我们的提交表单 通过表单传递json数据给接口 接口判断值是否不空后循环赋值

这里考虑到漏洞细节的多样性 无法定死 所以删掉漏洞细节的变量 仅仅产生一个除了漏洞细节以外全部都编辑好的word文档 这样也可以省去很多的时间

表单类似

6052fb5de309f.png

继续开发 开发完补充

回来了~

随便写了个layui的表单

6053132d91cbf.png

考虑到漏洞不唯一 所以需要动态增加内容 也就是使用js监听点击按钮 点击后追加html代码 然后局部刷新table

最终的效果类似

  1. 表单提交

  2. 接口解析json

  3. word生成

  4. 下载内容后清空文件(可以写个定时的任务清空某目录内容,最好两分钟一删)

继续写前端了 

各种学习js 妈的真后悔以前没有好好学js

60532311a26a7.png

面向百度编程 总算搞明白js一点了

605327e7c9746.png

耗时一晚上才解决 其实最麻烦的是 通过table把动态生成的记录变成数组 然后变成对象 因为我不会

他妈的一直没有搞明白 最后通过下面的代码实现了 大致意思就是通过tables元素逐个获取tr的值

  form.on('submit(demo1)', function(data){
    var trs = $("#tables tr");
	var resultbug = [];
	for (var i = 1; i < trs.length; i++) {
		var tds = $(trs[i]).find("td");
		var databug={};
        databug['name']=tds[0].getElementsByTagName("input")[0].value;
        databug['bugtype']=tds[1].getElementsByTagName("input")[0].value;
        databug['bugnum']=tds[2].getElementsByTagName("input")[0].value;
        databug['bugfix']=tds[3].getElementsByTagName("input")[0].value;
		resultbug.push(databug);
	}
	
var arr1 = []
for (let i in data.field) {
    let o = {};
	o = data.field[i];
	arr1.push(o)
}

var arr2 = []
for (let i in resultbug) {
    let o = {};
	o = resultbug[i];
	arr2.push(o)
}

这个写完了的话,后端开发就容易多了。

也就是设置变量然后更改 测试了一晚上 非常疲惫 可以看到 下载了十八次的docx

60536cbde12e8.png

但是最终还是做完了 非常方便

60536dc28234e.png

60536dd85a43c.png

60536e1ef0b1f.png

60536e47075cd.png

剩下的就是照猫画虎 根据大致的代码拓展diy

然后就是设置生成目录 做个脚本两分钟rm一次 防止文档外泄

后记

感谢一些朋友给我的帮助,也补充了一些对象、数组、json之间转换的知识点。

果然编程可以改变世界,写了一天了!又多了一个自己的开发成果,开心~