0x01搭建

这里测试的版本是1.1.17.10.30(17.10.30),最新版本1.2.0已修复

https://github.com/typecho/typecho/releases/download/v1.1-17.10.30-release/1.1.17.10.30.-release.tar.gz

安装好程序

85615-lim2dwnhhv.png

0x02复现

然后访问默认存在的文章进行评论,评论内容就是一个最常见的xss payload

http://domain/index.php/archives/1/

26879-6slg4xevibs.png

评论完成后,登入后台查看评论

http://domain/admin/manage-comments.php

06606-wkw2es4rcd.png

点击编辑

53992-16ihradvvy1.png

接下来在点击提交即可触发

05016-msgfa41jaa.png

成功触发漏洞

44649-kkb6m740tc8.png

0x03审计

问题出在manage-comments.php文件的329到365行

    $('form', edit).submit(function () {
        var t = $(this), tr = t.parents('tr'),
            oldTr = $('#' + tr.data('id')),
            comment = oldTr.data('comment');

        $('form', tr).each(function () {
            var items  = $(this).serializeArray();

            for (var i = 0; i < items.length; i ++) {
                var item = items[i];
                comment[item.name] = item.value;
            }
        });

        var html = '<strong class="comment-author">'
            + (comment.url ? '<a target="_blank" href="' + comment.url + '">'
            + comment.author + '</a>' : comment.author) + '</strong>'
            + ('comment' != comment.type ? '<small><?php _e('引用'); ?></small>' : '')
            + (comment.mail ? '<br /><span><a href="mailto:' + comment.mail + '">'
            + comment.mail + '</a></span>' : '')
            + (comment.ip ? '<br /><span>' + comment.ip + '</span>' : '');

        $('.comment-meta', oldTr).html(html)
            .effect('highlight');
        $('.comment-content', oldTr).html('<p>' + comment.text + '</p>');
        oldTr.data('comment', comment);

        $.post(t.attr('action'), comment, function (o) {
            $('.comment-content', oldTr).html(o.comment.content)
                .effect('highlight');
        }, 'json');
        
        oldTr.show();
        tr.remove();

        return false;
    });

先打几个断点在图中几个位置

00535-pb350h29g5e.png

然后点击提交,此时comment的值为我们评论的作者 网站 ip等

34249-wot5jw2f43q.png

然后在继续往下执行执行到413行触发xss

63092-ycw6jylao6q.png

可以看到是直接把comment.text写入到了页面上导致了xss

80239-hwi6ddu8llj.png

接下来手动调一下,首先是取出评论的值 ip 作者等

    $('form', edit).submit(function () {
        var t = $(this), tr = t.parents('tr'),
            oldTr = $('#' + tr.data('id')),
            comment = oldTr.data('comment');

由于代码用是form的this这里改成取表单里面按钮

77951-mmfqezqapis.png

var t = $('.primary')
tr = t.parents('tr')
oldTr = $('#' + tr.data('id'))
comment = oldTr.data('comment');
comment;

取出评论的值 作者 ip 等信息
72244-jddpbheg6hl.png

然后将值无过滤写到了页面上,导致了xss

$('.comment-content', oldTr).html('<p>' + comment.text + '</p>');

12585-7pa2xfq7s3.png

0x04 修复

可以在官方Github看到13天前提交记录看到修复

43523-k3ynfz9bzyh.png

https://github.com/typecho/typecho/commit/8437eac420d059731eabbbeb2534eddc817120d2#diff-0bf2cbd6cb4aac805dd2e7c9fd0ad201fcffb08aa5166474be14fcebe5145c11L343

92589-x817aokkry.png

由于修复的是1.2.0我测试的版本是1.1.17.10.30没有带DOMPurify需要手动下载purify.js

https://github.com/typecho/typecho/blob/master/admin/js/purify.js

进入到/admin/js文件夹下然后下载purify.js,然后在manage-comments.php头部引入js

<script src="<?php $options->adminStaticUrl('js', 'purify.js'); ?>"></script>

21354-qkjcmp3rrcr.png

然后替换manage-comments.php的330到366行替换为即可

    $('form', edit).submit(function () {
        var t = $(this), tr = t.parents('tr'),
            oldTr = $('#' + tr.data('id')),
            comment = oldTr.data('comment');

        $('form', tr).each(function () {
            var items  = $(this).serializeArray();

            for (var i = 0; i < items.length; i ++) {
                var item = items[i];
                comment[item.name] = item.value;
            }
        });
        var unsafeHTML  = '<strong class="comment-author">'
            + (comment.url ? '<a target="_blank" href="' + comment.url + '">'
            + comment.author + '</a>' : comment.author) + '</strong>'
            + ('comment' != comment.type ? '<small><?php _e('引用'); ?></small>' : '')
            + (comment.mail ? '<br /><span><a href="mailto:' + comment.mail + '">'
            + comment.mail + '</a></span>' : '')
            + (comment.ip ? '<br /><span>' + comment.ip + '</span>' : '');

        var html = DOMPurify.sanitize(unsafeHTML, {USE_PROFILES: {html: true}});
        var content = DOMPurify.sanitize(comment.text, {USE_PROFILES: {html: true}});
        $('.comment-meta', oldTr).html(html)
            .effect('highlight');
        $('.comment-content', oldTr).html('<p>' + comment + '</p>');
        oldTr.data('comment', comment);

        $.post(t.attr('action'), comment, function (o) {
            $('.comment-content', oldTr).html(o.comment.content)
                .effect('highlight');
        }, 'json');
        
        oldTr.show();
        tr.remove();

        return false;
    });

修复效果展示
ok

最后修改:2022 年 11 月 12 日
  • 本文作者:Juneha
  • 本文链接:https://blog.mo60.cn/index.php/archives/582.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
  • 文章声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任,本人坚决反对利用文章内容进行恶意攻击行为,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全。
如果觉得我的文章对你有用,请随意赞赏