专栏首页黑白安全Web漏洞扫描碎碎念

Web漏洞扫描碎碎念

前言

这段时间一直在搞漏洞扫描方面相关的东西,之前也写过一些小的扫描器demo,接触到挺多开源和商业版漏扫。简单念叨一些web扫描器相关的思路吧,也算做个记录。 注:本文只提供一些思路

其实web扫描器形式分很多种

  • 主动扫描例如 AWVS、APPScan
  • 被动扫描例如 Xray
  • 还有一些一把梭的插件类型扫描器,包括资产域名自动收集,指纹识别,POC扫描等
  • IAST插桩也是挺好的一种方式

当然可能按照不同角度有不同的区分类型吧,这几种类型的基本也都写过一些。其实无论哪种方式,最核心的还是要拿到流量才能往下走。

参数解析

为什么先说参数解析呢,因为后面的很多模块都会依赖这里。参数解析的是否完整,对扫描结果影响还是比较大的。 无论是GET还是POST,先把参数的raw拿回来,最后封装回去就好 先看常见的格式

  • id=1&name=bey0nd
  • {“id”:1,”name”:”bey0nd”}

这两种是最简单的,格式较为统一,urlencode或json格式,只需要判断并解析一下,然后加入payload的flag

  • id=1__PAYLOAD__FLAG__&name=bey0nd__PAYLOAD__FLAG__
  • {“id”:”1__PAYLOAD__FLAG__”,”name”:”bey0nd__PAYLOAD__FLAG__“}

看下几种复杂格式

  • {“age”:1,”service”:”getUserInfo”,”data”:[{“ID”:”0”,”name”:”sdf”},{“ID”:”3”,”name”:”sdf2”}]}
  • id=3&pdata={”service”:”getUserInfo”}&t=&group=0
  • id=3&pdata={”service”:”getUserInfo”,”data”:{”records”:[{”groupID”:”0”}]}}&version=1.1
  • {“test”: 1,”record”:{“data”: {“test”: 12222, “pdata”: {“service”: “getUserInfo”}}}}

以上这几种都是我在实际的线上环境中遇见的,在完全不知道参数格式时,解析还是比较麻烦的,burpsuite的API在获取参数时对于这种混合格式就无法解析。之前调研一些商业漏扫也是无法识别的。后来自己写的时候看sqlmap源码有了思路解决了这个问题,有兴趣的可以看一下lib\core\common.py的walk函数。

流量去重

我对于重复请求包的定义是域名及协议和url路径相同,同时参数的key是完全一致。 像这种为重复

这种则需要再次扫描

所以是否能完美的完成参数解析,就会影响到去重,把url与参数的key排序后判断是否已经存在就可以判定是否重复,对于复杂格式的依然可行。然后把去重后的流量入库后就可供扫描引擎调用,实时扫描或者计划任务都可以。

漏洞检测

这块就是一些重头戏部分了。我在做的时候参考了AWVS的设计模式。做了一些合并,把扫描插件大致分成了三类,目录结构为

CoreScanEngine.py ——base ——perFolder ——perHost ——perRequest

举个例子,当扫描 https://www.beysec.com/pro/test.php?id=2&name=bey0nd 这个url时

  • CoreScanEngine.py就是扫描入口了,负责调用所有的扫描插件
  • base目录为一些扫描基类,定义一些基础方法
  • perFolder目录为扫描当前目录( https://www.beysec.com/pro/)的一些插件,例如一些备份文件 https://www.beysec.com/pro/test.php.bak, https://www.beysec.com/pro/test.bak 。一些敏感文件等等之类的
  • perHost目录就是一些单个主机的扫描插件了,例如心脏滴血,中间件,一些0/1/Nday这种
  • perRequest目录就是比较熟悉的常见web漏洞了,SQL注入,SSRF,命令执行这些。

这里有个调度的问题就是perHost只扫一次,perFolder只扫当前目录,perRequest每来一个包都扫。所以如果再来 https://www.beysec.com/notpro/hello.php perHost插件就不在扫描。

总结

这些都是一些大的方向,其实每个模块都有许多细节需要处理,比如SQL注入检测模块中去掉返回包垃圾数据,restful接口返回数据尽可能去掉无关项,用分词作相识度识别的阈值设置,来提高准确率减少误报。SSRF的反链平台,每个扫描插件和模块都需要迭代优化,以及漏洞扫出来后如何闭环和打通别的平台,还是比较刺激的。

文由https://www.beysec.com/security/web-vuln-scanner-thinking.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 打造一款Socket型免杀无弹窗的shellcode

    写一个 shell­code 带有 socket+rc4 加密跑远端加密后的 cs 的 pay­load 下载下来后执行。然后利用启动项劫持技术,绕过杀软的启动...

    周俊辉
  • CVE-2020-1938:Apache Tomcat文件包含复现

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP ...

    周俊辉
  • 信息收集?不存在的!

    「搜索引擎的语法」是你必须掌握的一点,这里我就不再列出来,直接附上一位博主的语法解释文章:传送门

    周俊辉
  • 快速学习-Oozie的使用

    目标:使用Oozie调度MapReduce任务 分步执行: 1)找到一个可以运行的mapreduce任务的jar包(可以用官方的,也可以是自己写的) 2)...

    cwl_java
  • jQuery

    jQuery是目前使用最广泛的javascript函数库。据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库。微软公司甚至把jQuer...

    py3study
  • C语言 第一章 C语言简介

    一、C语言介绍 C是一种通用的编程语言,广泛用于系统软件与应用软件的开发。于1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇与肯·汤普逊...

    张果
  • 「web应用架构」有原则GraphQL

    尽管名为GraphQL,但它并不是一种简单的查询语言。这是一个全面解决现代应用与云服务之间连接问题的方案。因此,它构成了现代应用程序开发堆栈中一个新的重要层的基...

    首席架构师智库
  • 【Jmeter篇】后置处理器之边界提取器

    我们想从接口中提取一些想用的东西,不习惯用正则提取器和json提取器,今天我们来介绍下边界提取器,相对前者较简单些。它通过左右边界来提取需要的内容,它可以匹配任...

    橙子探索测试
  • (图解)神经网络的复兴:重回风口的深度学习

    2012年,「GPU+深度学习」真正引爆革命火花 由于多层神经网络的计算量庞大、训练时间过长,常常跑一次模型就喷掉数周、甚至数月的时间,2006年该时也仅是让学...

    GPUS Lady
  • 用Vue.js开发原生应用选择Weex还是NativeScript?

    Vue.js是一个很好的框架!它有一个友好的学习曲线,结合了最好的React的组件方法和Angular的模板。尽管如此,Vue.js仍然有一个限制,它还不能像R...

    笔阁

扫码关注云+社区

领取腾讯云代金券