XSS跨站脚本漏洞篇

XSS跨站脚本,在任何可输入的地方过滤不严谨都有可能导致攻击者恶意构造的输入被带入执行。(永远不要相信用户的输入)
跨站脚本能存在于每个输入或不可输入的地方,使用扫描器等工具往往具有误报和漏报的情况,人工检测更是工程量巨大,且十分依赖经验。同时,检测时往往都是利用弹窗检测,即alert(1),prompt(1)等简单语句,使得人们以为xss只能做一些恶作剧式的攻击,然而实际上跨站脚本一旦利用起来,威力巨大,因此长期霸占owasp榜前三。

漏洞简述

跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在web应用程序中的计算机安全漏洞,是由于web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其它用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取cookie窃取、会话劫持、钓鱼欺骗等各种攻击。
跨站脚本漏洞原理思想为根据执行环境构造恶意输入,而程序对输入没有做检测或过滤不严谨,对输出没有做转义使得输入文本能被识别为可执行代码。

危害

  • 盗取管理员cookie
  • XSS Worm 蠕虫传播
  • 网页挂马(水坑攻击)
  • 键盘记录(有局限性)
  • 利用网站重定向
  • 修改网页内容

XSS攻击流程  

XSS跨站脚本攻击本身对web服务器没有直接伤害,它借助网站进行传播,使网站的大量用户受到攻击。
攻击者一般通过留言、电子邮件或其它途径向受害者发送一个精心构造的恶意URL,当受害者在web浏览器中打开该URL时,恶意脚本会在受害者的计算机上悄悄执行。

漏洞详情

按照XSS利用方式,可分为反射型XSS,存储型XSS,DOM型XSS。
区分:反射型与DOM型很相似,代码注入点都在URL处,但反射型需要web服务器相应,而DOM型不会与服务器产生交互。而存储型是这里面利用范围最广的、影响伤害最大的,经常出现在论坛、留言板等可供用户自由言论的地方,也是代码审计与渗透测试的重点关照对象。
更多漏洞成因分析及利用,随便谷歌一下就有一大堆,我就不再乱概述。

漏洞防御

  • 对输入进行过滤
  • 对请求进行限制
  • 对输出进行检查
  • 设置HttpOnly,CSP

对输入进行过滤
攻击者常常利用监听事件来触发恶意代码,如onerror,onfocus等,此类事件肯定是不允许被用户构造触发的。但这还不是最重要的,一般留言等信息被填入到<span><div>,而js代码都是在<script></script>标签内定义或用javascript=""包含的,攻击重点在于突破闭合并执行,防御也是。针对<>/'"&五个字符进行实体化转义,使用字符串替换,把这些特殊字符替换为对应的实体编码。PHP提供htmlspecialchars()函数,使用起来十分方便。这种防御方式多用于防御存储型XSS,可对所有用户与服务器交互的数据做一遍实体编码处理。

示例:

htmlspecialchars($_POST['liuyan']);
$x = "<script>alert(1);</script>";
echo $x;  # 将触发弹窗事件
echo htmlspecialchars($x);  # 输出$x文本,不会触发弹窗

特殊符号实体编码对应图:

过滤文本内容中的恶意代码(黑名单机制):

对请求进行限制
在蠕虫XSS攻击事件中,攻击者提前了解并预知请求格式,所以能提前构造好恶意请求,等受害者触发恶意代码时执行一系列操作,如转发评论、自动关注某用户、修改用户昵称等。这种攻击方式一般利用请求构造简单,可预测,仅对请求主体身份进行认证等。

简单的请求示例:

?action=delete&article=xxx  

1.判断请求是否由用户主动发起
验证用户发起请求时所在的环境,如发起修改密码的请求页面应该为个人主页,而不应该是其他用户的评论区(行为可疑)。

2.将请求方式由GET改为POST
GET方式会把请求内容显式的表现在URL里,而且带有一定的“存储”功能,即攻击者能提前将一定的恶意请求“存储”在URL里,诱使用户点击,从而自动完成一系列请求,因此可尽量把一些请求用POST方式发送。

3.对请求附加额外验证,如验证码等
某些请求格式是固定的,但我们可以在请求动作外添加参数token(必须不可预知且单次有效),或者在重大操作的地方增加一层额外的身份认证,防止XSS攻击及其它误操作。

对输出进行检查
对在HTML标签内或属性内出现的内容进行HTMLEncode编码处理,对在<script>标签内出现的内容进行JavaScriptEncode编码处理,对在URL中出现的内容进行URLEncode编码处理。

安全协议设置
设置HttpOnly可以防止脚本读取cookie,即使攻击者在受害者浏览器上触发了恶意代码也不能读取用户cookie,能有效防止cookie盗取。在设置cookie时声明开启即可,方法自行谷歌。
设置CSP防止浏览器加载外部脚本,能有效防止XSS攻击。详情可见:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP

关于漏洞挖掘

实战经验十分有限,仅被授权过几次进行漏洞挖掘,而且用的也是cms,加上自己实操审计的经历与打CTF的经历(这方面很少出XSS的题目),接触的都是cms这类产品。

挖掘过一款论坛的cms,Google Hack了一下发现也挺多人用的,该产品问题在于已经对各输入部分进行了类似文中的输入过滤(含XSS与SQL过滤),但论坛支持富文本编辑,在开启HTML编辑的情况下写入js代码能直接存入数据库,即没有进行过滤。同时在输出时也没有过滤,所以能通过开启HTML编辑模式构造存储型XSS。

另对一款在线二维码生成的页面(网站附属扫码登录页面)进行黑盒测试时,发现没有对URL各参数进行检查,所以能附带不符合格式的数据,劫持扫码后的跳转页面(且可以弹窗)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注