常见的网站应用攻击与防御

本贴最后更新于 2206 天前,其中的信息可能已经时异事殊

一、XSS 攻击

XSS 攻击即跨站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意 HTML 脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。

常见 XSS 攻击类型有两种:

  1. 反射型,攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的。
    典型案例:2011 年 6 月 28 日,很多微博用户发现自己“中毒”,自动关注了一个叫 hellosamy 的用户,并发布含有病毒的微博,粉丝点击后微博再度扩散,短时间内大量用户中招,数小时后新浪微博修复漏洞。
    攻击者发布的微博中有一个含有恶意脚本的 URL(实际应用中,该脚本在攻击者自己的服务器www.2kt.cn,URL 中包含脚本的链接),用户点击该 URL,脚本会自动关注攻击者的新浪微博 ID,发布含有恶意脚本 URL 的微博,攻击就被扩散了。
    这次攻击还只是一次恶作剧,现实中,攻击者可以采用 XSS 攻击,偷取用户 Cookie、密码等重要数据,进而伪造交易、盗窃用户财产、窃取情报。

  2. 持久型,黑客提交含有恶意脚本的请求,保存在被攻击的 Web 站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的。此种攻击常使用在论坛,博客等 Web 应用中。

XSS 防攻击手段:

  1. 消毒。XSS 攻击者一般都是通过在请求中嵌入恶意脚本达到攻击的目的,这些脚本是一般用户输入中不使用的,如果进行过滤和消毒处理,即对某些 html 危险字符转义,如">"转义为">"、"<"转义为"<"等,就可以防止大部分攻击。为了避免对不必要的内容错误转义,如"3<5"中的"<"需要进行文本匹配后再转义,如"<"才转义。消毒是所有网站最必备的 XSS 防攻击手段。

  2. HttpOnly。使用 HttpOnly 可以防止 XSS 攻击者窃取存放重要敏感信息的 Cookie,如用户认证信息等。通过对该 Cookie 添加 HttpOnly 属性,避免被攻击脚本窃取。

二、注入攻击

SQL 注入攻击和 OS 注入攻击。
SQL 注入攻击:是攻击者在 HTTP 请求中注入恶意 SQL 命令,服务器用请求参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行。
OS 注入攻击:是操作系统命令注入,与 SQL 注入类似,将在操作系统上执行恶意命令。

预防 SQL 注入攻击的手段:

  1. 防止攻击者获取数据库表结构信息。
    (1) 若系统开源,攻击者将很容易获取数据库结构信息。
    (2) 若开启了错误回显,即服务器 500 错误会显示在浏览器上。攻击者通过故意构造非法参数,使服务器异常信息输出到浏览器端,将会使攻击者更易猜测数据库表结构。
    (3) 盲注,攻击者根据页面变化情况该判断 SQL 语句的执行情况,据此猜测数据库表结构,此种方式难度较大。
    首先应防止攻击者猜测到表名等数据库表结构信息。

  2. 消毒。和防 XSS 攻击一样,请求参数消毒是一种比较简单粗暴又有效的手段。通过正则匹配,过滤请求数据中可能注入的 SQL,如"drop table"、"\b(?:update\b.?\bset|delete\b\W?\bfrom)\b"等。

  3. 参数绑定。使用预编译手段,绑定参数是最好的防 SQL 注入方法。

三、CSRF 攻击

CSRF(Cross Site Request Forgery,跨站点请求伪造),攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易、发表评论等。CSRF 主要手法是利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。其核心是利用了浏览器 Cookie 或服务器 Session 策略,盗取用户身份。

例:如果用户在登陆受信任服务器(如银行网站)A 后,此时浏览器 cookie 和服务器 session 记录了用户的登陆状态。在浏览器 cookie 及服务器 session 未过期时,用户访问了攻击者的服务器 B,B 网站脚本中包含访问受信任服务器 A 的请求,此时该请求将携带浏览器 cookie 信息访问到受信任服务器 A,此时将会在用户不知情的情况下以用户的身份执行了某些恶意操作(如转账操作)。

预防 CSRF 攻击的手段:

  1. 表单 Token,CSRF 是一个伪造用户请求的操作,所以需要构造用户请求的所有参数才可以。表单 Token 通过在请求参数中增加随机数的方法来组织攻击者获得所有请求参数:在页面表单中增加一个随机数作为 Token,每次响应页面的 Token 都不相同,从正常页面提交的请求会包含该 Token 值,而伪造的请求无法获得该值,服务器检查请求参数中 Token 的值是否存在并且正确,以确定请求提交者是否合法。

  2. 验证码。验证码更为简单有效,即请求提交时,需要用户输入验证码,以避免在用户不知情的情况下被攻击者伪造请求。但是输入验证码是一个糟糕的用户体验,所以请在必要时使用,如支付交易等关键页面。

  3. Referer check,HTTP 请求头的 Referer 域中记录着请求来源,可通过检查请求来源,验证其是否合法。很多网站使用这个功能实现了图片防盗链(如果图片访问的页面来源不是自己的网站就拒绝)。点此查看 nginx 利用 referer 配置图片防盗链的方法

四、文件上传漏洞

一般网站都会有文件上传功能,设置头像、分享视频、上传附件等。如果上传的是可执行程序,并通过该程序获得服务器端命令执行能力,那么攻击者几乎可以在服务器上为所欲为,并以此为跳板攻击集群环境的其他机器。
最有效的防御手段是设置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名、使用专门的存储等手段,保护服务器免受上传文件攻击。

五、路径遍历漏洞

攻击者在请求 URl 中使用相对路径,遍历系统未开放的目录和文件(如使用../和./之类的目录跳转符)。
防御方法主要是将 JS、CSS 等资源文件部署在独立服务器、使用独立域名,其他文件不使用静态 URL 访问,动态参数不包含文件路径信息。使用绝对路径 + 参数来控制访问目录等。

参考自:《大型网站技术架构》

  • 安全

    安全永远都不是一个小问题。

    200 引用 • 816 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...