前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >高效率开发Web安全扫描器之路(一)

高效率开发Web安全扫描器之路(一)

原创
作者头像
汤青松
发布于 2022-11-30 03:44:52
发布于 2022-11-30 03:44:52
3870
举报
文章被收录于专栏:PHP技术大全PHP技术大全

一、背景

经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖掘的,比如说下面是CNVD上面的白帽子大佬

我想成为大佬要怎么做

我一直觉得自己是一个有梦想的人,我也想有一天自己的ID能出现在排行榜中,于是我凭借着自己那一点开发知识,认真研究了一下市面上的安全工具,以及怎么开发安全工具。

安全工具分析

经过我得研究发现市面上的安全工具其实只有两类,一类是面向某个漏洞的工具比如SQLMap,另外一个一类是综合扫描工具,比如AWVS;

作为一个只想挖漏洞的我,我更偏向于综合型的扫描器开发,可是综合型的扫描器开发难度真的很大,要清晰地了解各种漏洞的原理,而且还需要把他们使用代码去实现,如果是我一个人从头开发我压根做不到啊。

但我并不打算放弃,我准备集结天下之利器,为我扫描器所用;理想是有了,但现实是我要怎么实现,这可真实苦恼了我。

二、 要做的东西

我想要做的扫描器核心目的就是要使用简单,另外就是我可以随心所欲的修改;我希望是我只要给他一个URL地址,它就可以帮我扫描网站的漏洞,以及这个主机本身的漏洞

细致的拆解了一下,我觉得最需要的功能有这几个

  1. 能自动收集URL地址,爬虫收集和爆破收集
  2. 能从URL中提取主机IP
  3. 能快速检测常见的热门POC
  4. 能自动识别网站的指纹信息
  5. 能对IP进行端口快速扫描
  6. 能对端口的banner识别出服务
  7. 能检测出SQL注入漏洞
  8. 能检测出反射性XSS漏洞
  9. 能够通过指纹信息,使用对应的POC工具
  10. 能够快速扩展功能,且不影响整体逻辑

第一版本差不多就是这些功能吧,功能虽然不算多,但如果完全从头开始实现开发时间可不少。

三、思路分析

为了达到高效率的同时又能自主可控,我决定做一个有水平的缝合侠,简单理解就是我要把很多工具巧妙的融入到我开发的工具来,这里需要考虑的第一个问题是每个工具的使用方法、输入的参数、输出的结果都是不一样的,工具A的结果工具B不一定认识。

要解决这个问题,说简单也简单说难也难,总之我是摸着石头过河成功了;原理是自己给每个工具做一个壳,外部要调用工具A需要先调用工具A的壳,然后才会传到工具A,当工具A返回了结果,工具A的壳也会最先拿到,然后将结果解析出来并按照统一的格式输出就可以了。

通过这个简单的办法,我相当于把其他的安全工具变成了我得一个函数,我需要的时候调用这个函数就可以了。

按照我前面提到的需求,我梳理了一下要试用的工具有这几个:

序号

序号

需求

工具

1.

爬去URL的有

RAD

2.

爆破URL的有

DIRMAP

3.

提取主机IP

正则

4.

快速检测热门POC

xray

5.

识别网站的指纹

dismap

6.

对IP端口快速扫描

masscan

7.

能对端口的banner识别出服务

nmap

8.

能检测出SQL注入漏洞

sqlmap

9.

能检测出反射性XSS漏洞

xsser

这些工具都是比较常见的工具,我第一步需要对他们的使用方法熟悉,以xray工具为例

xray的使用命令如下所示

代码语言:txt
AI代码解释
复制
./xray_linux_amd64 webscan --url "http://192.168.1.100/" --json-output /tmp/11.json

当xray执行完毕之后,他会将结果输出到指定位置,但是数据格式并不是我所期望的,我需要将它的格式读入,然后再转换成我所需要的格式。

这里我用PHP写了一个简单的脚本,他做了这几件事情:

  1. 定义了参数来源位置和结果输出位置
  2. 获取参数中的URL,并执行xray工具
  3. 获取xray的执行结果,并解析成自定义格式
  4. 将最终的结果写入到输出位置

代码示例如下所示

代码语言:txt
AI代码解释
复制
<?php
//获取输入的参数
$inputFile = "/data/share/input_".getenv("xflow_node_id").".json";
$outputFile = "/data/share/output_".getenv("xflow_node_id").".json";

