译文:JavaScript for Hackers

前言

image.png

ps:我不知道文中手法新不新,但是对我来说,值得学习,也喜欢能和大佬学习更多有用东西.喵!
我喜欢以意想不到的方式使用JavaScript,构造出看似不能工作但是却正常运行的代码,或者会产生一些意想不到的行为。这可能听起来不算什么,但我发现的这些结果让我发现了一些非常有用的技巧。下面我所描述的每种技术都可以用来bypass xss filter,这是我创造它们时的初衷。与此同时,学习这样的JavaScript可以显著提高您对该语言的了解,帮助您更好地处理用户输入,并提高Web应用程序的安全性。

RegExp替换可以执行代码

当使用正则表达式替换第二个参数时,支持函数分配。 在Opera中,似乎你可以使用这个参数来执行代码。 例如,请看下面的代码:

1.'XSS'.replace(/XSS/g,alert)

试过啦,完全ok:
看图:

image.png

通常你会使用一个函数在匹配的文本上执行另一个代码,如下所示:

1.somestring'.replace(/some/,function($1){//do something with some})
2.

我改了一下:


image.png

image.png

成功执行了.
但正如您在本节的第一个示例中所看到的,不是用户定义的函数,而是执行本地弹窗时调用,并且参数将从正则表达式传递给本地调用。 这是一个很酷的技巧,可以用来避开一些XSS过滤器,例如,如果你注入一个字符串,然后继续加点什么,你可以调用任何函数。

为了看看这是如何在XSS环境中使用的,假设我们有一个未经过滤的"在发生注入的字符串中,比如JavaScript事件或脚本标记。首先我们注入我们的payload alert(1),然后我们把引号分离出来 ,引号 - " -并继续我们的正则表达式:

1..replace(/.+/,eval)//

注意我在这里使用eval来执行我喜欢的任何代码,并且正则表达式匹配所有内容,以便将完整的payload传递给eval。
如果我将所有代码放在一起并向您显示页面的输出内容,则更容易理解正在发生的事情:

页面输出:

1.<script>somevariableUnfiltered="YOUR INPUT"</script>
2.

上述代码在您的搜索字符串由广告公司存储的分析脚本中很常见。 你经常看不到这些脚本,但是如果你查看网页的源代码,你会发现它们; 论坛是它们流行的另一个地方。"YOUR INPUT"是您控制的字符串; 如果输入未被正确过滤,这也被称为基于DOM的XSS。

1.Input:
2.
3.alert(1)".replace(/.+/,eval)//
4.
5.Resulting output:
6.
7.<script>somevariableUnfiltered="alert(1)".replace(/.+/,eval)//"</script>

注意用于删除尾部引号的单行注释。

Unicode转义

虽然在转义unicode字符时不可能使用括号,但是您可以跳过被调用函数的名称,例如:

1.\u0061\u006c\u0065\u0072\u0074(1)

image.png
image.png

这调用alert(1); \u表示这是一个Unicode转义符,并且后面的十六进制数字指定了该字符。 \ u0061a,等等。
也可以混着用:

1.\u0061lert(1)

你也可以将它们包含在字符串中,例如使用eval。 Unicode转义与正常的十六进制或八进制转义不同,因为它们可以包含在字符串中,或者是对函数,变量或对象的引用。

下面的例子显示了如何使用eval并分割成不同部分的unicode转义符:

1.eval('\\u'+'0061'+'lert(1)')

通过避免像alert这样的正常函数名称,我们可以欺骗XSS过滤器来注入我们的代码。 这个例子被用来绕过PHPIDS(一个开源的IDS系统),这导致规则随后变得更加强大。 如果您在运行时考虑将JavaScript代码进行一些恶意攻击,您需要考虑怎么才可以让code工作; 正如你从这个例子中看到的那样,这不是一件容易的事。

JavaScript解析器引擎

JavaScript是一种非常动态的语言。 它可以执行因缺思厅的代码,表面上看起来并不合理,但是一旦你知道解析器是如何工作的,你就会开始理解它背后的逻辑。


image.png

一言不合表情包,咳咳.

JavaScript在执行之前并不知道函数的结果,显然它必须调用函数来返回变量类型。 这导致了一个有趣的怪癖 - 例如,如果返回函数没有为代码块返回有效值,则在执行该函数后会发生语法错误。
这在英语中意味着什么? 那么,能用代码说话就不要多bb,举个例子:

1.+alert(1)--

alert函数执行并返回undefined,但到那时为时已晚(先弹再执行后面的) - 递减运算符期待一个数字并因此产生错误。
还是弹了.

