热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP开源白盒审计工具初探(下)

 上期

 

上期小阑针对基于文本特征的 PHP 开源白盒审计工具进行了初步的介绍。本期针对基于静态分析的 PHP 开源白盒审计工具进行初步探索

基于静态分析:即借助传统静态分析技术来进行白盒审计。常见的技术主要有数据流分析、污点传播和控制流分析等。静态分析的方式能够更加准确的判断外部输入是否经过安全函数的处理,这点是基于文本特征的方式很难实现的。此外,基于静态分析的方式在判断一个变量是否部分/全部来自外部输入的时候也更有优势,尤其在针对框架进行审计的时候。但是,有好的一面就有坏的一面,基于静态分析的问题在于:


  1. 1)时间开销大,做一次完整的分析所需的时间远大于基于文本特征的方式;

  2. 2)适配成本高,针对不同的目标,需要适配相应的解析器来生成所需的 AST 树和 CFG 等信息,此外,检测规则的适配也是一个相对较重的成本。


基于静态分析


Cobra


Github: https://github.com/WhaleShark-Team/cobra


Language: Python2


Last commit on 2019.08.23

2016 年开源的白盒审计工具 Cobra 相信很多人都曾听说过。迄今为止,Cobra 已经在 Github 上收获 2.1k 的 star,也是这次分析的开源白盒审计工具中 star 数最多的项目。Cobra 支持直接通过命令行的方式进行白盒审计,也支持启动一个本地 WEB 服务,然后通过 WEB 界面或者 API 交互的方式控制 cobra 对源码进行白盒审计和查看报告。Cobra 支持 PHP、Java、Python 等开发语言,并支持数十种类型文件,还支持对 WEB 框架的识别,具体列表如下:

















开发语言PHP、Java、Python、JSP、C、Ruby、Perl、Lua、Go、Swift、C++、C#、Header、Objective-C、Scale、Ceylon、Kotlin、Shell、Bat、Javascript、HTML、CSS
文件Image、Font、Conf、CMake、SQL、Compression、Executable、Log、Text、Office、Media、Certificate、Source、Thumb、Git
框架WordPress、Joomla、Drupal、CodeIgniter、ThinkPHP、Laravel、Kohana、Yii、Symfony、Phalcon、Slim、CakePHP、Django、Flask、Sprin

Cobra 具体工作原理官方文档已经介绍的很详细,引用如下:

对于一些特征较为明显的可以使用正则规则来直接进行匹配出,比如硬编码密码、错误的配置等。 对于OWASP Top 10的漏洞,Cobra通过预先梳理能造成危害的函数,并定位代码中所有出现该危害函数的地方,继而基于 Lex (Lexical Analyzer Generator, 词法分析生成器)和 Yacc (Yet Another Compiler-Compiler, 编译器代码生成器)将对应源代码解析为 AST (Abstract Syntax Tree, 抽象语法树),分析危害函数的入参是否可控来判断是否存在漏洞(目前仅接入了PHP-AST,其它语言AST接入中)。

> 引自 http://cobra.feei.cn/

Cobra 的检测规则主要分为依赖检查规则和代码安全扫描规则。依赖检查只支持 Python、Java 和 NodeJS 三种主要语言。主要为检查引用的第三方库的版本是否满足相应语言配置文件(requirements.txt、pom.xml、package.json)中规定的版本要求。Cobra 共提供 95 条代码安全扫描规则,具体如下:

php: 57         java: 8         *: 3            jsp: 2          conf: 2


certificate: 1  source: 1       lua: 1          log: 1          thumb: 1


Cobra-W 


Github: https://github.com/LoRexxar/Cobra-W


Language: Python3


Last commit on 2020.01.17

Cobra-W 是基于 Cobra 2.0 进一步优化来提高发现漏洞的准确率以及精度的白盒审计工具。两者的工作原理基本相同,其不同之处主要体现在:


  1. 深度重写AST,大幅度减少漏洞误报率。

  2. 提供更易于从代码层面定制审计思路的规则书写方式,更易于白帽子使用,易于拓展。

  3. 底层 api 重写,支持 windows、linux 等多平台。

  4. 多层语义解析、函数回溯,secret机制,新增多种机制应用于语义分析。

  5. 新增 Javascript 语义分析,用于扫描包含js相关代码。

