常见的Web攻击手段以及防御方式
跨站脚本攻击(Cross-site Scripting, XSS)
攻击方式: 攻击者利用网页开发时留下的漏洞,通过巧妙的方法在目标网站 HTML 页面中注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如
Cookie、SessionID 等,进而危害数据安全。
本质: 恶意的脚本代码被注入到了页面中,被浏览器执行。
XSS 攻击大致可以分为以下 3 类:
存储型
注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。
e.g. :用户评论中注入恶意脚本,其他用户查看评论时,恶意脚本被执行。
<!-- 伪造的网页结构示例 --> |
在没有适当防护的情况下,攻击者可能会提交一个包含恶意JavaScript代码的评论,例如:
<script>alert('XSS攻击');</script> |
当其他用户查看评论时,恶意代码将被执行。
反射型(非持久型)
攻击者构造出特殊的 URL,其中包含恶意代码。用户点击包含恶意代码的 URL 时,网站解析执行了恶意代码。
e.g. :攻击者构造出一个链接,链接中包含了恶意代码,用户点击链接后,恶意代码被执行。
<!-- 伪造的网页结构示例 --> |
攻击者构造的恶意 URL如下:
URL: http://localhost:63342/index.html?name=%3Cscript%3Ealert(100)%3C/script%3E
正常情况下页面上是回弹出alert的,但是现在的浏览器都有XSS防护机制,可以看到这里被注入的script脚本被做了特殊字符转译,所以不会弹出。
(实测了Chrome,Safari,Firefox都无效,他们底层都做了XSS防护攻击)
DOM 型
DOM 型 XSS 攻击和存储型、反射型 XSS 攻击的差别在于,DOM 型 XSS 攻击不需要和后端交互,而是通过修改页面的 DOM
节点来完成攻击。
和反射型 XSS 攻击类似,DOM 型 XSS 攻击也是通过 URL 传入恶意代码,但是这种攻击方式不需要后端的参与,而是通过前端的脚本来完成攻击。
防御措施:
- 对所有用户输入进行适当的转义和过滤,以防止脚本执行
- 设置CSP(Content Security Policy)来减少XSS攻击的风险。
- 服务端设置 cookie 为 httpOnly,保护用户cookie不被Javascript读取
2. CSRF攻击 (Cross-Site Request Forgery 跨站请求伪造)
攻击方式: CSRF攻击允许攻击者在不知情的情况下,以受害者的身份发送或改变服务器上的请求。如果受害者在Web应用程序中具有足够的权限,攻击者可以利用这些权限执行恶意操作。
本质: 攻击者引诱用户打开一个链接,在用户已登录被攻击的网站情况下,在恶意网站中请求被攻击网站的接口,此时Cookie信息会被自动带上发送给Hacker服务器。
实现思路
- 用户登录:用户在浏览器中登录某个网站,并且该网站的服务器为用户浏览器设置了认证Cookie。
- 攻击页面构建:攻击者构造了一个恶意网页,这个网页包含了一些请求目标网站的代码,比如一个自动提交的表单。
- 用户访问恶意网页:如果用户在还没有登出之前(即Cookie还有效),不小心访问了这个恶意网页,浏览器会自动发送请求到目标网站。
- 浏览器发送请求:因为用户的Cookie仍然有效,目标网站会认为这是用户自己发出的请求,并执行相应的操作。
- 攻击完成:攻击者通过这种方式可以实现各种操作,如转账、改密码、发信息等,只要受害者有权限执行的操作。
防御措施:
- 服务端开启CORS跨域,限制请求来源
- 使用SameSite Cookie属性:设置Cookie的SameSite属性,可以限制Cookie不随跨站请求发送。
- 设置Cookie可信任域名:设置Cookie的Domain属性,只允许指定域名发送请求。
3. SQL注入
攻击方式: SQL注入是一种代码注入的攻击方式,通过把SQL命令插入到Web表单提交或输入域名的查询字符串,最终欺骗服务器执行恶意的SQL命令。
本质: 攻击者通过输入恶意的SQL语句,欺骗服务器执行恶意的SQL语句。
防御措施:
- 使用参数化查询:使用参数化查询可以有效防止SQL注入攻击。
- 限制数据库的权限:数据库的权限应该尽可能小,只赋予执行必要操作的权限。
- 对用户输入进行校验:对用户输入的数据进行校验,只允许合法的数据通过。
- 使用ORM框架:ORM框架可以有效防止SQL注入攻击。