Conmajia

January 20, 2019

警告


这是试验,警告个屁,请不要多多尝试用它做多余的事。

果不其然,这篇文章立刻被移出主页了,我就说嘛,BKY 哪儿会那么包容和坦然呢?

原文


document.title = "[我是 JS 生成的!] " + document.title

.blacked{background:#333;color:#333;border-radius:5px;margin:auto 0.25em;}

标题其实是有点问题的,会让人觉得我在搞破坏,找漏洞。NONONO,这是误会,我最多就是想拿 JS 改改默认的主题什么的。实际上,这种担心是不存在的。 BKY 本身并没有屏蔽 JS 脚本,甚至在后台主动开放了 HTML 权限,以一个 BK 网站来说,比较良心了。加上现在改成 Markdown 编辑器,还支持文章正文内插入 HTML,整个 BK 的可玩性更高了。

毕竟它压根儿就没有扩展功能的插件和可编辑的主题,再不开放权限还玩您 呢?

只是总有人不小心搞出一些事来,为了网站安全,不得不屏蔽掉文章里的 <script> 标签。

当然,这功能早在十几年前就屏蔽了,所以也不关我们鸟事儿

所以现在你如果在文章里写上 JS,它没法运行。如果做试验,你写:

  1. 前面的正文
  2. <script type="text/javascript">
  3. document.title = Math.random()
  4. </script>
  5. 后面的正文

然后把文章发表出来,你会发现这段压根儿就不显示、不执行,烟儿似的就消失了,屁反应没有。

那怎么办啊,就没招改改默认主题了吗?好些人说,

默认主题也挺好的啊,还有那么多五颜六色的可以选呢。

您是认真的吗?啊?默认的那些主题实在是太难看了啊,难道这就是传说中的程序员的审美观么?9021 年了,醒醒,大清已经亡了!村里通网多少年了,Web 都已经 4.0,5.0,6.0 了,老铁!

好看吗?那您还挺淳朴的呢 :)

如果某天你意识到了这一点,精通增删改查的你也许会想要给自己的 BK 整个容?加点料?删点自带的垃圾?在读者打开你每篇文章时都跳出点不同的东西?

你知道我在说什么,毕竟你那么聪明。

—Conmajia

都已经开放 HTML 了,你当然可以用各种姿势咯美化界面咯,我这个 BK 就有很多东西是代码生成的。还有一个好处是增强了文章的互动性,提高读者参与度。比如你要讲随机数,编了无数代码,作者写得天花乱坠,读者看得晕头转向:

  1. Math.random()

吧啦吧啦半天,能有我一个按钮的效果好?

点一下试试

<随机数>

  1. $('#random-tag').text(Math.random());

或者用较小的篇幅展示更多内容?比如点下面的按钮:

如何评价程序员的审美?

走进地铁的一瞬间,大家感受到了前所未有的尴尬,有人说这是程序员下班了……

所以现在我来说说怎么运行文章正文里的 JS 代码。你知道的,JS 有一个 eval 函数专门 evaluate 字符串形式的代码。那么,look at 管理→设置自定义 HTML 的地方:



非常幸运,eval 函数可以执行,这就简单至极了。既然正文里的 <script> 屏蔽了,改从外围执行代码就好啦。举个例子,在正文里用一个标签 <run> 包住要执行的代码,直接 eval

  1. <!-- 页面底部 HTML -->
  2. <script>
  3. $(function(){
  4. $('run').each(function(){eval($(this).text())});
  5. });
  6. </script>

这样,页面载入完后,就会依次执行正文里所有 <run> 标签内的代码了。美观一点,可以把所有 <run> 都隐藏起来:

  1. /* CSS 设置 */
  2. run {
  3. display: none;
  4. }

一开始那个例子改改,文章里写上:

  1. 前面的正文
  2. <run>
  3. document.title = Math.random()
  4. </run>
  5. 后面的正文

发表文章就能看到效果了(↑↑ 你再看看本文的标题栏?):

Safari,macOS 10.14

这不就绕过屏蔽了?但是吧,我给的例子里只简单地使用了 eval它有时候是不灵光的。因为 Markdown 编辑器会把代码里的 $*_ 这些特殊符号识别成格式开关,然后把代码渲染得面目全非,根本没法用。所以你需要想办法阻止编辑器解析你的代码!来看个稍微复杂点的例子

  1. <run>
  2. $('html').attr('lang', 'zh-CN');
  3. $('title').text(Math.random() * 100 * 99);
  4. </run>

只有两句话的代码,被 Markdown 编辑器解析成了一大堆 HTML 标签:

  1. <run><br>
  2. <span class="MathJax_Preview" style="color: inherit; display: none;"></span>
  3. <span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" style="position: relative;" data-mathml="
  4. <math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;><msup><mo stretchy=&quot;false&quot;>(</mo>
  5. <mo>&amp;#x2032;</mo></msup><mi>h</mi><mi>t</mi><mi>m</mi><msup><mi>l</mi><mo>&amp;#x2032;</mo>
  6. </msup><mo stretchy=&quot;false&quot;>)</mo><mo>.</mo><mi>a</mi><mi>t</mi><mi>t</mi><mi>r</mi><msup>
  7. <mo stretchy=&quot;false&quot;>(</mo><mo>&amp;#x2032;</mo></msup><mi>l</mi><mi>a</mi><mi>n</mi><msup>
  8. <mi>g</mi><mo>&amp;#x2032;</mo></msup><msup><mo>,</mo><mo>&amp;#x2032;</mo></msup><mi>z</mi>
  9. <mi>h</mi><mo>&amp;#x2212;</mo><mi>C</mi><msup><mi>N</mi><mo>&amp;#x2032;</mo></msup>
  10. <mo stretchy=&quot;false&quot;>)</mo><mo>;</mo></math>" role="presentation">
  11. <!-- (省略几十行) -->
  12. <script type="math/tex" id="MathJax-Element-2">('html').attr('lang', 'zh-CN');
  13. </script>('title').text(Math.random() * 100 * 99);<br>
  14. </run>

