Hacker是这样写JS的

注* XSS攻击即 Cross Site Scripting ,通常在网页链接地址Url中注入JS代码来达到攻击手段,很多大厂都中过招,如:Twitter, 新浪微博 ,示例代码:

 http://www.demo.cn/=<script>alert(document.cookie)</script> ```
其实此代码并不能在所有浏览器上执行,但仅需要一部分浏览器(如IE6)可用,即可达到攻击效果。目前很多网站都有自动过滤XSS代码的功能,此文即介绍了一些如何屏蔽XSS过滤器的手段,其实我们可以发现,大多数在前端执行的XSS过滤都是不安全的,这对于我们在防范XSS攻击时有一定的借鉴意义。
引言
我 喜欢以一种意想不到的方式使用JavaScript,写出一些看起来奇怪但其实很管用的代码,这些代码常常能够执行一些出人意料功能。这听起来似 乎有些微不足道,但是基于这点发现足以总结出一些非常有用的编程技巧。下面写到的每一个小技巧都可以屏蔽掉XSS过滤器,这也是我写这些代码的初衷。然 而,学习这样的JavaScript代码可以明显加强你对语言本身的掌握,帮助你更好地处理输入,并且提高Web应用程序的安全性。
下面就看看这些令人惊异的JavaScript代码吧!
正则表达式替换可执行代码
当用到带有replace的正则表达式时,第二个参数支持函数赋值。在Opera中,可以利用这个参量执行代码。例如,下面这个代码片段:

'XSS'.replace(/XSS/g,alert)```
这个执行的结果将会等价于:alert(‘XSS’); 产生这种现象的原因是正则表达式的匹配项被被当成一个参数,传递到了alert函数。一般情况下,在匹配文本上你会用一个函数调用另一段代码,像这样:

'somestring'.replace(/some/,function($1){ //do something with some })```
但是,正如在第一个例子中所看到的,我们执行了一个本地alert调用,而不是用户自定义函数,并且参数由正则表达式传递到了本地调用。这是个很酷的技巧,可以屏蔽掉一些XSS过滤器。例如,先写一个字符串,再跟一个“卯点”,接着就可以调用任何你想调用的函数啦。
为 了看一看这个在XSS环境中是怎么使用的,想象一下:我们在字符串中有段未过滤的攻击代码,可能是JavaScript事件或者是script标 签,即这个字符串中出现了一个注入。首先,我们注入一个有效的函数alert(1),接着我们突破这个引号的限制,最后再写我们的正则表达式。

.replace(/.+/,eval)//```
注意我在这里用了eval函数执行我想执行的任何代码,并且为了使攻击代码传递给eval,正则表达式必须匹配所有项。
如果我把所有的代码放在一起,展示这个页的输出,这样的话就会更容易理解这个过程:
页输出:

<script>somevariableUnfiltered="YOUR INPUT"</script>```
上面的代码在分析脚本中很常见,你上网搜索的所有字符串都被一些广告公司储存在这样的分析脚本中。你可能没有注意到这些脚本,但是如果 你观察一个 Web页面的源,你会发现这是经常出现的。另外,论坛也是一个经常会用到这些脚本的地方。“YOUR INPUT”是你所控制的字符串。如果输入没有被正确过滤时,这也将被称为基于DOM的XSS注入。(注:DOM,将 HTML 文档表达为树结构,通常指HTML结构) 
输入:

alert(1)".replace(/.+/,eval)//```
输出结果:

<script>somevariableUnfiltered="alert(1)".replace(/.+/,eval)//"</script>```
注意这里"//"用于清除后面引用的单行注释。
Unicode 转义
尽管在对Unicode字符转义时,用圆括号是不太可能的,但是我们可以对正在被调用的函数名进行转义。例如:

\u0061\u006c\u0065\u0072\u0074(1)```
这句代码调用了alert(1); \u表明这是个转义字符,并且在\u0061后面的十六进制数是“a”。
另外,常规字符可以和转义字符混合或匹配使用,下面的例子就展示了这一点:

\u0061lert(1)```
你也可以将它们包含在字符串中,甚至用eval对它们求值。Unicode转义和常规的16进制或8进制转义有些不同,因为Unicode转义可以包含在一个字符串中,或者是引用函数、变量或对象中。
下面的例子展示了如何使用被求值并且被分成两部分的Unicode转义。

