我正在检查涉及XSS(link)的安全竞赛的结果,发现了一些奇妙而令人恐惧的JS XSS payloas。获胜者(@kinugawamasato)使用的JavaScript压缩技术对我来说似乎完全是世俗的:
压缩有效载荷:
https://cure53.de/xmas2013/?xss=<scriPt>document.write(unescape(escape(location)
.replace(/u(..)/g,'$1%')))<\/scriPt>㱯扪散琠楤㵥污獳楤㵣汳楤㨳㌳䌷䉃㐭㐶うⴱㅄ〭
䉃〴ⴰ〸ぃ㜰㔵䄸㌠潮牯睥湴敲㵡汥牴⠯繷⸪ℱ⼮數散⡲散潲摳整⠰⤩⤾㱳癧湬潡搽攮摡瑡畲氽慬汛攮
牯睤敬業㴳㍝⬧㽳慮瑡㵀Ⅱ汬潷彤潭慩湳㴧⭤潭慩渻攮捨慲獥琽❵瑦ⴷ✾
到底发生了什么:
<object id=e classid=clsid:333C7BC4-460F-11D0-BC04-0080C7055A83 onrowenter=alert(/~w.*!1/.exec(recordset(0)))><svg onload=e.dataurl=all[e.rowdelim=33]+'?santa=@!allow_domains='+domain;e.charset='utf-7'>
该技术是否已经在某处得到记录,以便我可以研究?这个东西到底有多正常?是否已经有一些JavaScript压缩程序可以自动执行此操作? WAF对这样的有效负载有何反应?
您可以看到更多示例here。
最佳答案
每当将任何数据放入localStorage
时,我都在使用lz-string库进行JS压缩。我只是该库的用户,而不是压缩专家。但这是可以在该工具周围找到的信息...
lz-string目标:
因此,这种实现的基础是LZW,在这里Javascript client-data compression提到了Andy E。让我指出
Wikipedia - Algorithm的摘录:
Wikipedia - Encoding:
在lz字符串的情况下如何工作,我们可以在这里观察:
让我从已经提到的lz-string source引用几个步骤:
好了,现在我们知道,通过这些压缩技术,我们可以获得16位信息。我们可以在此演示中对其进行测试:http://pieroxy.net/blog/pages/lz-string/demo.html(或/和另一个here)
将
Hello, world.
转换为85 04 36 30 f6 60 40 03 0e 04 01 e9 80 39 03 26
00 a2
因此,我们需要最后一步,让我再次引用:
继续我们的示例,
Hello, world.
将被转换为҅〶惶̀Ў㦀☃ꈀ
到此为止。我们可以看到,所有...其他字符(然后是拉丁字符)的集合来自最终转换为UTF-16的过程。希望这会给一些提示...
关于javascript - 这个javascript压缩技术如何运作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23120115/