Xss漏洞介绍:

Cross-Site Scripting,简称为XSS或跨站脚本或者跨站脚本gongji。是一种针对网站或者应用程序的漏洞gongji技术,也是利用代码注入的一种。它允许恶意用户将代码注入网页,其他用户浏览网页时将会受到影响。
XSS gongji分为三类:反射型,存储型,DOM型

XSS漏洞原理及利用:

反射型XSS
反射型XSS又称非持久型XSS,gongji方式仅具有一次性。
gongji方式:gongji者通过包含XSS代码的恶意链接发送给受害者,当受害者访问该连接时,服务器接收该受害者用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给受害者用户的浏览器,浏览器解析这段包含XSS代码的恶意脚本,就会触发XSS漏洞,完成gongji。
利用
我们用dvwa来展示基础的XSS利用
XSS漏洞详解
在输入框中输入<script>alert(/xss/)</script>,点击submit即可弹出
XSS漏洞详解
存储型XSS
存储型XSS又称持久型XSS,恶意脚本将被永久的保存在服务器的数据库或者文件中。
gongji方式:多见与论坛,博客以及网站留言板。gongji者在发帖,留言的过程中,将恶意XSS脚本连同正常信息注入内容,随着帖子,留言板被服务器存储下来,恶意XSS脚本也将保存在服务器中,当其他用户浏览帖子或者留言时,恶意XSS脚本会在他们的浏览器中执行。
利用
XSS漏洞详解
在message框中输入<script>alert(/xss/)</script>,点击sign即可弹出xss
XSS漏洞详解
此时查看页面源代码
XSS漏洞详解
可以看到我们的恶意代码成功保存在服务器上
DOM型XSS
全称Document Object Model,使用DOM可以使程序和脚本能够动态访问更新文档的内容,结构及样式。
DOM型XSS是一种特殊类型的反射型XSS,基于DOM文档对象模型的一种漏洞。
gongji方式:用户请求一个经过专门设计的链接,由gongji者提交且包含恶意XSS代码,服务器的响应不会以任何形式包含gongji者的脚本,当受害者的浏览器处理这个响应时,DOM对象就会处理XSS恶意代码。
利用
XSS漏洞详解
图中DOM型XSS例子为再输入框里输入内容点击替换,会在“这里会显示输入的内容”替换为输入的信息
XSS漏洞详解
我们在输入框中输入<img src=1 onerror=alert(/xss/) /> ,点击替换,即可触发XSS
XSS漏洞详解


##这里为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>

</center>

</body>
</html>


单击替换时会执行tihuan()函数,而tihuan()函数是一个DOM操作,通过document,getElementById获取ID为id1的节点,然后将节点id1的内容修改成id为dom_input中的值。

XSS常用语句及编码绕过

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 /)>

XSS漏洞的修复

过滤用户输入的数据
对输出到页面的数据进行相应的编码转换