浅谈常用的几种web攻击方式以及解决办法

2,028 阅读8分钟

身在互联网的时代,web在给我们带来便利的同时,有些人也在盯着这些便利,因此出现了攻击网站的现象。所以我们在开发的时候,要注意这些容易被攻击的地方,以及做好防御的措施,下面将介绍一些这些常见的攻击手段以及解决办法。

1.XSS攻击

XSS攻击的全称是跨站脚本攻击(Cross Site Scripting),为不跟层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,它是Web应用程序中最常见到的攻击手段之一。跨站脚本攻击指的是攻击者在网页中嵌入恶意脚本程序,当用户打幵该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie、用户名密码,下载执行病毒木马程序,甚至是获取客户端admin权限等。

XSS的原理

假设页面上有个表单,表单名称为nick,用来向服务端提交网站用户的昵称信息:

<input type= "text" name= "nick" value= "xiaomaon>

表单nick的内容来自用户的输入,当用户输入的不是一个正常的昵称字符串,而是下面:

<script>alert("我是小怪,我在做XSS漏洞测试,我怀疑你们的网站有XSS攻击安全漏洞")</script><!-

时,由于某种原因,如nick服务端校验不通过,服务端重定向回这个页面,并且带上之前用户输入的nick参数,此时页面则变成下面的内容:

<input type="text" name="nick" value=""/><script>alert ("我是小怪,我在做XSS漏洞测试,我怀疑你们的网站有XSS攻击安全漏洞") </script><!-/>

在输入框input的后面带上了一段脚本程序,当然,这段脚本程序只是弹出一个消息“我是小怪,我在做XSS漏洞测试,我怀疑你们的网站有XSS攻击安全漏洞”,攻击的威力取决于用户输入了什么样的脚本, 只要稍微修改,便可使攻击极具危害性。

XSS防范

XSS之所以会发生,是因为用户输入的数据变成了代码。因此,我们需要对用户输入的数据进行HTML转义处理,将其中的“尖括号”、“单引号”、“引号”之类的特殊字符进行转义编码:

如今很多开源的幵发框架本身默认就提供HTML代码转义的功能,如流行的jstl、Struts等,不需要开发人员再进行过多的开发。使用jstl标签进行HTML转义,将变量输出,代码如下:

<c:out value= "${nick}" escapeXml="true" </c:out>

只需要将escapeXml设置为true,jstl就会将变量中的HTML代码进行转义输出。

2.CSRF攻击

CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

CSRF攻击原理

CSRF攻击原理比较简单,如图1所示。其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。

CSRF漏洞防御

CSRF漏洞防御主要可以从三个层面进行,即服务端的防御、用户端的防御和安全设备的防御。

1.将cookie设置为HttpOnly

response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

2.在请求地址中添加token并验证

3.验证HTTP头中的Referer字段

3.SQL注入

所谓SQL注入,就是通过把SQL命令伪装成正常的HTTP请求参数,传递到服务端,欺骗服务器最终执行恶意的SQL命令,达到入侵目的。攻击者可以利用SQL注入漏洞,查询非授权信息,修改数据库服务器的数据,改变表结构,甚至是获取服务器root权限。

攻击方式

使用 SQL数据库的密码系统,可能运行这样的查询:

SELECT * FROM users WHERE 'username' = '$USER' AND 'password'='$PASS';

\$USER和$PASS 会用用户提供的用户名和密码来代替。那么如果用户输入‘bob’和‘1234’,那么结果的查询是:

SELECT * FROM users WHERE 'username' = 'bob' AND 'password' = '1234';

而来自数据库的返回值会是所有用 bob 作为用户名且用 1234 作为密码的数据元组。如果黑客输入 admin 和 <<’hi’ 或 1=1>>–,那么查询是:

SELECT * FROM users WHERE 'username' = 'admin' and `password` = 'hi' OR 1=1--'

注意用户输入的引号如何与原始查询中的第三个引号匹配。数据库现在会返回用户名为 admin 的所有元组,并且会取消对密码的检查,因为 ‘password’ = ‘hi’ OR 1=1 命令数据库寻找密码是 hi 的元组或 1=1 的元组,而由于 1 总是 1,所以每行都是候选。– 是 SQL 注释标志,取消查询中原始的其他引号,并且还将取消任何额外的检查,因此如果有额外的凭证(也就是,keyfob 或 captcha)也会被忽略。现在黑客可以以管理员的身份进入系统并且不用给出合法的密码。通过利用越来越复杂的查询,黑客可以变更、添加,或查询数据。对于数据库,这令黑客具有同应用程序相同的特权。

常见的SQL注入攻击的防范措施

a.使用预编译语句

预编译语句使用参数占位符来替代需要动态传入的参数,这样攻击者无法改变SQL语句的结构,SQL语句的语义不会发生改变,即使用户传入类似于’ or ‘1’=’1这样的字符串,数据库也会将其作为普通的字符串来处理。预编译SQL语句中的特殊字符会被转义。

b.使用ORM框架

常见的ORM框架,如MYBATIS、HIBERNATE等,都支持对相应的关键字或者特殊符号进行转义。 通过#符号配置的变量,MYBATIS能够对输入变量的一些关键字进行转义,防止SQL注入攻击。

特别注意: MYBATIS将#{ }解释为参数标记,将${ }解释为字符串替换。知道参数标记和字符串替换的这个区别很重要,因为参数标记不可以用在SQL语句的某些地方。例如,您不能使用参数标记来指定表名。

代码示例如下:

Map<String, Object> parms = new HashMap<String, Object>();
parms.put("table", "foo");
parms.put("criteria", 37);
List<Object> rows = mapper.generalSelect(parms);
<select id="generalSelect" parameterType="map">
  select * from ${table} where col1 = #{criteria}
