目录
前言
XSS概念及分类
反射型XSS(非持久性XSS)
存储型XSS(持久型XSS)
如何测试XSS漏洞
方法一:
方法二:
XSS漏洞修复
原则:不相信客户输入的数据
处理建议
资料获取方法
前言
以前都只是在各类文档中见到过XSS,也进行过相关的学习,但是都是一知半解,过了一段时间就忘了。
前几天我们收到了了一份标题为《XX账号昵称参数中存在存储XSS漏洞》的报告文档,来源是一个叫漏洞盒子的机构,看它的官方介绍,是一个互联网安全测试众测平台。
第一次在实际工作中遇到相关的问题,所以决定再系统的学习一下,此篇为学习记录。
XSS概念及分类
XSS 全称(Cross Site Scripting),直译过来就是跨站脚本攻击,是Web程序中最常见的漏洞。
有点类似于SQL注入,可以简单理解为“HTML注入”,把用户输入的数据当做脚本执行,进而达到想要的目的。而这种目的通常是恶意的,比如获取用户的Cookie,导航到恶意网站,携带木马等。
XSS攻击可以根据攻击发生的实时性分为以下几类:
反射型XSS(非持久性XSS)
简单说可充当执行脚本的恶意数据,由用户从“外部”输入,通过提交输入的方式“嵌入”到网页url中。
简单举例:
针对存在XSS攻击的某个网页输入框中输入“恶意数据”,并提交,通常,这类提交操作对应着一个get请求,当我们把这个请求发送给其他用户,并让用户在web浏览器中打开请求,这时就会把恶意数据当作脚本再次执行,比如发送cookie等信息到指定的邮箱等。
存储型XSS(持久型XSS)
类似反射型XSS,不同的是,其“恶意数据”本身就是包含在网页源码中、或者自动从服务器内部读取并“嵌入”网页中。
简单举例:
黑客在某个论坛写了一篇文章,并在文章中写入了用会充当脚本执行的数据,比如一段恶意javascript代码,这样所有浏览该文章的用户,都会自动在其浏览器中执行这段恶意代码。
非持久性XSS漏洞一般威胁的是用户个体,持久型XSS所威胁的对象可能是是大量的用户.
如何测试XSS漏洞
站在一个测试的角度,我们要怎么来对XSS漏洞进行测试呢?
方法一:
查看代码,查找关键的变量, 客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie. 例如在ASP的程序中,通过Request对象获取客户端的变量
<%
strUserCode = Request.QueryString(“code”);
strUser = Request.Form(“USER”);
strID = Request.Cookies(“ID”);
%>
假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞
方法二:
准备测试脚本:
"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"onclick="alert(document.cookie)
在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本,看能不能弹出对话框,能弹出的话说明存在XSS漏洞
XSS漏洞修复
原则:不相信客户输入的数据
XSS之所以会发生, 是因为用户输入的数据变成了代码。所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号"、“单引号”、“引号”之类的特殊字符进行编码。
攻击代码不一定在<script></script>
中,所以要做好以下措施:
将重要的cookie标记为http only, 这样的话Javascript中的document.cookie语句就不能获取到cookie了. 只允许用户输入我们期望的数据。
> 例如:年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。对数据进行Html Encode 处理
过滤或移除特殊的Html标签,
> 例如: <script>, <iframe> , < for <, > for >, " for过滤JavaScript 事件的标签。
> 例如 "onclick=", "onfocus" 等等。
处理建议
1、输入过滤:在用户输入的参数进行过滤,过滤掉’<’,’>’等符号,或者script,input,onerror等标签。
2、输出过滤:将用户输入内容作为页面内容的时候必须经过检测与过滤。使用HTMLEncode将以下特殊字符进行转码
资料获取方法
【留言777】
各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~