25 网站应用攻击与防御
[](()1 XSS 攻击
XSS 攻击即跨站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意 HTML 脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。
常见的 XSS 攻击类型有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚 本的链接,达到攻击的目的,如图 8.1 所示。上文提到的新浪微博攻击就是一种反射型 XSS 攻击。攻击者发布的微博中有一个含有恶意脚本的 URL (在实际应用中,该脚本在 攻击者自己的服务器 www.2kt.cn, URL 中包含脚本的链接),用户点击该 URL,脚本会 自动关注攻击者的新浪微博 ID,发布含有恶意脚本 URL 的微博,攻击就被扩散了。
这次攻击还只是一次恶作剧而已,现实中,攻击者可以采用 XSS 攻击,偷取用户 Cookie,密码等重要数据,进而伪造交易。盗取用户财产,窃取情报。
另外一种 XSS 攻击是持久型 XSS 攻击,黑客提交含有恶意脚本的请求,保存在被攻击的 Web 站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的,如图 8.2 所示。此种攻击经常使用在论坛,博客等 Web 应用中。
XSS 攻击相对而言是一种“古老”的攻击手段,却又历久弥新,不断变化出新的攻 击花样,许多以前认为不可能用来攻击的漏洞也逐渐被攻击者利用。因此 XSS 防攻击也 是非常复杂的。主要手段有如下两种。
消毒
XSS 攻击者一般都是通过在请求中嵌入恶意脚本达到攻击的目的,这些脚本是一般 用户输入中不使用的,如果进行过滤和消毒处理,即对某些 html 危险字符转义,如 转义为“>”、"V”转义为“<”等,就可以防止大部分攻击。为了避免对不必要的内 容错误转义,如“3<5”中的“V”需要进行文本匹配后再转义,如“vimg src=”这样的上下文中的才转义。事实上,消毒几乎是所有网站最必备的 XSS 防攻击手段。
HttpOnly
最早由微软提出,即浏览器禁止页面 JavaScript 访问带有 HttpOnly 属性的 Cookie0 HttpOnly 并不是直接对抗 XSS 攻击的,而是防止 XSS 攻击者窃取 Cookie。对于存放敏感 信息的 Cookie,如用户认证信息等,可通过对该 Cookie 添加 HttpOnly 属性,避免被攻击 脚本窃取。
[](()2 注入攻击
注入攻击主要有两种形式,SQL 注入攻击和 OS 注入攻击。SQL 注入攻击的原理如图 8.3 所示。攻击者在 HTTP 请求中注入恶意 SQL 命令(drop table users;),服务器用请 求参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行。
SQL 注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构信息的手段有如下几种。
开源
如果网站采用开源软件搭建,如用 Discuz!搭建论坛网站,那么网站数据库结构就是 公开的,攻击者可以直接获得。
错误回显
如果网站开启错误回显,即服务器内部 500 错误会显示到浏览器上。攻击者通过故 意构造非法参数,使服务端异常信息输出到浏览器端,为攻击猜测数据库表结构提供了 便利。
盲注
网站关闭错误回显,攻击者根据页面变化情况判断 SQL 语句的执行情况,据此猜测 数据库表结构,此种方式攻击难度较大。
防御 SQL 注入攻击首先要避免被攻击者猜测到表名等数据库表结构信息,此外还可
以采用如下方式。
消毒
和防 XSS 攻击一样,请求参数消毒是一种比较简单粗暴又有效的手段。通过正则匹 配,过滤请求数据中可能注入的 SQL,如“drop table ”" \b(?:update\b.?\bset |delete\b\W?\bfom)\b, 等。
参数绑定
使用预编译手段,绑定参数是最好的防 SQL 注入方法。目前许多数据访问层框架, 如 IBatis, Hibernate 等,都实现 SQL 预编译和参数绑定,攻击者的恶意 SQL 会被当做 SQL 的参数,而不是 SQL 命令被执行。
除了 SQL 注入,攻击者还根据具体应用,注入 OS 命令、编程语言代码等,利用程 序漏洞,达到攻击目的。
[](()3 CSRF 攻击
CSRF ( Cross Site Request Forgery,跨站点请求伪造),攻击者通过跨站请求,以合法 用户的身份进行非法操作,如转账交易、发表评论等,如图 8.4 所示。CSRF 的主要手法 是利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。其核心是利用了浏 览器 Cookie 或服务器 Session 策略,盗取用户身份。
相应地,CSRF 的防御手段主要是识别请求者身份。主要有下面几种方法。
表单 Token
CSRF 是一个伪造用户请求的操作,所以需要构造用户请求的所有参数才可以。表单 Token 通过在请求参数中增加随机数的办法来阻止攻击者获得所有请求参数:在页面表单中增加一个随机数作为 Token,每次响应页面的 Token 都不相同,从正常页面提交的请求 会包含该 Token 值,而伪造的请求无法获得该值,服务器检查请求参数中 Token 的值是否 存在并且正确以确定请求提交者是否合法。
验证码
《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】相对说来,验证码则更加简单有效,即请求提交时,需要用户输入验证码,以避免 在用户不知情的情况下被攻击者伪造请求。但是输入验证码是一个糟糕的用户体验,所 以请在必要时使用,如支付交易等关键页面。
Referer check
HTTP 请求头的 Referer 域中记录着请求来源,可通过检查请求来源,验证其是否合 法。很多网站使用这个功能实现图片防盗链(如果图片访问的页面来源不是来自自己网 站的网页就拒绝)o
评论