</select>

MYBATIS将生成如下的预编译语句:

select * from foo where col1 = ?

重要提示: ${…} (字符串替换)的使用会带来SQL注入攻击的风险。 另外,字符串替换对于像日期一类的复杂类型会有问题。基于这些原因,我们建议尽可能地使用#{…}(参数标记)格式。

c.避免将明文密码存放到数据库

对存储的密码进行单向Hash,如使用MD5对密码进行摘要,而非直接存储明文密码,这样的好处就是万一用户信息泄露,即圈内所说的被“拖库”,黑客无法直接获取用户密码。 但是,MD5目前也变得不那么安全了。近几年开始流行一种使用彩虹表的破解办法,能够根据用户密码的Hash码,比较快速地逆向得出密码的原文(或者是碰撞串)。 哈希加盐法(Hash+Salt)能够在一定程度上解决这个问题。所谓加盐就是在生成Hash时给予一个扰动,使Hash值与标准的Hash结果不同。

d.处理好相应的异常

后台的系统异常很可能包含了一些如服务器版本、数据库版本、编程语言等信息,甚至是数据库连接的地址与用户名密码,攻击者可以按图索骥,找到对应版本的服务器漏洞或者数据库漏洞进行攻击。因此,必须要处理好后台异常,重定向到相应的错误处理界面,而不是任由其直接输出到页面上。

4.DDos攻击

分布式拒绝服务(DDoS)攻击是一种恶意企图,通过大量互联网流量压倒目标或其周围的基础架构来破坏目标服务器,服务或网络的正常流量。DDoS攻击通过利用多个受损计算机系统作为攻击流量来源来实现有效性。

攻击方式:

a.SYN Flood攻击

即利用tcp协议原理,伪造受害者的ip地址,一直保持与服务器的连接,导致受害者连接服务器的时候拒绝服务。

b.DNS Query Flood:

DNS Query Flood实际上是UDP Flood攻击的一种变形,由于DNS服务在互联网中不可替代的作用,一旦DNS服务器瘫痪,影响甚大。DNS Query Flood攻击采用的方法是向被攻击的服务器发送海量的域名解析请求,通常,请求解析的域名是随机生成,大部分根本就不存在,并且通过伪造端口和客户端IP,防止查询请求被ACL过滤。被攻击的DNS 服务器在接收到域名解析请求后,首先会在服务器上查找是否有对应的缓存,由于域名是随机生成的,几乎不可能有相应的缓存信息,当没有缓存,并且该域名无法直接由该DNS服务器进行解析的时候, DNS服务器会向其上层DNS服务器递归查询域名信息,直到全球互联网的13台根DNS服务器。大量不存在的域名解析请求,给服务器带来了很大的负载,当解析请求超过一定量的时候,就会造成DNS服务器解析域名超时,这样攻击者便达成了攻击目的。

c. CC攻击:

CC(Challenge Collapsar)攻击属于DDos的一种,是基于应用层HTTP协议发起的DDos攻击,也被称为HTTP Flood。CC攻击的原理是这样的,攻击者通过控制的大量“肉鸡”或者利用从互联网上搜寻的大量匿名的HTTP代理,模拟正常用户给网站发起请求直到该网站拒绝服务为止。大部分网站会通过CDN以及分布式缓存来加快服务端响应,提升网站的吞吐量,而这些精心构造的HTTP请求往往有意避开这些缓存,需要进行多次DB查询操作或者是一次请求返回大量的数据,加速系统资源消耗,从而拖垮后端的业务处理系统,甚至连相关存储以及日志收集系统也无法幸免。网上也有大量的免费IP网站,攻击者可以大量的在网上收集 积累。

d.Ping Flood攻击

即利用ping命令不停的发送的数据包到服务器。

e.其他攻击手段

解决方案:

设置路由器与交换机的安全配置,即设置防火墙。

5.文件上传攻击

在上网的过程中,我们经常会将一些如图片、压缩包之类的文件上传到远端服务器进行保存,文件上传攻击指的是恶意攻击者利用一些站点没有对文件的类型做很好的校验这样的漏洞,上传了可执行的文件或者脚本,并且通过脚本获得服务器上相应的权利,或者是通过诱导外部用户访问或者下载上传的病毒或者木马文件,达到攻击目的。

为了防范用户上传恶意的可执行文件和脚本,以及将文件上传服务器当做免费的文件存储服务器使用,需要对上传的文件类型进行白名单(非黑名单,这点非常重要)校验,并且限制上传文件的大小,上传的文件,需要进行重新命名,使攻击者无法猜测到上传文件的访问路径。

对于上传的文件来说,不能简单的通过后缀名称来判断文件的类型,因为恶意攻击可以将可执行文件的后缀名称改成图片或者其他的后缀类型,诱导用户执行。因此,判断文件类型需要使用更安全的方式。

很多类型的文件,起始的几个字节内容是固定的,因此,根据这几个字节的内容,就可以确定文件类型,这几个字节也被称为魔数(magic number)。

对于图片类型的文件,可以在上传后,对图片进行相应的缩放,破坏恶意用户上传的二进制可执行文件的结构,来避免恶意代码的执行。

imagemagick是一套功能强大、稳定并且开源的针对图片处理的开发工具包,能够处理多种格式的图片文件,可以利用imagemagick来对图片进行缩放处理。

注意:该文章参照以下资料

常见的web攻击手段

WEB网站常见受攻击方式及解决办法

常见的web攻击有哪些

浅谈常用的几种web攻击方式

XSS攻击及防御

CSRF攻击与防御