我在网站的一部分中读取输入并将其显示回该网站。唯一的不同是文本被转换为全部大写。
我想证明可以进行JavaScript注入。
例如,如果我保存
<script>alert('hello');</script>
此内容以
的形式写入html <SCRIPT>ALERT('HELLO');</SCRIPT>
由于ALERT不是javascript关键字,因此不会运行任何内容。
是否有可能创建可以转换为javascript可以编译的所有大写字母的东西,以向其他人表明可以进行代码注入?
文本被截断为60个字符。
答案 0 :(得分:4)
从理论上讲,如果转换器愚蠢到只对字母起作用,则可以将恶意代码转换为类似JSFuck的代码,该代码仅使用以下字符进行操作:()+[]!
都没有大写字母替代。
这个想法只是找到您需要的字符而无需实际表达它们。实际上,这就是这种特殊的深奥语言的全部要点,先映射特定字符,然后对其进行评估。
例如:(![]+"")[1]
的意思是"a"
![]
的意思是false
false+""
的意思是"false"
("false")[1]
的意思是"a"
从那里您可以构建所需的任何功能,而无需键入单个小写字母。要使该代码在60个字符以内的全局上下文中执行,困难的部分。给定的库显示您可以通过Window
进入[]["filter"]["constructor"]("return this")()
,但是您需要首先将那些小写的String映射到其他符号。
无论如何,最好是找到一种明确阻止用户提供的内容在全局上下文中执行的方法。您不会通过采取软性措施使其无法正常工作来解决问题。如果下一版本的JavaScript引入了破坏这种预防机制的语言功能,该怎么办?
如果您想让自己头疼,请考虑所有可以逃避XSS过滤的方法:XSS Filter Evasion Cheat Sheet。您还应该看看这个问题,它对用户生成的脚本注入进行了广泛的讨论:How to prevent Javascript injection attacks within user-generated HTML。
答案 1 :(得分:0)
如果您在网站中使用jQuery,则只需重新分配$
,它将杀死直接使用它的所有代码:
//some normal code
$("div").css("color", "red"); //boom!
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<SCRIPT>$ = "I COME FROM EVIL INPUT"</SCRIPT>
<div>Some content</div>
是的,您可以通过确保将jQuery正确注入到需要它的每个脚本中来保护它。当多个库可能抢占全局$
时,这种情况曾经很普遍,因此您要确保$
变量是正确的:
//some normal code but this time protected
(function($) {
// ^---<-- not using the global $ <-----
$("div").css("color", "red");// |
})(jQuery)// |
// ^^^^^^-->---------------------->-----------^
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<SCRIPT>$ = "I COME FROM EVIL INPUT"</SCRIPT>
<div>Some content</div>
但是,最近它略有失宠了-它通常只是使用$
的jQuery,因此您不必总是保护它。您是否确定$
所在的每一行都不是全局行?
如果是的话,这是下一个简单的攻击:
const someJSON = '{ "name" : "Fred", "age" : 42 }';
const obj = JSON.parse(someJSON); //boom!
console.log(obj.name);
<SCRIPT>JSON = "I COME FROM EVIL INPUT"</SCRIPT>
您是否使用AJAX与服务器通信?还是尝试从localStorage中获取内容?好吧,我非常怀疑您对JSON
和$
的保护程度是否一样,并且我怀疑您具有自定义JSON读取器。
我希望您现在可以看到模式-window
附带的所有内容都可以使用大写,因此可以进一步削弱应用程序。
我毫不怀疑可以对所有大写JS进行操作以产生小写字母。我想不出现在如何,但是当攻击者弄清楚了这一点后,您可以期待更多残酷但有效的事情:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<SCRIPT>$("HTML")["html"]("I COME FROM EVIL INPUT")</SCRIPT>
<!-- ^^^^ this needs to be lowercased...and boom! -->
<body>
<div>Some content</div>
<div>Some more content</div>
<div>Final content</div>
</body>