Cross-Site Scripting,简称为XSS或跨站脚本或者跨站脚本gongji。是一种针对网站或者应用程序的漏洞gongji技术,也是利用代码注入的一种。它容许恶意用户将代码注入网页,其余用户浏览网页时将会受到影响。
XSS gongji分为三类:反射型,存储型,DOM型javascript
反射型XSS
反射型XSS又称非持久型XSS,gongji方式仅具备一次性。
gongji方式:gongji者经过包含XSS代码的恶意连接发送给受害者,当受害者访问该链接时,服务器接收该受害者用户的请求并进行处理,而后服务器把带有XSS代码的数据发送给受害者用户的浏览器,浏览器解析这段包含XSS代码的恶意脚本,就会触发XSS漏洞,完成gongji。利用
咱们用dvwa来展现基础的XSS利用
在输入框中输入<script>alert(/xss/)</script>,点击submit便可弹出存储型XSS
存储型XSS又称持久型XSS,恶意脚本将被永久的保存在服务器的数据库或者文件中。
gongji方式:多见与论坛,博客以及网站留言板。gongji者在发帖,留言的过程当中,将恶意XSS脚本连同正常信息注入内容,随着帖子,留言板被服务器存储下来,恶意XSS脚本也将保存在服务器中,当其余用户浏览帖子或者留言时,恶意XSS脚本会在他们的浏览器中执行。利用
在message框中输入<script>alert(/xss/)</script>,点击sign便可弹出xss
此时查看页面源代码
能够看到咱们的恶意代码成功保存在服务器上DOM型XSS
全称Document Object Model,使用DOM可使程序和脚本可以动态访问更新文档的内容,结构及样式。
DOM型XSS是一种特殊类型的反射型XSS,基于DOM文档对象模型的一种漏洞。
gongji方式:用户请求一个通过专门设计的连接,由gongji者提交且包含恶意XSS代码,服务器的响应不会以任何形式包含gongji者的脚本,当受害者的浏览器处理这个响应时,DOM对象就会处理XSS恶意代码。利用
图中DOM型XSS例子为再输入框里输入内容点击替换,会在“这里会显示输入的内容”替换为输入的信息
咱们在输入框中输入<img src=1 onerror=alert(/xss/) /> ,点击替换,便可触发XSShtml
##这里为DOM型XSS漏洞源码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Test</title>
<script type="text/javascript">
function tihuan(){
document.getElementById("id1").innerHTML = document.getElementById("dom_input").value;
}
</script>
</head>
<body>
<center>
<h6 id="id1">这里会显示输入的内容</h6>
<form action="" method="post">
<input type="text" id="dom_input" value="输入"><br />
<input type="button" value="替换" onclick="tihuan()">
</form>
<hr>java
</center>
</body>
</html>数据库
单击替换时会执行tihuan()函数,而tihuan()函数是一个DOM操做,经过document,getElementById获取ID为id1的节点,而后将节点id1的内容修改为id为dom_input中的值。浏览器
XSS经常使用测试语句
:
<script>alert(/xss/)</script>
<img src=1 onerror=alert(/xss/) >
<svg onload=alert(/xss/) >
<a href=javascript:alert(/xss/) >
常见的XSS编码绕过有js编码,html实体编码,url编码js编码
js提供了四种字符编码的策略
三位八进制数字,若是个数不够,在前面补0,例如"e"的编码为"\145"
两位十六进制数字,若是个数不够,在前面补0,例如"e"的编码为"\x65"
四位十六进制数字,若是个数不够,在前面补0,例如"e"的编码为"\u0065"
对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)html实体编码
命名实体:以&开头,以分号结尾
字符编码:十进制,十六进制ASCII码或者Unicode字符编码
url编码
使用XSS编码测试时须要考虑html渲染的顺序,针对多种编码的组合时,要选择合适的编码进行测试经常使用绕过方式
:
双写绕过:基于“黑名单”的方式如调用str_replace函数将输入的<script>删除,能够构造语句:<sc <script> ript> alert(/ xss /)</ script>绕过
大小写混淆绕过:<ScRipt> alert(/ xss /)</ script>
报错绕过(利用img ,body 等标签的事件或者iframe 等标签的src 注入恶意的js 代码,我这里直接就简写成报错绕过了,由于基本都是靠报错条件来触发):<img src =1 onerror = alert(/ xss /)>服务器
过滤用户输入的数据
对输出到页面的数据进行相应的编码转换dom