开发一个渗透测试报告生成系统 从0到1的过程

一、前言

每次渗透测试漏洞都是挖的贼多,但是到写报告时候发现我去好烦的。

在次基础上,为了想要偷懒的我,被迫写一个自动化生成系统模板。

我的开发思路是通过网页添加漏洞然后储存到数据库,然后最后生成读取数据库内容生成漏洞报告。简直是一气呵成~

我用的工具是MAMP Pro(Mac下的Web集成环境)、PhpStorm、光年后台模板的iframe版本

二、页面

  • 登录页面
  • 欢迎页面
  • 报告列表
  • 生成报告
  • 添加资产
  • 添加漏洞
  • 生成报告

三、开发

我使用的是PHPWORD框架 使用composer安装框架

# 下载安装程序
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"

# 安装composer
php composer-setup.php

# 删除安装程序
php -r "unlink('composer-setup.php');"

# 移动安装的程序
sudo mv composer.phar /usr/local/bin/composer
# 拉取phpword框架(--ignore-platform-reqs 参数是不指定版本的【推荐】)
composer require --ignore-platform-reqs phpoffice/phpword

然后直接包含程序就可以了

include_once "vendor/autoload.php";

创建模板 然后使用框架引入 然后使用变量替换

<?php
    $doc = new \PhpOffice\PhpWord\TemplateProcessor('../template/pte.docx');
    $doc->setValue('unit_name',"XXX单位");
    $doc->setValue('today_time',"2021-07-06");
    $doc->setValue('project_name',"XXX项目");
    $doc->setValue('todayTime',date("Ymd",time()));
    $doc->setValue('create_user',"Admin");
    $doc->setValue('unit_people',"甲方对接人");
    $doc->setValue('yeMei',date("Ym",time()));
    $doc->setValue('start_time',"2021-07-01");
    $doc->setValue('end_time',"2021-07-06");
?>

漏洞处 创建模板 然后使用块复制 可以根据漏洞数量复制块 在进行变量替换

从 ${FX_BUG_INFO} 到 ${/FX_BUG_INFO} 创建的块 可以根据漏洞数量进行复制

<?php
# 复制块方法
# $bugInfo 变量为从数据库查询出的数据数组
$rows=count($bugInfo);
# 复制块
$doc->cloneBlock('FX_BUG_INFO',$rows, true, true);
for($i=0;$i<$rows;$i++){
    $doc->setValue("fx_bug_type_info#".($i+1),$fx_bug_num_ord.' '.$bugInfo[$i]['type']);
    ........... 
}
?>

按照上面复制块以后 然后再进行变量替换 写好代码以后就可以下载文档了

可以写一个表单 然后提交漏洞信息 这样的话可以在添加漏洞时 会自动生成漏洞描述、漏洞等级、漏洞修复建议等等。

添加的漏洞 直接导入数据库 在生成报告时候只需要填写复现过程就可以 其他的可以直接从数据库读取 这样可以偷更多的懒

复现过程可以直接用 wangEditor 轻量Web编辑器 配置图片上传功能就可以了

function uploadImg(){
    checkLogin();
    if(!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']){
        returnInfo("会话校验失败 请刷新后尝试~");
    }
    if(!$_FILES){
        returnInfo("会话校验失败 请刷新后尝试~");
    }
    $dir = WWWROOT."upload/";
    if (!file_exists($dir)) {
        mkdir($dir, 0755);
    }
    if (!in_array($_FILES['file']['type'], ["image/jpeg", "image/png", "image/gif", "image/jpg"])) {
        returnInfo("请上传图片 不要上传其他类型文件~");
    }
    $filename = explode('.',$_FILES["file"]["name"]);
    $name_suffix = end($filename);
    if (!in_array($name_suffix, ["jpg", "jpeg", "png", "gif", "bmp"])) {
        returnInfo("请上传图片 不要上传其他类型文件~");
    }
    if($_FILES[ 'file' ][ 'size' ] > intval(5 * 1024 * 1024)){
        returnInfo("上传图片大小限制最小 5MB~");
    }
    $imgPath = $dir.date('Y-m-d',time()).'_'.substr(md5(sha1(uniqid('', true) . mt_rand(1000000000, 9999999999))), 0 , 8).'.'.$name_suffix;
    if (!move_uploaded_file($_FILES['file']['tmp_name'], __DIR__.'/..'.$imgPath)) {
        returnInfo("上传图片失败~");
    }
    $msg = array();
    $msg['errno'] = 0;
    $msg['data'] = array(array(
        "url" => $imgPath,
        "alt" => "",
        "href" => ""
    ));
    returnInfo("OK",1, $imgPath);
    die(json_encode($msg));
}

四、后记

目前已知的BUG 不能直接生成目录 需要下载后手动更新一下

如果复制块时候发现无法复制时候 复制删除块失效

在开头添加代码(这是个坑 坑了我一下午的时间)

ini_set('pcre.backtrack_limit', 999999999);

最后说一句 PHP是最好的语言

五、参考

  1. PHPWORD中文手册
  2. PHPWord复制块cloneBlock及删除块deleteBlock无效的解决办法

评论

  1. 小龙
    Macintosh Chrome

    大佬,这个开源否?

    4天前
    2021-10-18 9:06:18

发送评论 编辑评论


				
上一篇