WebGoat学习——跨站脚本攻击(Cross‐Site Scripting (XSS))
跨站脚本攻击(Cross‐Site Scripting (XSS))
XSS(Cross Site Script)跨站脚本攻击。是指攻击者向被攻击Web 页面里插入恶意html代码,当用户浏览该页之时,嵌入其中的HTML代码会被执行,从而达到攻击的特殊目的。XSS和CSRF(Cross site request forgery)合称Web 杀手组合。黑客洞穿页面逻辑,使输入的内容被按照期望内容展示出来,从而达到欺骗或攻击用户的效果。常见的xss攻击类型有存储xss攻击和反射型xss攻击。
存储型XSS(Stored XSS)
存储型xss是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能。
图 1 存储型xss攻击示例
1. 用户A修改个人信息,并将带有威胁性的js代码作为个人信息发送到server端;
2. server端未加过滤将用户资料存储到服务器;
3. 用户B在好友列表中看到用户A,并查看用户A个人资料;
4. server端取出用户A资料返回到web前端;
5. 前端按照预先规则展示,其中包含了用户A带有html标签和js的前端可执行代码,从而在用户B机器上执行了用户A预先设定好的任意威胁性的代码。
例如用户A修改用户备注为:<script>alert("haha");</script>,按照上述流程用户B的页面上执行这段代码。
举个例子,黑客预先调查某bbs展示帖子内容的代码逻辑,然后发帖:
提交之后,出现在帖子列表:
当其他用户点击帖子查看时,悲剧发生了:
,还好,只是恶作剧。
解决方案
1. 做xss过滤,将一些不合理的标签(例如:< > % /)做转义或者过滤,在存入DB前做xss过滤要比展示前做xss过滤更有效。
2. 限制用户输入的字符,比如:码只允许\s = whitspace: \t\n\x0B\f\r,\w = word: a-zA-Z_0-9
反射型XSS(Reflected XSS)
如果server端未做输入参数的过滤或者过滤不完整导致用户的输入数据可能返回到前端页面,Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。
图 2 反射型xss示例
1. 用户A构造参数值带有js代码URL,并将URL发给好友B,告诉他可以参与活动;
2. 好友B收到请求后发现是官方的URL,于是点击URL;
3. server端未严格校验请求参数,将参数直接返回到前端页面;
4. 参数中的js代码随着html返回到用户B浏览器并得以执行。
例如某网站输入用户信息后,服务器校验输入有误,返回错误页面并“友好”的将错误内容展示给用户看,例如:
用户将带有攻击性的URL做为输入源,例如:<img src="www.xxx.com"/>,服务端会跳转到对应的错误页,如下:
这样www.xxx.com里的恶意js会被执行。
黑客可以将提交请求的URL进行进行包装或者直接暴露URL,用户通常看到可信任网站的URL会不加防范的点击,从而造成损失,例如上述可以暴露给用户URL:
解决方案:
同存储型xss攻击。