前端安全-XSS、CRSF、SSRF总结

引用
作者:美团技术团队
前端安全系列之一:如何防止XSS攻击?
链接:https://juejin.im/post/5bad9140e51d450e935c6d64
前端安全系列之二:如何防止CSRF攻击?
链接:https://juejin.im/post/5bc009996fb9a05d0a055192
作者:BerL1n 链接:https://www.jianshu.com/p/d1d1c40f6d4c
作者:z3r0yu 链接:https://xz.aliyun.com/t/2115

1.XSS攻击

1.1XSS定义

​ Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

​ XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

1.2XSS注入方式

  • 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
  • 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
  • 在标签的 href、src 等属性中,包含 javascript: 等可执行代码。
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码。
  • 在 style 属性和标签中,包含类似 background-image:url("javascript:..."); 的代码(新版本浏览器已经可以防范)。
  • 在 style 属性和标签中,包含类似 expression(...) 的 CSS 表达式代码(新版本浏览器已经可以防范)。

总之,如果开发者没有将用户输入的文本进行合适的过滤,就贸然插入到 HTML 中,这很容易造成注入漏洞。攻击者可以利用漏洞,构造出恶意的代码指令,进而利用恶意代码危害数据安全。

1.3预防方式

  • 输入过滤:在用户提交时,由前端过滤输入,然后提交到后端。

    • 缺点:会导致乱码问题,只能解决特定的XSS问题。
    • 适用于有明确输入类型的数据的过滤:如数字、URL、电话号码、邮件地址等用户提交信息。
  • 预防存储型和反射型XSS攻击:存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器所执行。预防这两种漏洞,有两种常见做法:

    • 改成纯前端渲染,把代码和数据分隔开,浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据,然后执行HTML中JavaScript通过Ajax加载业务数据。-
    • 对 HTML 做充分转义:使用更完善更细致的转义策略,设置自定的HTML转义规则。
  • 预防 DOM 型 XSS 攻击:DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。要通过避免在字符串中拼接不可信数据。


2.CSRF攻击

2.1 CSRF定义

​ CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

CSRF的特点

  • 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
  • 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
  • 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
  • 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。

CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。

2.2CSRF攻击方式

2.2.1攻击流程

  1. 受害者登录a.com,并保留了登录凭证(Cookie)。
  2. 攻击者引诱受害者访问了b.com。
  3. b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
  4. a.com接收到请求后,对请求进行验证,确认受害者的凭证,误以为是受害者自己发送的请求。
  5. a.com以受害者的名义执行了act=xx。
  6. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了不当的操作。

2.2.2攻击类型

  • GET类型的CSRF

GET类型的CSRF利用非常简单,只需要一个HTTP请求,一般会这样利用:

 <img src="http://bank.example/withdraw?amount=10000&for=hacker" > 

在受害者访问含有这个img的页面后,浏览器会自动向http://bank.example/withdraw?account=xiaoming&amount=10000&for=hacker发出一次HTTP请求。伪装页面bank.example就会收到包含受害者登录信息的一次跨域请求。

  • POST类型的CSRF

这种类型的CSRF利用起来通常使用的是一个自动提交的表单,如:

 <form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
    <input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script> 

访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。

POST类型的攻击通常比GET要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST上面。

  • 链接类型的CSRF

链接类型的CSRF并不常见,比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发。这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:

  <a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank">
  重磅消息!!
  <a/>

由于之前用户登录了信任的网站A,并且保存登录状态,只要用户主动访问上面的这个PHP页面,则表示攻击成功。

2.3预防方式

CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF的防护能力来提升安全性。

上文中讲了CSRF的两个特点:

  • CSRF(通常)发生在第三方域名。
  • CSRF攻击者不能获取到Cookie等信息,只是使用。

针对这两点,我们可以专门制定防护策略,如下:

  • 阻止不明外域的访问(例如:知乎、简书跳转外域时提醒)
    • 同源检测
    • Samesite Cookie
  • 提交时要求附加本域才能获取的信息
    • CSRF Token
    • 双重Cookie验证

3.SSRF攻击

3.1 SSRF定义

​ SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

​ SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。

3.2 SSRF攻击方式

3.2.1攻击流程

比如 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站。

普通用户只可以访问a网站,不能访问b网站。但是攻击者可以同过a网站做中间人,访问b网站,从而达到获取b网站未公开信息的目的。

  1. 输入A网站URLwww.a.com/xxx.php?image=URL,发送请求
  2. A服务器接受请求处理
  3. 返回用户相应

产生的原因:服务器端的验证并没有对其请求获取图片的参数(image=)做出过滤以及限制,导致A网站可以从其他服务器的获取数据。如:

  1. 输入的URL为:www.baidu.com/xxx.php?image=www.abc.com/1.jpg

  2. 如果我们将www.abd.com/1.jpg换为与该服务器相连的内网服务器地址,直接进行访问。

  3. 如果存在该内网地址就会返回1xx 2xx 之类的状态码,不存在就会其他的状态码。

由此就导致了内部网站资源的泄露,出现如下等问题:

1.内外网的端口和服务扫描2.主机本地敏感数据的读取3.内外网主机应用程序漏洞的利用4.内外网Web站点漏洞的利用

3.3预防方式

1.禁止跳转

2.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

3.禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题

4.设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)

5.限制请求的端口为http常用的端口,比如 80、443、8080、8090

6.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章