//没有input,直接返回
if (!file_exists($inputFile)) {
    var_dump($outputFile, json_encode(['code' => 0, 'msg' => "{$inputFile}文件不存在", 'data' => []], JSON_UNESCAPED_UNICODE));
    return 0;
}
//读取上游数据
$inputData = json_decode(file_get_contents($inputFile), true);

$url = $inputData['url'];
$data = execTool($url);

//将结果写入到指定位置,供蜻蜓平台导入数据
file_put_contents($outputFile, json_encode($data, JSON_UNESCAPED_UNICODE));


//将工具执行
function execTool($url)
{

    $hash = md5($url);
    $resultPath = "/tmp/{$hash}/tool.json";
    //清理之上一轮的结果
    if (file_exists($resultPath)) unlink($resultPath);
    //创建文件夹
    if (!file_exists(dirname($resultPath))) {
        mkdir(dirname($resultPath), 0777, true);
    }

    $result = [];

    $toolPath = "/data/tools/xray";
    if (!file_exists($toolPath)) die("xray 工具目录不存在:{$toolPath}");

    $path = "cd $toolPath && ";
    // 通过系统命令执行工具
    $cmd = "{$path} ./xray_linux_amd64 webscan --url \"{$url}\" --json-output {$resultPath}";
    echo $cmd;
    exec($cmd, $result);

    $toolResult = file_exists($resultPath) ? file_get_contents($resultPath) : '[]';
    $toolResult = json_decode($toolResult, true);
    print_r($toolResult);
    return $toolResult;
}

再来sqlmap封装的例子,首先需要知道sqlmap的使用的方法,如下所示

代码语言:txt
AI代码解释
复制
sqlmap -u "http://192.168.1.100/index.php?id=1"  --batch  --random-agent 

当sqlmap执行完毕之后,我需要知道他的执行结果在什么位置,并将结果解析出来,按照规范化的格式输出到指定地址。

这里我同样用PHP写了一个脚本,做了这几件事情:

  1. 定义了参数来源位置和结果输出位置<?php //获取输入的参数 $inputFile = "/data/share/input_".getenv("xflow_node_id").".json"; $outputFile = "/data/share/output_".getenv("xflow_node_id").".json"; //没有input,直接返回 if (!file_exists($inputFile)) { file_put_contents($outputFile, json_encode([])); return 0; } //读取上游数据 $list = json_decode(file_get_contents($inputFile), true); print_r($inputFile); print_r($list); $data = []; //处理数据 foreach ($list as $val) { $url = $val['url']; $toolPath = "/data/tools/sqlmap/"; print_r("开始扫描URL:{$url}".PHP_EOL); execTool($url, $toolPath); //录入检测结果 $tempList = writeData($toolPath, $url); print_r("扫描URL:{$url}完成".PHP_EOL); print_r($tempList); $data = array_merge($data, $tempList); } print_r($data); //将结果写入到指定位置,供蜻蜓平台导入数据 file_put_contents($outputFile, json_encode($data, JSON_UNESCAPED_UNICODE)); function writeData($toolPath, $url) { $arr = parse_url($url); $file_path = $toolPath . 'result/'; $host = $arr['host']; $outdir = $file_path . "{$host}/"; $outfilename = "{$outdir}/log"; //sqlmap输出异常 if (!is_dir($outdir) or !file_exists($outfilename) or !filesize($outfilename)) { print_r("sqlmap没有找到注入点: $url"); return []; } $ddd = file_get_contents($outfilename); print_r($ddd); exec("rm -rf $outdir"); return [["raw" => $ddd]]; } function execTool($v, $toolPath) { $arr = parse_url($v); $blackExt = ['.js', '.css', '.json', '.png', '.jpg', '.jpeg', '.gif', '.mp3', '.mp4']; //没有可以注入的参数 if (!isset($arr['query']) or (strpos($arr['query'], '=') === false)) { print_r(["URL地址不存在可以注入的参数".PHP_EOL, $v]); return false; } $file_path = $toolPath . 'result/'; $cmd = "cd {$toolPath} && python3 ./sqlmap.py -u '{$v}' --batch --random-agent --output-dir={$file_path}"; exec($cmd); return true; }
  2. 获取参数中的URL,并执行sqlmap工具
  3. 获取sqlmap的执行结果,并解析成自定义格式
  4. 将最终的结果写入到输出位置

