XSS 攻击
XSS 攻击即夸站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意 HTML 脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。
常见的 XSS 攻击类型有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的。
另一种 XSS 攻击是持久型 XSS 攻击,黑客提交含有恶意脚本的请求,保存在被攻击的 Web 站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的。
XSS 防攻击的主要方式有如下两种:
消毒
XSS 攻击者一般都是通过在请求中嵌入恶意脚本达到攻击目的,这些脚本是一般用户输入中不使用的,如果进行过滤和消毒处理,即对某些 html 危险字符转义,如”>”转义为”>”等,就可以防止大部分攻击。为了避免对不必要的内容转移错误,如”3<5”中的”<”需要进行文本匹配后再转义,如”<img src=”这样的上下文中的”<”才转义。消毒几乎是所有网站最必备的 XSS 防攻击手段。HttpOnly
浏览器禁止页面 JavaScript 访问带有 HttpOnly 属性的 Cookie。HttpOnly 并不是直接对抗 XSS 攻击的,而是防止 XSS 攻击窃取 Cookie。对于存放敏感信息的 Cookie,如用户认证信息等,可通过对该 Cookie 添加 HttpOnly 属性,避免被攻击脚本窃取。
注入攻击
注入攻击主要有两种形式,SQL 注入攻击和 OS 注入攻击。SQL 注入攻击为攻击者在 HTTP 请求中注入恶意 SQL 命令,服务器用请求构造参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库执行。
SQL 注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构信息的手段有如下几种:
开源
如果网站基于开源软件搭建,那么网站数据库结构就是公开的,攻击者可直接获得。错误回显
如果网站开启错误回显,即服务器内部 500 错误会显示到浏览器上。攻击者通过故意构造非法参数,使服务器异常信息输出到浏览器端,为攻击者猜测数据库表结构提供了便利。盲注
如果网站关闭错误回显,攻击者根据页面变化情况判断 SQL 语句的执行情况,据此猜测数据库表结构,这种攻击方式难度比较大。
防御 SQL 注入攻击首先要避免被攻击者猜测到表名等数据库表结构信息,此外还可以采用如下方式:
消毒
和防 XSS 攻击一样,请求参数消毒是一种比较简单粗暴又有效的手段。通过正则匹配,过滤请求数据中可能注入的 SQL,如drop table
、\b(?:update\b.*?\bset|delete\b\W*?\bfrom)\b
等。参数绑定
使用预编译手段,绑定参数是最好的防 SQL 注入方法。目前许多数据访问层框架,如 IBatis,Hibernate 等,都实现 SQL 预编译和参数绑定,攻击者的恶意 SQL 会被当做 SQL 的参数,而不是 SQL 命令被执行。
除了 SQL 注入,攻击者还根据具体应用,注入 OS 命令、编程语言代码等,利用程序漏洞,达到攻击目的。
CSRF 攻击
CSRF(Cross Site Request Forgery,跨站点请求伪造),攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易等。CSRF 的主要手法是利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。其核心是利用了浏览器 Cookie 或服务器 Session 策略,盗取用户身份。
CSRF 的防御手段主要是识别请求者身份。主要有下面几种方法:
表单 Token
CSRF 是一个伪造用户请求的操作,所以需要构造用户的请求的所有参数才可以。表单 Token 通过在请求参数中增加随机数的方法来阻止攻击获得所有请求参数:在页面表单中增加一个随机数作为 Token,每次响应页面的 Token 都不相同,从正常页面提交的请求会包含该 Token 值,而伪造的请求无法获得该值,服务器检查请求参数中 Token 的值是否存在并且正确以确定请求提交者是否为伪造的。验证码
验证码是一种更加简单有效的手段,即请求提交时,需要通过用户输入验证码。Referer check
HTTP 请求头的 Referer 域中记录着请求来源,可通过检查请求来源,验证其是否合法。很多网站使用这个功能实现图片防盗链(如果图片访问的页面来源不是来自自己网站的网页就拒绝)。
其他攻击和漏洞
Error Code
错误回显信息,许多 Web 服务器会默认打开异常信息输出,即服务器端未处理的异常堆栈信息会直接输出到客户端浏览器。黑客可以通过故意制造非法输入,使系统运行时出错,获得异常信息,从而寻找系统漏洞进行攻击。防御手段:通过配置 Web 服务器参数,跳转到 500 页面到专门的错误页面即可。Web 应用常用的 MVC 框架也有这个功能。HTML 注释
HTML 注释会显示在客户端浏览器。文件上传
攻击者通过上传可执行程序以获得服务器端命令执行能力。有效的手段是设置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名,使用专门的存储等手段。路径遍历
攻击者在请求的 URL 中使用相对路径,遍历系统为开放的目录和文件。防御方法主要是将 JS、CSS 等资源文件部署在独立服务器,使用独立域名,其他文件不使用静态 URL 访问,动态参数最好不包含文件路径信息。
Web 应用防火墙
ModSecurity 是一个开源的 Web 应用防火墙,探测攻击并保护 Web 程序,能够统一拦截请求,过滤恶意参数,自动消毒,添加 Token 等。既可以嵌入到 Web 应用服务器中,也可以作为一个独立的应用程序启动。
ModSecurity 采用处理逻辑与攻击规则集合分离的架构模式。处理逻辑(执行引擎)负责请求和响应的拦截过滤,规则加载执行等功能。而攻击规则集合则负责描述对具体攻击的规则定义、模式识别、防御策略等功能(可以通过文本方式进行描述)。处理逻辑比较稳定,规则集合需要不断针对漏洞进行升级,这是一种可扩展的架构设计。
网站安全漏洞扫描
网络安全漏洞扫描工具是根据内置规则,构造具有攻击性的 URL 请求,模拟黑客攻击行为,用以发现网站安全漏洞的工具。