XSS分为三种基本类型。
储存型:把恶意代码注入到后台数据库进行保存,其他用户访问就会出现问题。比如说发帖,木马邮件这种,你点开之后就会出问题。
反射型:把恶意代码注入到后台数据库进行查询等操作,并将错误内容返回给前端
DOM型:把恶意代码注入到前端,并将错误内容返回给前端(没有经过后端)【感觉危害较小】
一般来说,恶意代码注入和sql注入其实差不太多。通过闭合标签,插入恶意语句。
如
<img src="#" onmouseover="alert('xss')">
onclick="alert('xss')”
等还有各种on-x的触发事件方式
当然最简单的就是直接
<script>alert('xss')</script>
这里提供一个闭合标签的案例:
输入111显示一个奇怪的话
试试直接插入 script
发现了不同。
说明这个显示和我们的输入有关,存在xxs漏洞,打开网页代码看看。
不是很好观察,再换一个输入看看
这样就可以很明显看出来,我们的输入是在两个引号之间的,并且结尾要用引号加上>来闭合
需要注意的一点:这个引号暂时无法判断是单引号或者是双引号,因为这里默认显示是双引号,我们看一下这里的代码部分。
根据处理代码可以看出来,这里应该是单引号。
所以使用如下代码
'><img src="#" onmouseover="alert('xss')">
当我们把鼠标移动到这张显示出错的图片上时
弹窗了
其中这个window.location有下面这些属性
search就是参数部分。
然后通过var txss =decodeURIComponent(str.split(“text=”)[1]);取出以text=为分割的第二个元素,第一个元素是?第二个元素就是我们输入的值。
最后var xss = txss.replace(/+/g,’ ');将+删除,这里应该是过滤经过url编码过的空格吧。
关于xss的绕过,可以注意一下html的标签是大小写不敏感的。
有时候会发现自己的输入怎么都不执行,但是输入又没有被过滤,那么估计是被转移了
m e s s a g e = h t m l s p e c i a l c h a r s ( message=htmlspecialchars( message=htmlspecialchars(_GET[‘message’],ENT_QUOTES);
这个htmlspecialchars函数就是转义用的,当然最后显示的时候是显示原字符,不会显示转义后的。
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
这个时候我们就可以采取另一种方法javascript:alert(‘XSS’)
瞬间记录一下最后这个
输入111显示这个
看一下代码
然后发现输入数据的处理有点问题。
然后搜索一下这个id
有一个这样的脚本。
发现这个111就是我们输入的数据。
然后面对这种情况可以随便构造,比如输入1';alert(1);$a='1
弹窗了
又或者直接闭合输入</script><script>alert('xss')</script>