通过前面xray和sqlmap两个工具封装的例子,你回发现其实每个工具封装的流程都差不多,差一点只是程序的输出结果解析而已,所以到现在位置我解决了扫描器的能力问题。

四、动手实践

现在只需要我把几个功能连接起来就行了,这里需要考虑一个新的问题;sqlmap所需要的参数确是具体的多个URL地址,也就是说在调用sqlmap之前,我需要把URL都收集好再调用sqlmap,这里就有数据依赖问题。

这个问题也好办,我们需要准备三张表: 目标表、功能依赖表、数据存放表。

目标表

ID

URL

create_time

功能表

ID

tool_name

pre_tool_name

create_time

数据表

ID

tool_name

url

result

create_time

我们可以首先从目标表中获取一个要扫描的目标,然后读取所有的功能,for循环功能表,只需判断当前有没有依赖问题,或者依赖问题已经解决,那么就可以得到所需的依赖数据,直接执行功能即可。

执行完成结果可以在结果页面看见,这里是我的执行结果。

伪代码如下所示:

代码语言:txt
AI代码解释
复制
<?php

$id = getTarget();
$toolLst = getToolList();

foreach($toolList as $val){
    //判断当前工具上级依赖为空或者上级工具已执行 
    if($val['pre_tool_name'] == ''   or  上级工具已经执行){
        //开始使用工具对URL扫描
        scanUrl();
        //保存结果
        svaeResult();
        
    } else(){
        //上级工具还没执行完成,先跳过
        continue;
    }
}

这是我写好的脚本,大家可以简单改改应用,目前我写的脚本已经集成到了蜻蜓安全平台里面,你可以一键复制使用

http://qingting.starcross.cn/scenario/detail?id=1931

目前我已经集成了46常见的款工具,放在GitHub中开源,地址:https://github.com/StarCrossPortal/QingTing


作者:汤青松

日期:2022-11-29