大部分是 MathJax 的数学公式解析,因为它用 $ 作为行间公式的识别符,而 jQuery 好死不死几乎全是 $……至于解决方案,最简单的就是用jQuery代替$,毕竟这俩是等价的。或者你可以想点别的招。有一种临时的解决方案是把代码放在 <run> 的某个属性里,eval 改成从属性中读取,比如:

  1. <run code="$('html').attr('lang', 'zh-CN');$('title').text(Math.random() * 100 * 99);"></run>
  2. </code>
  3. </pre>
  4. <pre class="prettyprint lang-js linenums" lang="javascript">
  5. $('run').each(function(){eval($(this).attr('code'))});

需要说明的是,这篇文章写的东西并不是找出 BKY 的 bug,最多算留出了非常大的自由度。至于怎么使用,还是得看个人素质了。

我说明个几把。

The End. \(\Box\)

🕵️ 如何绕过 BKY 对 script 的屏蔽的更多相关文章

  1. WAF指纹识别和XSS过滤器绕过技巧

    [译文] -- “Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters” 0x1 前言 之前在乌云drop ...

  2. XSS插入绕过一些方式总结

    详见:http://blog.csdn.net/keepxp/article/details/52054388 1 常规插入及其绕过 1.1 Script 标签 绕过进行一次移除操作: <scr ...

  3. XSS Challenges

    平台: http://www.zixem.altervista.org/XSS/ level1: Payload: http://www.zixem.altervista.org/XSS/1.php? ...

  4. Xss Bypass备忘录

    Xss Bypass备忘录 技术要发展,免不了风波. 也许这些攻攻防防会更好的促进技术的发展也说不定 就让这一次次的爆破换来将来更精练的技术的无比的宁静吧 我们静观其变吧! 缅怀当初那份最纯真Hack ...

  5. 【RCTF-2015】bug

    信息: 题目来源: RCTF-2015 标签:PHP.SQL注入 解题过程 访问网址,提示需要登陆: 使用admin用户名进行注册,提示: 对登陆页面与注册页面进行Fuzz,没有发现注入点. 登陆后页 ...

  6. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  7. JS表单验证-12个常用的JS表单验证

    JS表单验证-12个常用的JS表单验证 最近有个项目用到了表单验证,小编在项目完结后的这段时间把常用的JS表单验证demo整理了一下,和大家一起分享~~~ 1. 长度限制 <p>1. 长度 ...

  8. OWASP top10

    PhishTank 是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁. 1.XSS 1.1. XSS简介 跨站脚本攻击,英文全称是Cross Site Scri ...

  9. java开发--JavaScript

    http://www.cnblogs.com/hongten/archive/2011/03/21/1990121.html JavaScript表单验证电话号码,判断一个输入量是否为电话号码,通过正 ...

随机推荐

  1. Java基础-方法重载和方法重写的区别

    什么是java方法重载 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)  ...

  2. window 7 安装Jmeter并配置https录制脚本

    安装与环境配置: http://blog.csdn.net/hhuangdanfeng/article/details/51564765 http://blog.csdn.net/u010573212 ...

  3. Xshell访问和连接Linux

    Xshell是一款强大的安全终端模拟软件,Xshell 模拟了远程主机的操作,其实质就是通过访问和连接到远程主机,在本地实现对远程主机的操作.  一.下载 官网:https://www.netsara ...

  4. [Inside HotSpot] C1编译器HIR的构造

    1. 简介 这篇文章可以说是Christian Wimmer硕士论文Linear Scan Register Allocation for the Java HotSpot™ Client Compi ...

  5. asp.net core系列 47 Identity 自定义用户数据

    一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...

  6. 国内开源社区巨作AspectCore-Framework入门

    前些天和张队(善友),lemon(浩洋),斌哥(项斌)等MVP大咖一块儿吃饭,大家聊到了lemon名下的AOP这个项目,我这小白听得一脸懵逼,后面回来做了一下功课,查了下资料,在lemon的Githu ...

  7. 直观理解神经网络最后一层全连接+Softmax

    目录 写在前面 全连接层与Softmax回顾 加权角度 模板匹配 几何角度 Softmax的作用 总结 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 这篇文章将从3 ...

  8. Hibernate内容详解

    一:引入Hibernate的jar包 http://t.cn/EioD1xk 二:配置Hibernate的核心配置文件hibernate.cfg.xml <!DOCTYPE hibernate- ...

  9. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  10. Django-restframework 之认证源码分析

    Django-restframework 源码分析之认证 前言 最近学习了 django 的一个 restframework 框架,对于里面的执行流程产生了兴趣,经过昨天一晚上初步搞清楚了执行流程(部 ...