Crawlergo动态爬虫联动Xray

admin 2021年11月29日16:49:46安全博客评论208 views6101字阅读20分20秒阅读模式

Crawlergo动态爬虫联动Xray

前言

被动扫描可以通过代理方式,把浏览过的网页进行漏洞扫描,而一个小巧强大的爬虫可以爬取到足够丰富的 URL 信息,因此就有了 Crawlergo 和 Xray 的梦幻联动。

项目地址:https://github.com/timwhitez/crawlergo_x_XRAY

准备

下载压缩包:https://github.com/timwhitez/crawlergo_x_XRAY/archive/master.zip

或者 Git 到本地:

1
git clone https://github.com/timwhitez/crawlergo_x_XRAY.git

Crawlergo

Crawlergo是一个使用 chrome headless 模式进行URL入口收集的动态爬虫。 使用 Golang 语言开发,尽可能的收集网站暴露出的入口。同时,依靠智能URL去重模块,在过滤掉了大多数伪静态URL之后,仍然确保不遗漏关键入口链接,大幅减少重复任务。

下载地址

下载对应版本放到项目的 crawlergo 文件夹

Windows 版本:https://github.com/0Kee-Team/crawlergo/releases/download/v0.4.0/crawlergo_windows_amd64.zip

Mac 版本:https://github.com/0Kee-Team/crawlergo/releases/download/v0.4.0/crawlergo_darwin_amd64.zip

使用测试

测试前需要先确定你的 Chrome 或者 Chromium 浏览器可执行文件的安装位置

Windows:

1
C:Program Files (x86)GoogleChromeApplicationchrome.exe

Mac:

1
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome

注意这里的Unix 可执行文件需要显示包内容才看得到:

image-20210308014131625

爬取URL

1
./crawlergo -c /Applications/Chromium.app/Contents/MacOS/Chromium -t 20 http://testphp.vulnweb.com

image-20210308013601707

Xray

xray 是一款功能强大的安全评估工具,也是一款著名的支持被动扫描的扫描器。

下载地址

下载对应版本放到项目的 xray 文件夹

Windows 版本:https://github.com/chaitin/xray/releases/download/1.7.0/xray_windows_amd64.exe.zip

Mac 版本:https://github.com/chaitin/xray/releases/download/1.7.0/xray_darwin_amd64.zip

测试运行

image-20210308015125816

Crawlergo联动Xray

扫描逻辑

食用方法

  1. 把 launcher.py 和 targets.txt 放在 crawlergo 目录下

  2. 配置好并启动xray被动扫描(脚本默认配置为127.0.0.1:7777)若修改端口请同时修改 launcher.py 文件中的 proxies

1
./xray_darwin_amd64 webscan --listen 127.0.0.1:7777 --html-output test.html

image-20210308020400899

  1. 将测试 Crawlergo 爬虫时的浏览器路径替换到 launcher.py 的 cmd 变量
  2. 将目标 URL 写进 targets.txt,一行一个 URL
  3. 运行 launcher.py
1
python3 launcher.py

遇到报错缺少模块时

1
ModuleNotFoundError: No module named 'xx'

执行下面命令即可:

1
pip3 install xx

使用效果

crawl ok说明启动成功

image-20210308020854526

Xray 已成功接收 Crawlergo 爬虫的 URL 信息并扫描到漏洞

image-20210308015039860

漏洞信息:

image-20210308022353420

FROM : lintstar.top , Author: 离沫凌天๓

相关推荐: 变量覆盖漏洞

