[代码审计]Textpattern4.8.4任意文件上传漏洞
发布时间:2025-12-09 19:58:26
浏览次数:4
在网上看到的公开不久,自己无聊随意进行分析一下啦
利用点在后台上传插件的地方
从这里跟踪发现其调用了plugin_upload函数
照顾小白加一点批注吧
function plugin_upload(){$plugin = array();if ($_FILES["theplugin"]["name"]) {//获取上传表单$filename = $_FILES["theplugin"]["name"];$source = $_FILES["theplugin"]["tmp_name"];//获取插件目录地址$target_path = rtrim(get_pref('tempdir', PLUGINPATH), DS).DS.$filename;//将文件上传至插件目录下if (move_uploaded_file($source, $target_path)) {extract(pathinfo($target_path));//下面是解压,不多说if (strtolower($extension) === 'php') {$write = true;$plugin = Txp::get('\Textpattern\Plugin\Plugin')->read(array($filename, $target_path));} elseif (class_exists('ZipArchive')) {$zip = new ZipArchive();$x = $zip->open($target_path);if ($x === true) {for ($i = 0; $i < $zip->numFiles; $i++) {if (strpos($zip->getNameIndex($i), $filename.'/') !== 0) {$makedir = true;break;}}$zip->extractTo(PLUGINPATH.(empty($makedir) ? '' : DS.$filename));$zip->close();$plugin = Txp::get('\Textpattern\Plugin\Plugin')->read($filename);}}//删除原文件unlink($target_path);}}$message = Txp::get('\Textpattern\Plugin\Plugin')->install($plugin, null, !empty($write));plugin_list($message);}
因此我们不难发现其对上传的文件解压后无过滤,因而能够根据目录路径找到上传地址,利用方法是先用个php文件当中放入webshell,之后压缩为zip文件后上传访问,比如我这个默认地址为http://url/textpattern/plugins/y4/index.php
给大家看下利用截图