1. XSS攻击
1.1 什么是XSS攻击
XSS(跨站脚本攻击,Cross Site Scripting),是一种利用网页应用程序的安全漏洞的攻击方式,攻击者通过在网页中注入恶意脚本代码,使其在用户的浏览器中执行。这些恶意脚本可以用来窃取用户的敏感信息、篡改网页内容或进行其他未经授权的操作。
- 通过虚假输入表单盗取用户个人信息
- 通过脚本窃取用户Cookie,用户在不知情的情况下帮助攻击者发送恶意请求
- 显示伪造的文章或图片
XSS原理:恶意攻击者往Web页面里插入可执行网页脚本,当用户浏览该网页时,嵌入的网页脚本被执行,从而达到攻击盗取用户信息或其他侵犯用户隐私的目的。
<div>
#{content}
</div>
<!--
const content = <script>alert(document.cookie)</script>
此处是示例,可以在<script>注入任何JavaScript脚本。
-->
<div>
<script>alert(document.cookie)</script>
</div>
- 非持久型XSS(反射型XSS)
非持久性XSS漏洞,一般是通过给别人发送恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。
- 持久型XSS(存储型XSS)
持久型XSS漏洞,一般存在于Form表单提交等交互功能,如文章留言,提交文本信息等,黑客利用的XSS漏洞,将内容正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时恰好将其渲染执行。
1.2 如何防御XSS攻击
方式 | 描述 |
CSP-内容安全策略 | CSP-内容安全策略,通过设置HTTP响应标头中的Content-Security-Policy字段,告诉浏览器哪些来源是受信任的,哪些操作是允许的,从而减少跨站脚本(XSS)攻击的风险。 |
转义字符 | 用户的输入永远不可信任,普通做法是转义输入输出的内容,对于引号、尖括号、斜杠进行转义。 |
HttpOnly Cookie | Web应用程序设置cookie时,将其属性设置为HttpOnly,可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。 |
过滤和校验 | 前后端对输入的内容进行校验,过滤。 |
2. CSRF
2.1 什么是CSRF
CSRF(跨站请求伪造,Cross Site Request Forgery),是一种常见的Web攻击,它利用已登录的身份,在用户不知情的情况下,以用户名义完成非法操作。
CSRF危害:
- 篡改目标网站上的用户数据
- 盗取用户隐私数据
- 作为其他攻击向量的辅助攻击手法
- 传播CSRF蠕虫
CSRF原理:
2.2 如何防御CSRF攻击
方式 | 描述 |
验证码 CAPTCHA | 在关键操作(如修改密码、转账等)前引入验证码,要求用户输入验证码才能执行操作。这样可以防止CSRF攻击,因为攻击者无法获取到验证码。 |
同源检测 Same-Site Cookie | 在Cookie中设置SameSite属性,限制Cookie只能在同源请求中发送。这样可以防止跨站点请求,因为CSRF攻击需要在受害者的浏览器中发送跨站点请求 |
随机令牌 CSRF Token | 在每个表单或关键请求中引入一个随机生成的令牌,并将其与用户会话关联。服务器在接收到请求时验证令牌的有效性,如果令牌无效,则拒绝该请求。这样可以防止CSRF攻击,因为攻击者无法获取到有效的令牌。 |
Referer检查 | 服务器端可以通过检查请求头中的Referer字段来验证请求的来源是否合法。如果Referer字段与当前网站的域名不匹配,则拒绝该请求。这种方法并不可靠,因为Referer字段可以被篡改或者浏览器可能不会发送Referer字段。 |
双重认证(Two-Factor Authentication) | 引入双重认证机制,要求用户在关键操作前进行额外的身份验证。这样可以增加攻击者的难度,因为攻击者需要获取到用户的第二个认证因素才能执行恶意操作。 |
3. 点击劫持
3.1 什么是点击劫持
点击劫持是一种视觉欺骗的攻击手段,用户登录A网站后,被攻击者诱惑打开B网站,而B网站通过iframe引入了A网站的页面内容,用户在B网站中点击某个按钮(被装饰的按钮),实际上是点击了A网站的按钮。点击劫持特点:
- 隐蔽性较高,骗取用户操作
- UI覆盖攻击
- 利用iframe或者其他标签的属性
3.2 如何防御点击劫持
方式 | 描述 |
JavaScript防御 | // 判断window是否在顶层 if(window.self !== window.top) { window.top.location.replace(window.location); // 或者执行其他操作 } |
X-FRAME-OPTIONS | DENY:浏览器拒绝当前页面加载任何iframe页面,也拒绝被其他页面用iframe加载 SAMEORIGIN:iframe页面的地址只能为同源域名下的页面 ALLOW-FROM:origin为允许frame加载的页面地址 |
4. URL跳转漏洞
4.1 什么是URL跳转漏洞
URL跳转漏洞,是借助未验证的url跳转,将应用程序引导到不安全的第三方区域,从而导致的安全问题。
URL跳转漏洞原理:
黑客利用URL跳转漏洞来诱导安全意识低的用户点击,导致用户信息泄露或者资金的流失。其原理是黑客构建恶意链接(链接需要进行伪装,尽可能迷惑),发在QQ群或者是浏览量多的贴吧/论坛中。
安全意识低的用户点击后,经过服务区或者浏览器解析后,跳到恶意的网站中。
URL跳转实现方式:
- Header跳转
- JavaScript跳转
- META标签跳转
4.2 如何防御URL跳转漏洞
方式 | 描述 |
referer限制 | 如果确定传递url参数进入的来源,我们可以通过该方式实现安全限制,保证该URL的有效性,避免恶意用户自己生成跳转链接。 |
加入有效性验证Token | 保证所有生成的链接都来自可信域的,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验,可以避免用户生成自己的恶意链接从而被利用,但是如果功能本身要求比较开放,可能导致有一定的限制。 |
5. SQL注入
5.1 SQL注入是什么
SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。
SQL注入的条件:
- 可以控制输入的数据
- 服务器要执行的代码拼接了控制的数据
SQL注入危害:
- 获取数据库数据信息
- 管理员后台用户名和密码
- 获取其他数据库敏感信息:用户名、密码、手机号码、身份证号、银行卡信息
- 整个数据库:脱裤
- 获取服务器权限
- 植入WebShell获取服务器后门
- 读取服务器敏感文件
5.2 如何防御SQL注入
- 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
- 后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行一些匹配处理。
- 对进入数据库的特殊字符(',",,<,>,&,*,; 等)进行转义处理,或编码转换。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的 lodash._escapehtmlchar 库。
- 所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位参数。
6. OS命令注入
6.1 什么是OS命令注入
OS命令注入和SQL注入差不多,只不过SQL注入是针对数据库的,而OS命令注入是针对操作系统的。OS命令注入攻击指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。倘若调用Shell时存在疏漏,就可以执行插入的非法命令。
命令注入攻击可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。也就是说,通过命令注入攻击可执行操作系统上安装着的各种程序。
6.2 如何防御OS命令注入
- 后端对前端提交内容进行规则限制(比如正则表达式)
- 在调用系统命令前对所有传入参数进行命令参数转义过过滤
- 不要直接拼接命令语句,借助一些工具做拼接、转义预处理,例如,node.js的shell-escape npm包
7. 不受限的文件上传
这是一种将恶意文件上传到服务器然后对系统执行的攻击方式。攻击可能包括:使文件系统或数据库超载,接管完整的系统,客户端攻击,将攻击转发到后端系统或进行简单的破坏。
注:以上,如有不合理之处,还请帮忙指出,大家一起交流学习~