1、反射型XSS
当发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。
流程图:
看一个例子:
这是一个存在xss的一个网页,那我们在输入框输入js脚本代码来测试是否执行我们的脚本。
#正常情况下我们会输入以下代码的其中一个
<script>alert(/xss/)</script> //提示框 弹窗
<script>confirm('xss')</script> //确认框 弹窗
<script>prompt('xss')</script> //输入框 弹窗
#这些代码简单,效果又明显
当我们点击test提交数据时,可以看到我们输入的js被执行弹出了提示框
通过URL可以看到,输入的值会被拼接在URL上当作参数传入后端,经过钩端的处理返回到页面,被浏览器解析,导致脚本执行。
源码:
特点:1、即时性。不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;2、攻击者需要诱骗点击;3、反馈率低,所以较难发现和响应修复;4、盗取用户敏感保密信息。
2、存储型XSS
存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。
流程:
看一个例子:
上面是一个存在xss漏洞的留言板,那么我们在留言板上留言一个js脚本并提交。
js脚本被执行了,此时还看不出和反射型的区别。但我们将页面关闭再打开,或者点到别的页面再点回来。
可以看到js代码再次执行了,留言列表也出现了,我们的js脚本存放再列表中,当我们进入页面时,浏览器会解析页面,列表中的数据也会被解析,那js脚本被解析就会执行。只要我们的js脚本没有被删除,只要有人访问就会执行,从而达到代码自动执行和持久性的效果。
**特点:**1、持久性,植入在数据库中;2、危害面广,甚至可以让用户机器变成 DDoS 攻击的肉鸡;3、 盗取用户敏感私密信息。
3、DOM型XSS
DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式,DOM-XSS简单理解就是不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题。
DOM中有很多对象,其中一些是用户可以操纵的,如URI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如
作者徽是vip1024c
果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
看一个例子:
结合前端与源码可以看到,当我们点击click me时会将我们输入的值会经过js脚本代码的处理,插入到id 为"dom"的标签中。可以看到只在前端完成,没有经过服务器后端。
四、防御手段
1、对输入和URL参数进行过滤(白名单和黑名单)
检查用户输入的数据中是否包含一些特殊字符,如<、>、’、“等,发现存在特殊字符,将这些特殊字符过滤或者编码。
2、HTML实体编码
字符串js编码转换成实体html编码的方法
3、对输出内容进行编码
在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版PDF学习资源私我