本仓库包含针对 Snow Monkey Forms WordPress 插件(版本 <= 12.0.3)中一个严重漏洞的概念验证(PoC)。该漏洞允许未认证攻击者通过路径遍历删除服务器上的任意文件。
参考: Sarawut Poolkhet (MisterHelloz)
Snow_Monkey\Plugin\Forms\App\Rest\Route\View.php/wp-json/snow-monkey-form/v1/view)该漏洞位于 Snow_Monkey\Plugin\Forms\App\Rest\Route\View.php 中的 REST API 处理器内。 方法根据用户输入参数决定执行流程。
send()// 文件:App/Rest/Route/View.php
public function send() {
Csrf::save_token();
$method = Meta::get_method(); // 来源于 $_POST['snow-monkey-forms-meta']['method']
// 漏洞:如果 'method' 为 'input',则绕过关键的 CSRF 检查。
if ( 'input' === $method ) {
return $this->_send(); // 直接执行流程到 _send()
}
// CSRF 检查仅对其他方法执行(例如 'confirm'、'complete')
if ( ! Csrf::validate( Meta::get_token() ) ) { ... }
通过将 input 作为方法参数提供,攻击者强制应用程序立即执行 _send() 函数,跳过了旨在防止未授权操作的 Csrf::validate() 安全控制。
在 _send() 方法内部,应用程序尝试对用户特定的临时目录执行清理例程。该例程依赖于 formid 参数。
// 文件:App/Rest/Route/View.php -> _send()
// 'form_id' 通过 Meta 类直接从 POST 数据获取,未经净化处理
$user_dirpath = Directory::generate_user_dirpath( $this->setting->get( 'form_id' ), false );
Directory::do_empty( $user_dirpath, true ); // 递归删除内容
Directory::remove( $user_dirpath ); // 删除目录本身
关键缺陷在于 Directory::generate_user_dirpath 构造路径的方式:
// 文件:App/Model/Directory.php
public static function generate_user_dirpath( $form_id, $do_create_directory = true ) {
$saved_token = Csrf::saved_token();
// ... (存在 token 的正则检查,但未检查 form_id) ...
$user_dir = path_join( static::get(), $saved_token );
// 漏洞:$form_id 被直接追加。
// WordPress 的 path_join() 不会解析或净化 '../' 序列。
$user_dir = path_join( $user_dir, (string) $form_id );
return $user_dir;
}
$form_id 变量被转换为字符串,但从未被验证为整数。这允许攻击者注入目录遍历字符(例如 ../../../../)。
requests 库(pip install requests)python exploit.py -u <TARGET_URL> -f <TRAVERSAL_PAYLOAD>
