XSS攻击及防御
XSS定义
跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的
XSS原理
- 攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
- 诱使受害者打开受到攻击的服务器URL。
- 受害者在Web浏览器中打开URL,恶意脚本执行。
XSS分类
- 反射性(非持久型)
- 存储性(持久型)
如何寻找XSS漏洞
- 首先寻找漏洞输入点,一般在客户端界面显示为留言板或查询接口等。
- 当找到这样类似的漏洞输入点后,并不急于去构造相应的payload,而是通过输入一组字符外加一个特殊的识别符(可以是数字组合),提交后查看返回的源码,看是否服务器端做出了上述所说的处理即是否从客户端提交的数据有做相应的过滤或对返回的数据做相应的代码转译。而特殊的识别符就是观察点。如果输入的识别符被原封不动的返回,就说明有很大的几率存在XSS漏洞。
- 最后,根据输出点所在的html译文或者javascrip代码的上下文去构造闭合,最后构造payload
反射型XSS
反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。
反射型XSS也叫非持久型XSS,最常见的是Payload是构造在网址的某个GET参数的值里。 比如这样的:
http://192.168.162.132/DVWA-1.9/vulnerabilities/xss_r/?name=<script>confirm(1501)</script>
我们可以将指令改变为<script>alert('自定义')</script>
效果如下:
如果在网页源码中存在过滤关键字符的设置,我们就需要对其进行绕过操作。
假如网页对<script>
关键字进行了过滤,我们可以实施双写绕过操作<scr<script>ipt>
;或者可以使用大小写混合或者全大写的方式进行绕过,因为PHP语言中对大小写不敏感,<SCRIPT>
存储型XSS
存储型XSS也叫持久型XSS,存储的意思就是Payload是有经过存储的,当一个页面存在存储型XSS的时候,XSS注入成功后,那么每次访问该页面都将触发XSS。
未做过滤的注入方式
注入结果
还有一种方法,在name栏填入构造的恶意代码,由于name栏有字符大小限制,所以可以用burpsuit抓包后改为<script>alert('自定义')</script>
XSS防御机制
只要永远不相信用户的输入,就可以针对性的对用户的输入进行防御。
需要对用户的输入进行处理,只允许输入合法的值,其它值一概过滤掉。
标签转换方式
比如用户输入:<script>window.location.href=”http://www.baidu.com”;</script>
保存后最终存储的会是:<script>window.location.href="http://www.baidu.com"</script>
在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。