我们从一个很蠢的例子开始。
假设网站上有一个很简单的输入框,如果输入123并提交,就会保存并显示在url上。
比如现在填一段JS代码字符串并提交,就会得到一个包含所填内容的链接,并会执行JS代码,比如弹一个弹框,从而就可以诱导用户做一些事情,这是一个很简单的XSS攻击的示例。
XSS攻击,也叫跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为XSS) 是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
跨站脚本漏洞(Cross Site Scripting,常简写作XSS)简单来讲就是Web应用程序在将数据输出到网页的时候存在问题,导致攻击者可以将构造的恶意数据显示在页面的漏洞。因为跨站脚本攻击都是向网页内容中写入一段恶意的脚本或者HTML代码,故跨站脚本漏洞也被叫做HTML注入漏洞(HTML Injection)。
一般的XSS分为三类:非持久型XSS、持久性XSS和DOM Based XSS。
非持久型的就是上面例子中那种,即插即用,本质是构造一个有问题的URL,诱导用户去点就行了。因为这个URL前面的部分往往是正规网站的链接,所以会取得用户的信任,不太注意的人点了就会运行攻击者想要的脚本,前往特定网站或者获取Cookie。
持久型的也叫存储型的XSS,它会把一些恶意的文本提交到数据库,你在访问正常页面的时候把这段恶意文本读出来,也会出问题,比如留言板、博客、新闻发布系统等就容易出这种问题。
基于DOM的XSS攻击不太常见,页面上有时候会用JS来指定在特定的地方显示特定的内容,通过改变URL来修改显示的内容,达到欺骗用户的目的。
上面说到利用XSS攻击来弹窗,但实际上可以做很多事情,比如盗取Cookie,从而冒充身份来登录特定网站。还有钓鱼攻击,通过构造一个URL,把原来的页面强制覆盖掉,生成一个新的表单,让用户输入用户名和密码,不太熟悉的用户可能直接就输入了,也就被攻击者获取了。还有蠕虫攻击,新浪原来就中过一次蠕虫攻击,攻击者通过XSS漏洞提交了一个脚本,用户点链接的时候就会调用特定的JS,其作用是让用户自动关注某个微博,并且自己也自动发个微博让大家去点该链接,传播给其他用户。
总的来说,XSS本质上都是运行一段特定的代码,你想做什么都可以,但大部分也是个愿者上钩的事情,因为是用户自己点了才会出事,所以还是要自己多加留意。
作为开发者,挖掘自己系统XSS漏洞的方法有扫描工具检测(比如BruteXSS)、手工测试和源码分析。用扫描工具比较方便,手工测试则要自己去试着构造一些攻击。
漏洞防范主要是要记得使用HttpOnly和完善输入输出的检查。HttpOnly不是在过滤,而是禁止JS访问HttpOnly属性的Cookie,也就不会有XSS攻击获取Cookie的行为了。输入输出检查则是要确定输入内容可信,比如尖括号、感叹号这些在常用输入上是不会有的,发现了就要判断,此外,类似IP地址、邮箱、电话其本身是有格式规范的,输出是要对信息做编码处理,这也能过滤掉恶意的字符。
测试就分黑盒测试和白盒测试了。黑盒就是把自己当黑客,把系统给黑掉,从黑客的视角去分析,当做不知道网站是怎么运作的,尝试去攻击它。白盒就是阅读代码找常见的漏洞了。
讲者:司玮辰
后台开发者
整理:欧霄
领取专属 10元无门槛券
私享最新 技术干货