微信:songboy8888

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高效率开发Web安全扫描器之路(一)
经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖掘的,比如说下面是CNVD上面的白帽子大佬
汤青松
2023/01/10
4880
高效率开发Web安全扫描器之路(一)
XRAY 扫描器
XRAY扫描器之前是一位朋友介绍给我用的,说是对挖掘漏洞有很大的帮助,后来我也认真深入做了一番了解,在网上搜集了一些学习的文章资料,主要参考学习了XRAY官方文档以及国光-xray Web扫描器学习记录 ,发现这XRAY扫描器确实不错,功能很多,扩展性也非常强大,尤其是可以配合第三方扫描器联动,对漏洞检测真是如虎添翼。
LuckySec
2022/11/02
2.4K0
XRAY 扫描器
QingScan漏洞扫描器初体验
最近在几个微信群里看到好些人在讨论这个QingScan扫描器,听他们聊得火热我也去GitHub上看了看,GitHub的介绍说集合了各类安全工具,只需要输入一个URL,便会自动调用近30款安全工具对目标进行扫描,于是我下载了一个试试效果咋样
婷婷的橙子
2021/12/12
9030
某次通用型漏洞挖掘思路分享
大概是在上半年提交了某个CMS的命令执行漏洞,现在过了那么久,也想通过这次挖掘通用型漏洞,整理一下挖掘思路,分享给大家。
潇湘信安
2021/12/02
6990
某次通用型漏洞挖掘思路分享
PHP高级编程之守护进程
PHP高级编程之守护进程 http://netkiller.github.io/journal/php.daemon.html 摘要 2014-09-01 发表 2015-08-31 更新 我的系列文档 Netkiller Architect 手札 Netkiller Developer 手札 Netkiller PHP 手札 Netkiller Python 手札 Netkiller Testing 手札 Netkiller Cryptography 手札 Netkiller Li
netkiller old
2018/03/05
1.1K0
PHP 中最常用的 100 个函数
PHP 静态分析引擎 Exakat 分析了 1900 个 PHP 开源项目,整理了最常用的 100 个 PHP 函数:
Denis
2023/04/13
2860
Web安全攻防(简)学习笔记
信息收集是渗透测试全过程的第一步,针对渗透目标进行最大程度的信息收集,遵随“知己知彼,百战不殆”的原则,先了解目标在利用目标。
Mirror王宇阳
2020/11/13
1.2K0
Web安全|.htaccess的奇淫技巧
.htaccess 文件是Apache中有一种特殊的文件,其提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一条或多条指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。
HACK学习
2021/05/14
6.4K0
渗透测试-如何高效率挖掘漏洞
21、22、3306等远程端口,可使用超级弱口令工具或者railgun自带模块进行暴力破解
hyyrent
2022/12/26
1.4K0
渗透测试-如何高效率挖掘漏洞
华山杯2016_writeup
今年华山杯体验比去年要差一点儿…感觉太多的题目都很迷,其余几道比较不错的题目基本都是国外抄来的原题,甚至于文件读取的题目有洞,所有的题目又在一个环境下。。。导致各种非预期,整理下wp慢慢来吧…
LoRexxar
2023/02/21
2880
华山杯2016_writeup
蜻蜓低代码安全工具平台开发之路
蜻蜓内测版在五一前夕上线了,很快就积累的很多工具,用户数也逐渐增多,但我也逐渐发现这种堆积式的平台没太多技术含量;我在想是否可以做一些有挑战的事情,正好这几年低代码平台比较火热,我在想是否能在安全场景做一个低代码平台。
汤青松
2022/06/23
8710
第三方服务器php获取微信小程序云开发access_token和云数据库
微信小程序云开发开放了http api,可以从第三方访问云服务了。方便很多。云服务的后台,可以用PC端写了。 流程大概就是通过appid,appkey获得access_token,这个access_token一定要在有效期内自己备份,不要每次使用都去申请,因为企鹅那边永远是是你的appid申请的最后一次的access_token有效。多此申请可能造成前面业务失败。我这里用redis存储申请到的access_token,正好还可以设置超时时间。 获取access_token的链接如下:
xiny120
2019/12/16
2.6K1
PHP Web 木马扫描器
<?php /**************PHP Web木马扫描器************************/ /* [+] 版本: v1.0
用户1696846
2018/07/16
5.1K0
Web安全 | PHP反序列化入门这一篇就够了
序列化实际是为了传输的方便,以整个对象为单位进行传输, 而序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。如果了解底层的同学可以知道,类中的方法本就不在类中。
HACK学习
2021/06/24
4.7K0
Web安全 | PHP反序列化入门这一篇就够了
Xray扫描器[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139112.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
1.4K0
Xray扫描器[通俗易懂]
Web漏洞扫描工具推荐
Arachni是一款基于Ruby框架搭建的高性能安全扫描程序,适用于现代Web应用程序。可用于Mac、Windows及Linux系统的可移植二进制文件。
派大星在吗
2021/12/17
3.3K0
Balsn CTF 2019 web 题
这段代码并不需要额外配置,却加载了一个 config.php,有点蹊跷,先读下源代码看看。有两种办法,一是通过 eval,而是利用 file_get_contents,后者明显要简单些。这样的后缀检查加个空格就能过。因为读取有长度限制,可直接使用伪协议进行压缩,然后解压即可。
wywwzjj
2023/05/09
4450
Balsn CTF 2019 web 题
XSS 扫描器成长记
为了实现自动刷SRC的目标,过年前就开始对w13scan的xss扫描功能进行优化,灵感来源于xray所宣称的基于语义的扫描技术。
Seebug漏洞平台
2020/02/19
1.6K0
XSS 扫描器成长记
Xray扫描器使用联动 burp,以及结合 fofa 批量自动化挖洞「建议收藏」
xray (https://github.com/chaitin/xray) 是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动、被动多种扫描方式,自备盲打平台、可以灵活定义 POC,功能丰富,调用简单,支持 Windows / macOS / Linux 多种操作系统,可以满足广大安全从业者的自动化 Web 漏洞探测需求。
全栈程序员站长
2022/08/23
3.1K0
Xray扫描器使用联动 burp,以及结合 fofa 批量自动化挖洞「建议收藏」
WEB安全基础 - - -漏洞扫描器
漏洞扫描是指基于漏洞数据库,通过扫描等手段对指定的远程或者本地计算机系统 的安全脆弱性进行检
干掉芹菜
2022/11/19
1.3K0
WEB安全基础 - - -漏洞扫描器
相关推荐
高效率开发Web安全扫描器之路(一)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文