XSS是跨站脚本(Cross Site Script)的意思,由于网站技术中的Cascading Style Sheets被缩写为CSS,为了不至于产生概念混淆,故一般用XSS来简称跨站脚本。
从数量上讲,XSS是目前所有漏洞中所占比例最大的一类,编程时稍不留意就会产生这种漏洞,而且防不胜防。
在很多Web应用中,服务器都将客户端输入或请求的数据“经过简单的加工”后,再以页面文本的形式返回给客户端,例如,搜索引擎将用户输入的搜索串返回在页面中;运行出错时将用户输入的信息返回在错误提示页面中;论坛中显示用户提交的帖子等。
在这些Web应用中,如果对用户输入“加工”过于简单,就会产生XSS漏洞。例如,下面这种代码对用户输入的数据没有经过任何“加工”,就直接返回给了客户端。
< ?php echo $input ?>
当用户进行正常的请求:
http://testapp.com/test.php?input=this is a test
服务器将简单地把“this is a test”返回给客户端的浏览器,浏览器解析后会将这段文本显示在页面中。
但是,当遇到类似下面这样的请求时:
http://testapp.com/test.php?input=
“”对于Web服务器来说,和前一次请求中的输入“this is a test”没有任何质的区别,都是文本字符串,因此也将直接返回给客户端的浏览器。
客户端的浏览器在解析这次反馈的页面时,发现页面中的是脚本命令,而不是数据,因此会把“”当作脚本命令进行解析,进而执行,弹出一个警告消息框
类似的,在搜索引擎、错误提示页面、论坛空间等Web应用中,如果对用户输入的数据没有经过很好的过滤,攻击者很可能利用这些“可信”的网站使用户的浏览器执行一些恶意的脚本。
XSS漏洞产生于Web服务器把用户输入数据直接返回给客户端。与SQL注入攻击不同,这种攻击一般不能对Web服务器造成恶劣的影响,而只是利用Web服务器作为桥梁去攻击普通用户。跨站脚本中的“站”就是指被利用的Web服务器。
题外话:以上提法实际不够严密。随着XSS蠕虫的出现,XSS对服务器的攻击也逐渐得到重视。
比起执行shellcode获得远程控制的缓冲区溢出漏洞或者渗透数据库控制网站的SQL注入漏洞来说,很多攻击者和安全专家都对XSS漏洞不以为然,因为几句脚本命令的攻击效果非常有限,可能只能做到类似窃取cookie之类的事。
针对这个误区,我需要再指明两点:首先,XSS攻击的目标是客户端的浏览器,因此受影响的范围要远远大于攻击服务器的SQL注入攻击;其次,独立的XSS漏洞攻击并不是非常严重,但是配合上其他攻击技术往往能产生非常严重的后果。
文章评论