eval('\u'+'0061'+'lert(1)')通 过避免像命名为alert这样的常规函数,我们就可以愚弄XSS过滤器注入我们的代码。这个例子就是用来绕过PHPIDS(一个开源的IDS系 统),最终导致规则变得更健壮。如果为了分析可能运行的恶意代码,你需要在解码JavaScript时,需要考虑过滤尽可能多的编码方法。就像在这个例子 中 看到的,这不是个容易的工作。 JavaScript解析器引擎 JavaScript是一个非常动态的语言。可以执行很大量的代码。这些代码第一眼看起来似乎不能执行,然而一旦理解了解析器工作的原理,你就能够逐渐理解它背后的逻辑。 JavaScript在函数执行之前是不知道函数结果的,并且很明显它必须通过调用函数返回变量的类型。这点很有趣,举个例子:如果返回函数不能返回代码块的一个有效值,就会在函数执行之后出现语法错误。 说的到底是什么意思呢?好吧!代码总比空谈更有说服力,看下面的例子:+alert(1)--```
alert函数执行后,返回一个未定义的量,然而已经有些太晚了,语法错误立刻就会出现,这是因为自减操作符的操作数应该是一个数字。
下面是一些不会产生错误的例子:

+alert(1) 1/alert(1) alert(1)>>>/abc/```
你 可能认为上面的例子没有什么意义,但是实际上它们深刻体现了JavaScript的工作过程。一旦你理解了这些细节,JavaScript这个大 家伙就变得清晰,了解代码的执行方式可以帮助你理解解析器是怎么工作的。我觉得这类例子在追踪语法错误,检测基于DOM的XSS
攻击和检测XSS过滤器的 时候很有用。 
Throw,Delete还有什么?
你可以用想不到的方式进行删除操作,这会产生一些很古怪的语法。让我们看看将throw, delete, not和typeof操作符组合在一起会发生什么?

throwdeletetypeofalert(1)```
你可能认为这句代码不能运行,但是使用函数调用delete却是可以的,仍旧能够执行:

deletealert(1)```
这儿有一些更多的例子:

delete~[a=alert]/deletea(1)delete[a=alert],deletea(1)```
第 一眼看过去,你会认为这样的代码有语法错误,但是当你仔细分析后,你觉得会有几分道理。解析器先发现一个数组内部的变量赋值,执行赋值操作后删除 数组。同样地,删除操作是在一个函数(注* [a=alert])调用之后,因为删除操作需要在知道函数执行结果的情况下,才能删除返回的对象,即使返回的是NULL。
同时,这些代码可以用来屏蔽XSS过滤器,因为它们经常会尝试着匹配有效的语法,不希望代码太晦涩。当你的应用程序进行数据验证的时候,你应该考虑这样的例子。
声明全局对象
在屏蔽XSS过滤器的特定实例中,攻击代码经常隐藏在一个类似英语文本中的变量中。聪明的系统如PHPIDS,可以使用语法分析去比较判断访问请求是否是恶意攻击,所以这是测试这些系统很有用的方法。
仅使用全局对象或函数时,能够产生类似英文的代码块。事实上,在 sla.ckers 安全论坛上,我们可以玩个小游戏,用JavaScript形式产生类似英语的句子。为了了解这是怎么一回事,请看下面的例子:
stop, open, print && alert(1)
我自己杜撰了个名字,叫作Javascriptlish, 因为它可以产生一些看起来很不可思议的代码:

javascript : /is/^{ a : ' weird ' }[' & wonderful ']/" language " the_fun: ['never '] + stop['s']```
我们使用正则表达式/is/跟上一个操作符^,接着创造一个对象{ a : ‘weird’}(拥有a属性和赋值weird)。在我们刚刚创造的对象中,寻找' & wonderful '属性,这个属性接着被一串字符分开。
接下来我们用一个命名为the_fun 的标识和一个带有never的数组,用一个命名为stop的全局函数检查s... 的属性,所有这些都是正确的语法。
Getters/Setters函数
当火狐增加  custom syntax for setters 后, 屏蔽了一些不使用圆括弧的有趣XSS注入。Opera还不支持自定义语法---从安全角度来说,这是个优点,但对JavaScript黑客来说却不是个好 消息。然而Opera支持标准的defineSetter语法。这使我们能够通过赋值以达到调用函数的 目的,说起来这对屏蔽XSS过滤器来说也有些作用。

defineSetter('x',alert);x=1;```
假如你不了解setters/getters,那么上面的例子就是为全局变量x创造了一个设值函数。当一个变量被设定时就会调用设值函数。第二个参数alert是函数调用赋值。这样,当x被赋值成1时,就会调用alert函数,并把1作为参数。
Location允许url编码
location对象允许url用JavaScript编码。这允许你通过双重编码进一步掩饰XSS注入。

location='javascript:%61%6c%65%72%74%28%31%29'```
将它们与转义字符结合能够很好地隐藏字符串。

location='javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c %75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)'```
第一个例子是可行的,因为Opera的地址栏可以识别编码的地址串。通过用URL编码,你可以隐藏JavaScript代码。这点很有用,特别是当传递XSS攻击代码的时候,我们为了更进一步地屏蔽过滤,可以进行双重URL编码。
第二个例子结合了第一个例子利用转义字符的技巧。所以,当你对字符串解码时,就会导致alert函数以这样的形式显示:

 \u0061\u006c\u0065\u0072\u0074```
注* a 的ASCII编码为0x61

原文出处:
http://www.2cto.com/Article/201401/275203.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 之前积累了XSS 有一段时间,因为目前开始了一件有趣的工程,需要整合非常多的知识,其中Web 安全这一块出现最多的...
    刀背藏身阅读 9,045评论 0 16
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,219评论 0 4
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,654评论 0 6
  • 人生在世三万天,慢慢苦行八十年。 四季轮回悲无念,共赏圆月可一千。 不觉时光悄然转,虚度光阴十三年。 欲问俗世何作...
    幻意行天阅读 217评论 0 1
  • 我是天边一片羽, 泪洒寒雨秋风中, ...
    墨上婲阅读 293评论 0 1