漏洞描述
当应用程序没有验证输入数据并产生输出时,这个时候就会产生XSS漏洞,攻击者可利用此漏洞进行Cookie窃取、会话劫持、钓鱼等攻击。
“一切输入都是不安全的”,Web应用的漏洞几乎都是由一个原因造成:不能在使用前正确验证输入的数据。XSS便是其中之一,攻击者可以在网页中写入恶意脚本,用户访问或点击的时候就会被执行。通常是由JavaScript编写,偶尔也会使用ActionScript、VBScript。XSS能利用到何种程度,取决于如何编写脚本,当然,和上下文环境也有关系。
漏洞检测
要判断系统是否存在XSS,只需要测试能否操纵应用程序参数输入,使其产生恶意输出即可,因此XSS漏洞的检测,有三大要点:输入点,输出点,以及恶意输出。
输入点,数据输入的参数位置。客户端与服务器端的交互,是通过请求和响应实现的,请求的时候往往会附带一些参数,这些参数就是数据的输入点,我们需要修改这些参数的值来影响服务器端的响应,并根据响应找出输出点。
输出点,输入数据的输出位置。有些数据输入后,经过服务器处理,往往会返回给客户端,可能出现在html标签中,也可能出现在script脚本中,我们需要根据位置的不同而使用不同的XSS构造方式。
恶意输出,在XSS中通常是指由JavaScript编写的代码。这些代码能实现一定功能和页面效果:弹框、发送Cookie、键盘记录等。
寻找输入点
页面有两个输入框,要求输入名字和姓氏,然后点击GO,姓名就会显示在下方。我们现在来检测这个功能是否存在XSS。
开启抓包工具,设置好代理,输入名字和姓氏。
点击GO,抓到如下请求包。请求行中有三个参数,其中两个参数正好对应两个输入框,这三个参数都是潜在的XSS输入点,特别是输入框对应的firstname参数和lastname参数。
寻找输出点
输出点我们可以通过在响应中查找输入点的值来找到。以firstname为例,我们在响应中查找bwapp这个值的位置。
发现响应中有8个匹配的值,难道有8个输出点?很多时候,为了更快速、准确的找出输出点,我们通常会将输入点的值修改为独一无二的值,如1234567,abcde等,以保证不会和系统其他参数值雷同。
这样就准确找到了firstname这个输入点的输出点。
恶意输出
最终XSS的检测需要结合输入点和输出点。在输入点的值中加入恶意代码,查看输出点是否会产生恶意输出。
发现服务端没有对用户输入做任何处理就直接输出到页面上,弹出一个警告框。这就证明firstname参数存在XSS。依此流程检测,发现lastname同样存在XSS,但form参数不存在XSS。
漏洞修复
输入过滤;对用户的输入进行检测,过滤掉输入中的非法字符。
输出编码;在将输入输出到页面之前,将输入中未过滤的特殊字符进行转义,使其以文本形式展示,而不是被解析成页面结构或脚本。
PS
在这里要申明一下,每日漏洞系列旨在告诉大家发现漏洞的最基本操作,每日学会一个漏洞的检测方法。就比如做菜,每日漏洞系列会教你第一步点火,第二步放油,第三步炒菜,第四步出锅,但不会教你用多大的火,放多少油,炒多久,这些细节我会在其他文章里深入介绍,所以如果只看这篇文章,我只能保证你会做菜,这菜能不能吃,只能交给命运了。
免责声明
安全小白团是帮助用户了解信息安全技术、安全漏洞相关信息的博客。安全小白团提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,安全小白团不承担任何法律及连带责任。