Cobra-W 不仅仅对检测规则的格式进行重写,还精简优化了已有的检测规则。Cobra-W 官方提供了涵盖 12 种不同漏洞,共 17 条检测规则。


  1. Reflected XSS: 2

  2. SSRF: 3

  3. SQLI: 3

  4. RFI: 1

  5. Xml injection: 1

  6. RCE: 2

  7. LDAPI: 1

  8. Information Disclosure: 1

  9. URL Redirector Abuse: 1

  10. variable shadowing: 1

  11. unserialize vulerablity: 1


phpcs-security-audit 


Github: https://github.com/FloeDesignTechnologies/phpcs-security-audit


Language: PHP


Last commit on 2019.08.06

phpcs-security-audit是另一款白盒审计框架,它是基于PHP_CodeSniffer(https://github.com/squizlabs/PHP_CodeSniffer) 开发的。PHP_CodeSniffer 是一个代码风格检测工具,主要包含两类脚本:1)根据预定义的一系列代码规范来检测不符合规范的代码,并发出警告或报错的 phpcs 脚本;2)自动修正代码格式上不符合规范的部分 phpcbf 脚本。准确来讲phpcs-security-audit 并不能称之为一个完整的白盒审计框架,它只是提供了一些能够检测代码中潜在安全漏洞的代码规范的规则集。

phpcs_security-audit 检测漏洞的核心在于 phpcs 脚本。它预先定义好能够检测潜在安全漏洞的代码规范,然后借助 phpcs 检测源码中是否有不符合该规范的代码,以此来判断潜在的漏洞点。其中,phpcs 通过通过Token化 PHP、Javascript 和 CSS 文件来检测该代码是否违反代码规范。

phpcs_security-audit 的检测规则主要分为两类:1)通用型检测规则,主要包含 BadFunctions 目录中的 16 种和 Misc 目录中的 2 种,总计 18 种不同漏洞的检测规则;2)针对不同框架的检测规则,其提供了 Drupal7、Drupal8 和 Symfony2 三种框架的检测规则。

progpilot 


Github: https://github.com/designsecurity/progpilot


Language: PHP


Last commit on 2019.06.02

