漏洞扫描技巧之Web漏洞扫描器研究(2)

漏洞扫描技巧之Web漏洞扫描器研究

在获取到爬虫资产,对相关资产格式化之后,便下发到各个不同类型的 PoC 中进行检测,这样做的好处是分类明确,覆盖大多数检测阶段,也避免为了减少重复请求的下发而需要额外记录中间状态的行为。

0×03 IAST

AWVS 有个比较有趣的功能 AcuMonitor,也就大家熟知的 dnslog、反连平台。在 2014 年看到 AWVS 的这个功能时,就建议 WooYun 出个类似的功能,也就是 cloudeye,tangscan 也就算是国内比较早使用这种技术的扫描器,当然后续又出现了各种类似 cloudeye 的项目,自然而然也出现了各种使用该技术的扫描器。不过今天我们不打算继续介绍 AcuMonitor,而是介绍另外一个也很有趣的功能 AcuSensor。

AcuSensor 就是 IAST,只要稍微了解过 Web 漏洞扫描器的,都应该会知道 IAST 是干啥的。那为什么我要单独拎出来讲这个呢?主要是因为 AcuSensor 的实现方式非常有趣。

AcuSensor 提供了 Java、.NET、PHP 这三个语言版本,其中比较有趣的是 PHP 版本的实现。PHP 版本的 AcuSensor 使用方法是下载一个 acu_phpaspect.php 文件,然后通过 auto_prepend_file 加载这个文件, 众所周知,PHP 是不能改直接 hook PHP 内置函数的,那么单单依靠一个 PHP 脚本,AcuSensor 是如何做到类似 IAST 功能的呢?

很简单,直接替换所有关键函数。嗯,真的就那么简单。

我们来详细介绍一下这个过程,在 acu_phpaspect.php 中:

1.获取用户实际请求的文件内容

2.检查一下有没有相关 cache,如果有 cache 那么直接加载执行 cache,然后结束

3.使用 token_get_all 获取所有 token

4.遍历每一个 token,对自己感兴趣的函数或者语句使用自己定义的函数进行 wrap 并替换

5.将替换后的内容保存到 cache 中并使用 eval 执行

6.__halt_compiler 中断编译

举个具体的例子:

<?php $link = NULL; $sql = "select * from user where user_id=".$_GET["id"]; mysqli_prepare($link, $sql);

经过 acu_phpaspect.php 转换之后:

<?php $link = NULL; $sql = "select * from user where user_id=".$_GET[_AAS91("hello.php", 4, "\$_GET", "id")]; _AAS86("hello.php",6,"mysqli_prepare",Array($link, $sql));

整个过程简单粗暴有效,这样做的优点在于:

实现简单,只需要编写 PHP 即可

安装简单,无需安装扩展,只需修改配置文件可以

兼容性强,比较容易兼容性各种环境,各种版本 PHP

如果有意向去做 IAST 或者想做类似我的 prvd 项目,但又不太喜欢写 PHP 扩展,那么我强烈建议你完整的看一遍 PHP 版本 AcuSensor 的实现,如果对自己实现的检测逻辑效率比较自信的话,甚至可以基于这个原理直接实现一个 PHP 版本的 RASP 项目。

0×04 限速

在 Web 漏洞扫描器中,无论作为乙方的商业产品、甲方的自研产品,限速都是一个至关重要的功能,甚至可以说如果你的扫描器没有限速功能,那压根就不能上线使用。接下来我们将介绍一下在扫描器中限速的几种方法。

代理

使用代理做限速功能,将所有执行扫描任务的 worker 的测试流量全转发到 proxy 服务器上:

漏洞扫描技巧之Web漏洞扫描器研究

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/abc9a8e0e6da0c11d40935a743970277.html