★安全测试之XSS漏洞(二)★
读书与实践是获取知识的主要渠道,学习的权力只掌握在每个人自己手中,让学习成为一种生活的习惯,这比任何名牌大学的校徽重要得多!
——张老师
张老师寄语
导图
1 反射型XSS漏洞是什么?
2.如何判断是否存在反射型XSS攻击风险?
3.反射型XSS漏洞攻击的场景?
4.怎么避免反射型XSS漏洞攻击?
1. 反射型XSS漏洞是什么?
上一篇文章中我们讲到了XSS漏洞有两种类型:存储型和反射型(实际上还有一种是基于DOM的XSS),也提到了反射型XSS漏洞的特点,即:恶意代码并没有保存在目标网站,而是通过引诱用户点击一个恶意链接来实施攻击。这类恶意链接有哪些特征呢?
主要有:
举个例子,比如我们在访问一个链接的时候(http://102.3.203.111/Web/reflectedXSS.jsp?param=value...),这个URL中就带了参数(param=value...),如果服务端没有对参数进行必要的校验,直接根据这个请求的参数值构造不同的HTML返回,让value出现在返回的html中(JS,HTML某元素的内容或者属性)并被浏览器解释执行,就可能存在反射型XSS漏洞。
可能有人会问,用户怎么可能把value改成可以执行的恶意代码呢?这不是自己坑自己吗?而且用户也不知道怎么改成恶意代码啊?而且这个“恶意代码”又是怎么传递给其他用户呢?疑问暂且保留,我们继续往下看。
我们用一张图来解释XSS漏洞攻击的原理:
上图中,攻击者(黑衣人)骗取用户信任,构造一个带有跨站脚本的链接,诱骗用户点击(第2、3步),跨站脚本在服务端(WEB应用程序)上没有被过滤,直接返回用户浏览器(第4步),用户浏览器执行恶意脚本(第5步),后面发生的事情就像第6、7步描述的那样。
2. 如何判断是否存在反射型XSS攻击风险?
上面提到,反射型XSS漏洞的前提是可以在url中附加参数,那么问题来了:应该如何构造“恶意参数”呢?
是不是只要能懂得构造“恶意参数”,并且用它来完成测试,就可以判断出系统是否存在反射型XSS漏洞呢?
并非所有系统都支持在url中添加参数,那么不支持在url中添加参数的系统是否就代表不存在XSS漏洞呢?
思考了上面这几个问题,我想我们基本可以总结出做反射型XSS漏洞测试的思路了:
1、探测输入向量。
对于存在用户交互的页面,先找出系统定义了哪些参数以及如何输入。这些参数不单单指页面上可以看到的字段,也包含隐藏的或非显式的输入,比如http参数、post数据、隐藏的表单字段、预定义的单选钮或复选框的值。
我们可以使用浏览器内置的F12控制台或抓包工具来审查这些隐藏的变量。
2、分析每个输入向量,用以推测潜在的漏洞。
为了检测潜在xss漏洞,我们可以为每个输入参数构造特别的数据。
测试数据可以借助一些模糊测试工具,自动生成攻击字符串列表。也可以参考XSS过滤的攻击列表,人工生成一些数据。
是否有一个通用的“恶意参数”构造列表呢?
我想应该是有的,不过本文主要主要目的是通过一个浅显的例子来让大家理解xss漏洞,若大家有兴趣,可以深入的理解去研究,也欢迎有研究成果之后跟小编做一下分享。
3、根绝测试结果进行分析。
根据页面的反馈,我们判断一下网站是否存在漏洞,如果存在,则再判断一下对网站安全构成什么威胁。通过这样的测试,我们可以识别出哪些地方还需要经过特别的编码、替换以及过滤。
原则上,所有的HTML关键字都需要经过html实体编码。特别需要关注的几个编码字符是:{< > & ' "}。
接下来我们用DVWA来做一下简单的练习:
1、打开我们的渗透测试的演练系统DVWA:
2、在What's your name? 输入框里输入“tester”,提交
在服务端完成响应后,观察地址栏和页面就会发现,不但url中包含了我们之前的输入内容“tester”,而且内容“Hello tester”也有 tester 这个值。
读到这里,不妨暂停一下做一个思考:这是否能说明这个网页存在反射型XSS漏洞呢?如果存在,黑客会怎么利用这个漏洞进行攻击呢?也就是说这个攻击如何传递给其他用户呢?
我想没有安全测试基础的同学是不好回答上面的两个问题的,多数同学都会有这样的疑惑:这不是很正常的一个欢迎信息吗?我们接着往下看:
3、我们在输入框中输入其他内容,比如:
4、页面就会出现一个弹窗:
弹窗的出现,说明应用系统没有对相关的JS作出过滤,所以我们可以说它是存在XSS漏洞的。
再深入思考一下:为什么要过滤呢?这样未经过滤会导致什么后果呢?换句话说,攻击者如何利用这个漏洞去攻击其他用户呢?
3. 反射型XSS攻击的场景(途径)?
说几个常见的反射型XSS漏洞攻击途径:
1. 攻击特定用户:比如可以向目标用户发送email,email中包含指向漏洞的链接,并且包含相应的攻击payload(payload:简单来说就是在程序中起关键作用的代码)。比如给管理员发送一封邮件,抱怨某个url存在问题,诱使管理员点这个链接。当管理员点这个链接的时候,由于链接指向漏洞url,并且攻击payload是盗取cookie,这个时候管理员的cookie就被盗取了。
2. 利用系统中的“即时消息”攻击:xss攻击信息存在于“即时消息”,消息接收方接收到消息之后,被xss攻击。
3. 利用网站漏洞:有些网站允许用户提交html标签,攻击者可以利用这个特性来提交含有恶意攻击的链接,诱使用户访问,如果用户是在登录状态下点击了该链接,那么session信息就会被盗取。更进一步,黑客可能采用搜素引擎使用技术,嵌入必要的关键词,确保受害者在访问漏洞链接的时候已经登录,那么黑客就能够成功的盗取session信息。
4. 还有一个是第三种方式的变种。在含有漏洞的网站,黑客购买广告,而广告指向本网站的漏洞,当受害者点广告的时候,session信息基本上能够成功盗取。
5. 许多网站具有“告诉朋友”或者“向管理员反馈”功能。为了实现这些功能,服务器会产生一封email,而email的内容可以是任意的,通过使用这种email,黑客可以注入xss payload达到攻击的目的。
4. 怎么防止这种攻击呢?
具体的做法比较复杂,不过也不需要我们测试人员关心,交给开发人员就好了。
我们测试人员只需要知道,防止反射型XSS攻击只需要进行 htmlencode ,把 html 相关字符进行转码,让其不再是有效的可执行的 html/js 代码即可(这也是最大的难点)。
PS: 目前 chrome、safari 等主流浏览器已经自动做了 xss filter ,自动转码 html 相关字符,目前貌似只有 firefox 没有做这个处理。
5. 后记
这篇文章从收到投稿至今已经一周了,严格来说还是一个半成品。因为小编对于部分问题仍心存疑惑。我想这一点从这篇文章中的内容也能感受出来,因为很多问题小编并没有给出明确的答案。
今天将这篇“半成品”发出来,是希望能抛砖引玉,让更多的人关注安全,也希望有读者能在留言中解答小编的疑惑。
6. 相关链接