安服日常工作,每次客户现场扫描发现漏洞很多,可每次晚上都要加班输出报告。
有时一种类型漏洞较多,写的混,还要重新输入,所以有了开发渗透测试报告生成的想法。
正常思路: 添加项目-》添加资产-》添加漏洞-》导出报表
一、前期准备
1.功能
普通用户:登录、添加项目、添加资产、添加漏洞、添加漏洞类型
管理员:管理用户、项目审核、日志查看、报告模板管理
2.工具
架构: thinkphp6+mysql+PearAdmin+PHPOffice
开发: PHPStorm、Navicat、ApiPost7
二、开发过程
1.API接口
通过Api.php 控制器 调取参数act通过parse_name转换驼峰格式
api 路由
Route::rule("api/v1/:act","Api/index","POST")->ajax()->pattern(['act' => '.*']);
例如: /api/v1/pte/bug_list
则调用 Pte.php
控制器 bugList
方法
Api.php 控制器处理逻辑
<?php
public function index()
{
$request = request()->param('act');
$request = explode("/",trim($request,"/"));
if(count($request) == 1){
$controller = "Common"; # 默认控制器
$method = parse_name($request[0],1,false);
}elseif(count($request) == 2){
$controller = parse_name($request[0],1,true);
$method = parse_name($request[1],1,false);
}else{
return error("Route not exists.");
}
try {
$controller = '\\app\\api\\'.$controller;
$controllerClass = invoke($controller);
if (($controllerClass instanceof Base) === false) {
return error("Extend 'Base' controller.");
}
} catch (ClassNotFoundException $e) {
return error("Controller not exists.");
}
if(method_exists($controllerClass,$method)){
$controllerClass->$method();
}else{
return error("Method not exists.");
}
}
?>
2.漏洞列表
<?php
# fileName: Pte.php
public function bug_list()
{
$info = Db::name("pte_list")
->where("id",$this->post['id'])
->find();
$info or $this->error("项目信息不存在!");
$bugType = [
"Web安全" ,
"网络传输安全" ,
"业务逻辑安全" ,
"中间件安全" ,
"服务器安全"
];
$list = Db::name("pte_bug")
->field("id,pte_id,bug_level,bug_type,(select `name` from sf_pte_bug_type where id = bug_type_info) as `bug_info`")
->where("is_delete",0)
->where("pte_id",$this->post['id'])
->order("create_time","DESC")
->order("id","DESC")
->withAttr("create_time",function ($val) {
return date("Y-m-d H:i:s",$val);
})
->withAttr("bug_type",function ($val) use( $bugType ) {
return $bugType[intval($val-1)];
})
->select();
return result($list);
}
?>
3.生成报告
使用的是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']);
...........
}
?>
按照上面复制块以后 然后再进行变量替换 写好代码以后就可以下载文档了
三、页面功能
1.登录
2.首页
3.项目列表
4.添加资产
5.漏洞列表
四、已知问题
目前已知的BUG 不能直接生成目录 需要下载后手动更新一下
如果复制块时候发现无法复制时候 复制删除块失效
在开头添加代码(这是个坑 坑了我一下午的时间)
ini_set('pcre.backtrack_limit', 999999999);