🕵️ 如何绕过 BKY 对 script 的屏蔽
Conmajia
January 20, 2019
警告
这是试验,警告个屁,请不要多多尝试用它做多余的事。
原文
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,它没法运行。如果做试验,你写:
前面的正文
<script type="text/javascript">
document.title = Math.random()
</script>
后面的正文
然后把文章发表出来,你会发现这段压根儿就不显示、不执行,烟儿似的就消失了,屁反应没有。
那怎么办啊,就没招改改默认主题了吗?好些人说,
默认主题也挺好的啊,还有那么多五颜六色的可以选呢。
您是认真的吗?啊?默认的那些主题实在是太难看了啊,难道这就是传说中的程序员的审美观么?9021 年了,醒醒,大清已经亡了!村里通网多少年了,Web 都已经 4.0,5.0,6.0 了,老铁!
如果某天你意识到了这一点,精通增删改查的你也许会想要给自己的 BK 整个容?加点料?删点自带的垃圾?在读者打开你每篇文章时都跳出点不同的东西?
你知道我在说什么,毕竟你那么聪明。
都已经开放 HTML 了,你当然可以用各种姿势咯美化界面咯,我这个 BK 就有很多东西是代码生成的。还有一个好处是增强了文章的互动性,提高读者参与度。比如你要讲随机数,编了无数代码,作者写得天花乱坠,读者看得晕头转向:
Math.random()
吧啦吧啦半天,能有我一个按钮的效果好?
点一下试试
<随机数>
$('#random-tag').text(Math.random());
或者用较小的篇幅展示更多内容?比如点下面的按钮:
如何评价程序员的审美?
走进地铁的一瞬间,大家感受到了前所未有的尴尬,有人说这是程序员下班了……
所以现在我来说说怎么运行文章正文里的 JS 代码。你知道的,JS 有一个 eval
函数专门 evaluate 字符串形式的代码。那么,look at 管理→设置
自定义 HTML 的地方:
非常幸运,eval
函数可以执行,这就简单至极了。既然正文里的 <script>
屏蔽了,改从外围执行代码就好啦。举个例子,在正文里用一个标签 <run>
包住要执行的代码,直接 eval
:
<!-- 页面底部 HTML -->
<script>
$(function(){
$('run').each(function(){eval($(this).text())});
});
</script>
这样,页面载入完后,就会依次执行正文里所有 <run>
标签内的代码了。美观一点,可以把所有 <run>
都隐藏起来:
/* CSS 设置 */
run {
display: none;
}
一开始那个例子改改,文章里写上:
前面的正文
<run>
document.title = Math.random()
</run>
后面的正文
发表文章就能看到效果了(↑↑ 你再看看本文的标题栏?):
这不就绕过屏蔽了?但是吧,我给的例子里只简单地使用了 eval
,它有时候是不灵光的。因为 Markdown 编辑器会把代码里的 $
、*
、_
这些特殊符号识别成格式开关,然后把代码渲染得面目全非,根本没法用。所以你需要想办法阻止编辑器解析你的代码!来看个稍微复杂点的例子:
<run>
$('html').attr('lang', 'zh-CN');
$('title').text(Math.random() * 100 * 99);
</run>
只有两句话的代码,被 Markdown 编辑器解析成了一大堆 HTML 标签:
<run><br>
<span class="MathJax_Preview" style="color: inherit; display: none;"></span>
<span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" style="position: relative;" data-mathml="
<math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mo stretchy="false">(</mo>
<mo>&#x2032;</mo></msup><mi>h</mi><mi>t</mi><mi>m</mi><msup><mi>l</mi><mo>&#x2032;</mo>
</msup><mo stretchy="false">)</mo><mo>.</mo><mi>a</mi><mi>t</mi><mi>t</mi><mi>r</mi><msup>
<mo stretchy="false">(</mo><mo>&#x2032;</mo></msup><mi>l</mi><mi>a</mi><mi>n</mi><msup>
<mi>g</mi><mo>&#x2032;</mo></msup><msup><mo>,</mo><mo>&#x2032;</mo></msup><mi>z</mi>
<mi>h</mi><mo>&#x2212;</mo><mi>C</mi><msup><mi>N</mi><mo>&#x2032;</mo></msup>
<mo stretchy="false">)</mo><mo>;</mo></math>" role="presentation">
<!-- (省略几十行) -->
<script type="math/tex" id="MathJax-Element-2">('html').attr('lang', 'zh-CN');
</script>('title').text(Math.random() * 100 * 99);<br>
</run>
大部分是 MathJax 的数学公式解析,因为它用 $
作为行间公式的识别符,而 jQuery 好死不死几乎全是 $
……至于解决方案,最简单的就是用jQuery
代替$
,毕竟这俩是等价的。或者你可以想点别的招。有一种临时的解决方案是把代码放在 <run>
的某个属性里,eval
改成从属性中读取,比如:
<run code="$('html').attr('lang', 'zh-CN');$('title').text(Math.random() * 100 * 99);"></run>
</code>
</pre>
<pre class="prettyprint lang-js linenums" lang="javascript">
$('run').each(function(){eval($(this).attr('code'))});
需要说明的是,这篇文章写的东西并不是找出 BKY 的 bug,最多算留出了非常大的自由度。至于怎么使用,还是得看个人素质了。
我说明个几把。
The End. \(\Box\)
🕵️ 如何绕过 BKY 对 script 的屏蔽的更多相关文章
- WAF指纹识别和XSS过滤器绕过技巧
[译文] -- “Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters” 0x1 前言 之前在乌云drop ...
- XSS插入绕过一些方式总结
详见:http://blog.csdn.net/keepxp/article/details/52054388 1 常规插入及其绕过 1.1 Script 标签 绕过进行一次移除操作: <scr ...
- XSS Challenges
平台: http://www.zixem.altervista.org/XSS/ level1: Payload: http://www.zixem.altervista.org/XSS/1.php? ...
- Xss Bypass备忘录
Xss Bypass备忘录 技术要发展,免不了风波. 也许这些攻攻防防会更好的促进技术的发展也说不定 就让这一次次的爆破换来将来更精练的技术的无比的宁静吧 我们静观其变吧! 缅怀当初那份最纯真Hack ...
- 【RCTF-2015】bug
信息: 题目来源: RCTF-2015 标签:PHP.SQL注入 解题过程 访问网址,提示需要登陆: 使用admin用户名进行注册,提示: 对登陆页面与注册页面进行Fuzz,没有发现注入点. 登陆后页 ...
- javascript有用小功能总结(未完待续)
1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...
- JS表单验证-12个常用的JS表单验证
JS表单验证-12个常用的JS表单验证 最近有个项目用到了表单验证,小编在项目完结后的这段时间把常用的JS表单验证demo整理了一下,和大家一起分享~~~ 1. 长度限制 <p>1. 长度 ...
- OWASP top10
PhishTank 是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁. 1.XSS 1.1. XSS简介 跨站脚本攻击,英文全称是Cross Site Scri ...
- java开发--JavaScript
http://www.cnblogs.com/hongten/archive/2011/03/21/1990121.html JavaScript表单验证电话号码,判断一个输入量是否为电话号码,通过正 ...
随机推荐
- #oracle恢复已被commit删除的内容
1.FLASHBACK QUERY 闪回到15分钟前 SELECT * FROM tablename AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINU ...
- python strip()函数和Split函数的用法总结
strip函数原型 声明:s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串.不能删除中间的字符或是字符串. s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- ApplicationHost.config(IIS存储配置区文件)
对于一个刚刚创建网站,以ASP.NET MVC5为例. 我们并没有在网页的配置文件(web.config)中配置一些处理程序或模块,如处理Session的SessionStateModule模块,映射 ...
- SSRS报表服务随笔(rdl报表服务)-报表结构与样式
设计rdl报表,比设置HTML页面简单多了,Reporting报表分为页眉,页脚,主体三个部分 rdl文件实际是xml结构的文件,具体是什么语言呢,很抱歉,这点我还不能回复,在我看来,是由固定节点的x ...
- Java 运算符 % 和 /
/ 是除运算符, %是取模运算符 区别: / 是普通的除法运算,如果除数和被除数都是整数,则商是取整 %是求余数 private static void test() { System. / ); S ...
- ES6--浅析Promise内部结构
首发地址:sau交流学习社区 一.前言 什么是promise?promsie的核心是什么?promise如何解决回调地狱的?等问题 1.什么是promise?promise是表示异步操作的最终结果:可 ...
- SpringBoot进阶教程(二十七)整合Redis之分布式锁
在之前的一篇文章(<Java分布式锁,搞懂分布式锁实现看这篇文章就对了>),已经介绍过几种java分布式锁,今天来个Redis分布式锁的demo.redis 现在已经成为系统缓存的必备组件 ...
- ConcurrentDictionary并发字典知多少?
背景 在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理. 有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题. https://doc ...
- openJDK知识整理及概念
上周同事去听了阿里openJDK的讲座,收集整理了一下.随着Oracle 撒手,Java 8 官方支持时间持续到 2020 年 12 月:对商业用户(Commercial Users),2019 年 ...
- 关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)
数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...