变量覆盖漏洞大多由函数使用不当导致,经常引发变量覆盖漏洞的函数有:extract()函数和parse_str(),import_request_variables()函数则是用在没有开启全局变量注册的时候,调用这个函数相当于开启了全局变量注册,在PHP 5.4之后这个函数已经被取消。另外部分应用利用$$的方式注册变量没验证已有变量导致覆盖也是国内多套程序都犯过的一个问题,这些应用在使用外部传进来的参数时不是用类似于$_GET['key']这样原来的数组变量,而是把里面的key注册成一个变量$key,注册过程中由于没有验证该变量是否已经存在就直接赋值,所以导致已有的变量值会被覆盖掉。 变量覆盖漏洞指的是可以用我们自定义的参数值替换程序原有的变量值,变量覆盖漏洞通常需要结合程序的其他功能来实现完整攻击,这个漏洞想象空间非常大,比如原来一个文件上传页面,限制的文件扩展名白名单列表写在配置文件中,但是在上传的过程中有一个变量覆盖漏洞可以将任意扩展名覆盖掉原来的白名单列表,那我们就可以覆盖一个PHP的扩展名,从而上传一个PHP的shell。 1、挖掘经验 由于变量覆盖漏洞通常要结合应用其他功能代码来实现完整攻击,所以挖掘一个可用的变量覆盖漏洞不仅仅要考虑的是能够实现变量覆盖,还要考虑后面的代码能不能让这个漏洞利用起来。要挖可用的变量覆盖漏洞,一定要看漏洞代码行之前存在哪些变量可以覆盖并且后面有被使用到。 由函数导致的变量覆盖比较好挖掘,只要搜寻参数带有变量的extract()、parse_str()函数,然后去回溯变量是否可控,extract()还要考虑它的第二个参数,具体细节我们后面在详细介绍这个函数的时候再讲。import_request_variables()函数则相当于开了全局变量注册,这时候只要找哪些变量没有初始化并且操作之前没有赋值的,然后就大胆地去提交这个变量作为参数。另外只要写在import_request_variables()函数前面的变量,不过是否已经初始化都可以覆盖,不过这个函数在PHP 4~4.1.0 和 PHP 5~5.4.0 的版本可用。 关于上面我们说到国内很多程序使用双$$符号去注册变量会导致变量覆盖,我们可以通过搜"$$"这个关键字去挖据,不过建议挖掘之前还是先把几个核心文件通读一遍,了解程序的大致框架。 1.1函数使用不当 目前变量覆盖漏洞大多都是由于函数使用不正确导致的,这些函数有extract()、parse_str()以及import_request_variables(),而其中最常见的就是extract()这个函数了,使用频率最高,导致的漏洞数量也最多,下面我们分别来看看这几个函数导致的漏洞原理。 1.1.1 extract()函数 extract() 函数将检查和符号表中已存在的变量名是否冲突。对冲突的键名的处理将根据此参数决定。 extract()函数覆盖变量需要一定条件,它的官方说明为"从数组中将变量导入到当前的符号表",通俗讲就是将数组中的键值对注册成变量,函数结构如下: int extract( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]]) 最多三个参数,我们来看看这三个参数的作用,参见表 | 参数 | 描述 | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | var_array | 必需。规定要使用的数组。 | | extract_type | 可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。 对不合法和冲突的键名的处理将根据此参数决定。可以是以下值: EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。 EXTR_SKIP - 如果有冲突,不覆盖已有的变量。 EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。 EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。 EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。 EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。 EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。 EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。这有力地说明了导入的变量仍然引用了var_array参数的值。可以单独使用这个标志或者在extract_type中用OR与其他任何标志结合使用。 | | prefix | 可选。如果 extract_rules 参数的值是 EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、 EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS,则 prefix 是必需的。 该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。 | 从以上说明我们可以看到第一个参数是必须的,会不会导致变量覆盖漏洞由第二个参数决定,该函数有三种情况会覆盖掉已有变量,第一种是第二个参数为EXTR_OVERWRITE,它表示如果有冲突,则覆盖已有的变量。第二种情况是只传入第一个参数,这时候默认为EXTR_OVERWRITE模式,而第三种则是第二个参数为EXTR_IF_EXISTS,它表示仅在当前符号表中已有同名变量时,覆盖它们的值,其他的都不注册新变量。 为了更清楚地了解它的用法,我们用代码来说明,测试代码如下: php  <?php        $b = 3;      $a = array('b' => 'hello');      extract($a);      print_r($b); 执行结果如所示。 原本变量$b的值为3,经过extract()函数对变量$a处理后,变量$b的值被成功覆盖为'hello'。 安全的做法是确定register_globals=OFF后,在调用extract()时使用EXTR_SKIP保证已有变量不会被覆盖。 测试代码如下:** php  <?php     $a…

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年11月29日16:49:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Crawlergo动态爬虫联动Xray http://cn-sec.com/archives/653361.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: