也许我的问题是noobish但我在互联网上找不到任何答案。
<script>
var1 = "";
someFuntion();
var2 = "";
</script>
假设我有一个这样的脚本,我可以通过输入字符串来更改var1值。 当我输入此有效负载&#34; / alert(9)/&#34;到var1脚本变成这样:
<script>
asd = ""/alert(9)/"";
qwe();
zxc = "";
</script>
当浏览器呈现html时,它会执行alert()并弹出窗口。还有不同的有效载荷,如&#34; | alert(9)|&#34;,&#34;!= alert(9)!=&#34; ,&#34 ;; alert(9); //浏览器仍会创建弹出窗口。
有人可以解释这是怎么可能的,在注入我已经显示的有效载荷后,脚本的含义是什么?
请描述一下改变后的脚本的解剖结构,即asd变量变为什么,alert()的左右连接意义是什么意思。
答案 0 :(得分:2)
这个
asd = ""/alert(9)/"";
表示取一个空字符串,除以alert(9)
个返回值,将其除以空字符串并将结果赋值给asd
。由于JS是弱类型的,因此对字符串执行除法没有问题 - 它只返回NaN
。作为副作用,您会看到警报。
在脚本中注入用户输入是一个可怕的想法,但如果必须,你应该逃避字符串以避免这样的黑客攻击。最安全的方法是通过JSON.stringify
:
userInput = '"/alert(9)/"'
safeExpr = JSON.stringify(userInput)
someJSCode = "var asd = " + safeExpr
给你
var asd="\"/alert(9)/\""