引言
XSS是一种又热门又不太受重视的Web攻击手法,为什么会这样呢?原因有下:
1、耗时间
2、有一定几率不成功
3、没有相应的软件来完成自动化攻击
4、前期需要基本的html、js功底,后期需要扎实的html、js、actionscript2/3.0等语言的功底
5、是一种被动的攻击手法
6、对website有http-only、crossdomian.xml没有用
XSS概述
XSS
即跨站脚本,发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生。
简而言之,XSS就是在页面执行我们想要其执行的脚本语言(javascript,actionscript等)。
场景一
如图所示,存在这样一个网页。
我们试着输入abcd123,得到的结果为:
我们再看看源代码:
可以看到,我们输入的字符串被原封不动的保存在网页的代码中了。
那么我们可以思考——假设我们在输入框输入javascript代码:,这时网页会出现什么呢?
按照之前的情况,我们输入的,那么网页应该会弹出对话框。
我们输入,得到的页面为
我们再看看源代码
这与我们之前的设想完全符合。
场景二
利用标签的属性来构造XSS。
如图所示,存在这样一个网页,其作用是把第一个输入框的字符串,输出到第二个输入框。
按照场景一的思路,是否只要我们输入了javascript代码:网页就一定弹窗呢?
我们在输入框中输入代码。结果显示如下:
我们明显的可以看到,页面并没有弹出对话框。
这时大家可能会疑惑:为什么没有弹窗呢?
我们来看看源代码:
如图所示,我们输入的字符串被输出到第15行input标签里的value属性里面,被当成value里的值来显现出来,所以网页并没有弹窗。
这时候我们该怎么办呢?
有的人已经想到,可以在前面加个”>来闭合input标签。
结果显示如下:
成功弹窗了,我们再看看这时的页面:
看到后面有第二个input输入框后面跟有”>字符串,为什么会这样呢?
我们来看看源代码:
这时可以看到我们构造的代码里面有两个”>,第一个”>是为了闭合input标签,所以第二个”>就被抛弃了。
因为html的容错性高,所以并没有像php那样出现错误,而是直接把多余的字符串来输出了。
此外,img标签或者a标签都可以被用来构造XSS。
<img scr=1 onerror=alert('xss')>当找不到图片名为1的文件时,执行alert('xss')
<a href=javascrip:alert('xss')>s</a> 点击s时运行alert('xss')
<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>利用iframe的scr来弹窗
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>过滤了alert来执行弹窗