progpilot 是一款使用 PHP 开发的针对 PHP 的白盒审计框架,基于 PHP-CFG(https://github.com/ircmaxell/php-cfg/)来实现控制流图 (CFG) 的生成,同时又基于 PHP-Parser(https://github.com/nikic/php-parser) 来实现抽象语法书 ( AST 树) 的生成。

progpilot 在 CFG 和 AST 的基础上做进一步的漏洞分析。progpilot 借助生成的 CFG 图检查指定函数之间执行顺序是否符合预定义的规则。progpilot 还会检查指定函数的参数是否满足规则。progpilot 支持以下四种方式来检测漏洞:


  1. sources:在分析过程中,将 sources.json 中指定的函数参数作为污点进行分析;

  2. sinks:在 sinks.json 中指明危险函数及其可能导致的漏洞类型

  3. sanitizers:在sanitizers.json中指明防御特定漏洞安全函数及其用法。此处,安全函数会修改参数的值,比如转义;

  4. validators:在validators.json中指明防御特定漏洞的安全函数及其用法。此处,安全函数不会修改污点的值。

progpilot 的检测规则位于 package/src/uptodate_data。其提供了 PHP 和 Javascript 的通用检测规则。对于 PHP 而言,progpilot 还提供CodeIgniter,PrestaShop,SuiteCRM,SymFony,WordPress 这五个框架的定制化检测规则。

pixy  


Github: https://github.com/oliverklee/pixy


Language: Java


Last commit on 2018.01.24

pixy 是一款使用 Java 开发的针对 PHP 的白盒审计框架。本文中介绍的 prixy 是 Oliver Klee 开发的,其原作者为 Jenad Jovanonic。当时为了开发 pixy,Oliver Klee 还专门开源了另外一个项目PhpParser (https://github.com/oliverklee/phpparser)来在 Java 中实现对 PHP 程序的解析。

pixy 借助 PhpParser 实现对源代码的解析,然后基于解析结果生成相应的 AST 树和 CFG,接着在此基础上做污点分析,检查敏感函数的参数是否可控。

pixy 的检测规则主要为 ./config/model_*.ini 文件。每个 ini 文件中可以设置 5 种类型的函数/参数,如安全函数、依赖函数和敏感函数等。

RIPS 


Github: https://github.com/ripsscanner/rips


Language: PHP


Last commit on 2016.05.22

作为一个很早就开始使用语法分析来进行漏洞挖掘的白盒审计工具 — RIPS,相信大家对他都不陌生。即使它现在已商业化运作,最新的版本只有SourceForge (https://sourceforge.net/projects/rips-scanner)上 2017 年更新的 v0.55,但是这并不妨碍我们对其代码理念的学习,梅子酒师傅的三篇 RIPS 分析文章十分值得一读。商业化的 RIPS 提供免费试用,感兴趣的朋友可以前去体验一下。

RIPS 使用 PHP Zend 引擎语法分析器获取源码 Token 流信息,然后基于这个 Token 流信息生成相应的 AST 树和 CFG。然后,RIPS 在此基础上定位敏感函数,然后对敏感函数的参数进行回溯,检查其是否为用户可控输入,以此来判断是否有漏洞。RIPS 在变量回溯过程中会检查该变量是否进行安全函数的处理来减少误报。

RIPS 没有单独的检测规则文件,其检测规则主要集成在配置文件中,位于 config 目录下。


  1. info.php:定义一些额外需要关注的函数;

  2. securing.php :定义安全处理函数;

  3. sink.php:定义敏感函数和相应的安全函数;

  4. sources.php :定义用户可能可控的输出点函数/变量;

  5. token.php:定义分析过程中需要重点关注与敏感函数相关的 Token 信息流。

梅子酒师傅的三篇 RIPS 分析文章:


  1. https://xz.aliyun.com/t/2502

  2. https://xz.aliyun.com/t/2605

  3. https://xz.aliyun.com/t/3991

 

总结

十几款白盒审计工具看下来给我的感觉是自动化代码审计仍然是一个任重而道远的活计。正如开头的所说的,目前主流的 PHP 白盒审计工具都是基于同一条经验。这个经验可以简单拆分成三个子问题:


  1. 定位敏感函数;

  2. 参数部分/全部来自外部输入;

  3. 外部输入在传递过程中是否经过安全函数处理。

针对第一个问题,现如今的方案基本上可以解决了。针对第二个问题,通过静态分析的方式可以基本解决大部分的情况,但仍然存在较大的改进空间,比如针对源码更加全面深入的解析、借助数据库等的二次输入等等;第三个问题现如今依然是一个重灾区,基本上还停留在传递链上是否存在安全函数的判断,而未考虑多次编码导致的绕过问题,安全函数可以被绕过等问题。再者,近几年来我们设计白盒审计工具的原理基本上都是一致,是否存在现如今技术条件下其他更好的设计方案?这点还是有待商榷的。有趣的是,同样是漏洞挖掘,二进制方面的不管是工业界还是学术界都有相当一部分人在研究,但是回归 WEB 这边,主力就都是工业界的人(手动狗头)。

关注我们,小阑将持续推送安全干货~


推荐阅读
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 利用Python与Android进行高效移动应用开发
    通过结合Python和Android,可以实现高效的移动应用开发。首先,需要安装Scripting Layer for Android (SL4A),这是一个开源项目,旨在为Android系统提供脚本语言支持。SL4A不仅简化了开发流程,还允许开发者使用Python等高级语言编写脚本,从而提高开发效率和代码可维护性。此外,SL4A还支持多种其他脚本语言,进一步扩展了其应用范围。通过这种方式,开发者可以快速构建功能丰富的移动应用,同时保持较高的灵活性和可扩展性。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在Typecho网站的导航栏中,通常默认主题会调用独立页面作为导航项。然而,为了提升用户体验和方便访客浏览,许多站长会选择将分类目录也显示在导航栏中,甚至同时显示分类目录和独立页面。本文将详细介绍如何在Typecho中实现这一功能,帮助你优化网站结构,提高用户访问效率。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在C#开发中,实现UserControls之间高效传递CheckBox值是一个常见的需求。本文详细介绍了如何通过事件和委托机制,将UserControl3中的CheckBox值传递到UserControl1中,确保数据传递的准确性和实时性。此外,还提供了代码示例和最佳实践,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
author-avatar
小马不小
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有