image.png

以下是一些更有效的例子,它们不会引发错误,但仍然很有趣。

1.+alert(1)
2.1/alert(1)
3.alert(1)>>>/abc/

您可能会认为上述示例毫无意义,但实际上它们提供了对Javascript工作方式的深入了解。 一旦你理解了这些小细节,大局上就会变得清晰,代码执行的方式可以帮助你理解解析器的工作方式。 在追踪语法错误和基于DOM的XSS以及利用XSS过滤器时,我发现这些类型的示例很有用。

Throw, Delete what?

您可以使用delete操作符的方式,这会导致一些非常古怪的语法。 让我们看看结合throw,delete,not和typeof运算符会发生什么?

1.throw delete~typeof~alert(1)

即使你认为它不可能工作,也可以在函数调用中调用delete并且它仍然执行:

1.delete alert(1)

更多板栗
image.png
1.delete~[a=alert]/delete a(1)
2.delete [a=alert],delete a(1)

一开始,你会认为他们会提出一个语法错误,但是当进一步检查代码时,它很有意义。 解析器首先在数组内找到一个变量赋值,然后执行赋值然后删除该数组。 同样,删除是在函数调用之后执行的,因为它在删除返回的对象之前需要知道函数的结果,即使它为空。

再次,这些示例已被用来击败XSS过滤器,因为它们经常试图匹配有效的语法,并且他们不期望代码的模糊性质。 在编写应用程序做数据验证时,开发人员应该考虑这些示例.

全局对象

在有某些XSS过滤器的情况下,发送隐藏在向量中的类似英文的文本会很有用。 像PHPIDS这样的系统使用英文和向量比较来确定请求是否是攻击,因此它是测试这些系统的有效方法。

image.png

使用全局对象/函数可以生成类似英文的代码块,要了解它的工作原理,请查看以下示例:

1.stop, open, print && alert(1)

我创造了Javascriptlish这个名字,因为它有可能产生一些看起来很疯狂的代码:

1.javascript : /is/^{ a : ' weird ' }[' & wonderful ']/" language "
2.the_fun: ['never '] + stop['s']

我们使用运算符^的正则表达式/is/,然后创建一个对象 { a : ‘weird’}(它有一个属性a和一个奇怪的赋值)。然后我们在对象内寻找一个属性’ & wonderful ’ 我们刚刚创建,然后被一串语言分割。

接下来,我们使用一个名为the_fun的标签和一个永远不会使用的数组,使用名为stop的全局函数并检查s的属性……所有这些都是有效的语法。

Getters/Setters fun

当Firefox为设置者添加自定义语法时,它启用了一些不使用括号的有趣的XSS向量。 Opera目前还不支持自定义语法 - 从安全的角度来看,这不错,但从JavaScript Hacker的角度来看并非如此。

Opera不支持标准的defineSetter语法。 这使我们可以通过任务调用函数,这仍然可以用于bypass XSS过滤器:

1.defineSetter('x',alert); x=1;

如果你不知道setter/getters,上面的例子为全局变量x创建一个setter。 无论什么时候变量被设置了一些东西,并且参数是从已经赋值的东西中提供的,都会调用setter。 第二个参数是要在分配时调用的函数,就是alert。 然后,当x被赋值为1时,alert函数以1作为参数被调用。

url encoding

location object允许在JavaScript代码中进行网址编码。 这允许您通过对它们进行双重编码来进一步混淆XSS向量。

1.location='javascript:%61%6c%65%72%74%28%31%29'

将它们与unicode转义相结合可以很好地隐藏字符串:

1.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)'

第二个例子结合了第一种技术和前面提到的unicode escape技术。 所以,当你解码字符串时,它会产生unicode代表的弹框,就是\u0061\u006c\u0065\u0072\u0074.

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

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,132评论 0 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,219评论 0 4
  • 今天,在这里这下自己的爱情,也是一种怀念吧。 我是一个其貌不扬,事业无成,胆小怕事的30岁男人。回首过去,我也追求...
    分分钱阅读 182评论 0 0
  • 准备工作: 1、买菜。早早去菜场买菜。看见菜薹绿油油的,忍不住买了一斤。这玩意儿在我们岭南一年四季都可以种植,价格...
    读云轩札记阅读 578评论 0 3
  • 我的妹妹搬家了,她邀我去她家玩耍。唔,客厅就是一般人家的客厅,很正常,沙发桌子电视柜,空调电视电冰箱。哦,还有...
    二货种子选手阅读 301评论 0 0