我们知道多年前微博收到了XSS攻击,用于自动关注了一个病毒用户,然后病毒用户自动发布病毒微博,大量的人点击后,再度扩散,导致曾经很多重要的网站都遭受了攻击,致使成百上千万的用户数据遭泄露。
直到现在有时候大家还会听到某某网站、某某APP用户数据泄露的问题。所以系统安全问题一直是一个非常重要的系统架构设计的话题。
你的系统如何保证安全性?如何避免何可攻击导致系统故障?如何避免系统的核心数据遭到泄露?这是一个非常重要的事情。
现在更多的一个趋势,是安全这块交给专业的公司和团队去做,我们购买他们的服务,但是我们要了解常见的网络攻击手段,知道如何使用一些云公司的安全产品来保护我们的系统,同时我们自己的系统有时候也可能要做一些简单的防御措施。
常见的网络攻击手段包括了:XSS(跨站点脚本攻击)、SQL注入、CSRF(跨站点请求伪造)、错误回显、HTML注释、文件上传、路径遍历,等等,每一种攻击手段都有办法可以避免,所以我们最近就是学习一下系统安全性的问题和常见防御手段。
目录
1、XSS网络攻击
1.1 一般黑客常用的XSS网络攻击的原理是什么
XSS全称是Cross Site Script,就是跨站点脚本攻击,意思就是说黑客恶意篡改你的网页前端代码,在里面注入了他自己的html+javascript脚本和代码,然后当你访问那个网站网页的时候,黑客注入的恶意脚本就会运行了,恶意脚本运行期间会控制你的浏览器,这就很恐怖了,比如脚本可以让你关注某个用户ID,然后控制你自动发布带有病毒的微博。或者你的浏览器存储了一些cookie和你的密码,恶意脚本会获取cookie伪造你用户登录的session状态,以你的名义做一些事情。
常见的XSS攻击有两种方式:
(1)反射攻击
他主要是通过展示一个图片、动画或者比较有诱惑性的视频,想办法让你点击这个URL连接,在这个URL链接里嵌入自己的恶意脚本,你点击之后就会被攻击。
(2)持久型攻击
意思就是比如一些论坛、社交网站之类的系统,此时黑客可以发布一些帖子或者评论,在帖子或者评论中写一段恶意脚本,这些内容会被存储到网站数据库。当别的用户在社交网站里浏览了黑客的评论,这个评论内容就会返回到浏览器中去,取执行这段恶意代码。
1.2 如何防止XSS攻击
- 注意包含恶意URL链接的图片、动图、flash动画尽量不要点;尽量访问正规的网站。
- 系统添加消毒机制,对于评论之类的内容,存入数据库前要进行消毒,就是进行一些转义,比如将html标签,js之类的标签用>进行转义,让恶意代码失效。这样的话就算别的用户看到也不会在浏览器中执行了。
- HttpOnly方式,就是说你的浏览器存放cookie的时候,给它设置一个HttpOnly属性,这样的话,在浏览器里运行的js脚本是被禁止访问这些HttpOnly cookie的,黑客就无法窃取你浏览器中的cookie 了。
2、SQL注入
2.1 攻击背后的原理是什么
在系统执行SQL语句得时候,也可能存在漏洞,导致黑客把一些恶意的SQL语句注入到你的系统让你的数据库来执行。
比如有这样一个URL请求:http://www.xxx.com/goods?goodsSkuNo=xxx
对应的sql语句:select * from eshop_goods_sku where goods_sku_no=’xxx’
被黑客拼接成了如下的样子:http://www.xxx.com/goods?goodsSkuNo=xxx’;drop table eshop_goods_sku;
执行的SQl语句就变成了:select * from eshop_goods_sku where goods_sku_no=’xxx’; http://www.xxx.com/goods?goodsSkuNo=xxx’;drop table eshop_goods_sku;
这就造成了删库跑路的效果了。
2.2 获取数据库表结构的方式有哪几种
其实SQL注入不是那么容易的,需要知道数据库表结构才行。一般获取数据库表结构的方式有以下几种:
1、如果你是用的是开源软件,比如开源的博客系统、论坛系统、或者别的系统,那么人家自然就知道你的表结构了,这种情况是比较少见的。
2、错误回显,不知道大家有没有这种经历,就是你将系统跑在web服务器里,然后程序报错了,结果在浏览器页面上直接显示出来异常的堆栈信息,包括错误的SQL语句,通过这个,黑客就直接知道你的表结构了。然后通过postman进行请求,拼接一段sql,就造成了SQL注入。
3、根据你请求参数的名称,大致推测表结构,不太现实。
2.3、如何防止SQL注入
1、要防止SQL注入,其一就是不要让别人知道你的数据表结构,关闭web服务器的错误回显,在controller层面用try catch捕获异常,直接给浏览器返回400或者500之类的就可以了。
2、在JDBC层面使用预编译的手段,mybatis,hibernate就支持预编译,比如我们传入了参数,mybatis会在预编译阶段使用占位符占用参数位置:
select * from xxx where id=?
真正执行的时候数据库不会将参数的内容视为SQL执行的一部分,而是作为一个字段的属性值来处理:
select * from xxx where id=’xxx’
3、CSRF攻击
3.1 背后的原理是什么
Cross Site Request Forgery,跨站点请求伪造,就是黑客想办法伪造你这个用户去发送请求到某个系统上去,然后进行查询,交易类的操作。伪装成你,也有很多方法,比如利用XSS搞一个恶意脚本让你执行,然后盗取你浏览器的cookie,利用cookie伪装成你登录的请求,在远程黑客服务器去执行一些请求。
3.2 如何防止CSRF攻击
1、防止cookie被窃取:将网站的cookie设置为HttpOnly属性,禁止别人用js脚本窃取。
2、随机token:每次返回一个页面给你的时候,都生成一个随机token附加在页面的隐藏元素里,同时在redis中存一份,然后页面发送请求的时候附加随机token,通过验证才能执行请求,你要是自己用postman构造请求就不知道随机token是什么了。
3、验证码:页面提交可以做一个验证码,比如拖动拼图,必须验证通过了才能执行你的请求,避免黑客直接伪造请求发送过来,在交易的时候常用。
4、Referer请求头:http请求里面有一个 Referer请求头,带有这个请求的来源,你可以验证一下这个请求是不是从自己的页面里面来的,如果是则执行,不是则不执行。
4、用户上传文件遭受的攻击
4.1 攻击背后的原理是什么
很多时候如果我们的网站允许别人上传文件,那么文件可能是可执行的脚本,可能是病毒或者木马文件,如果是脚本的话,可能会在服务器执行,搞很多破坏,比如黑客黑掉你的服务器,勒索你给他比特币之类的。
4.2、如何防止文件上传中的黑客攻击
对于文件上传这块,核心的就是要进行白名单校验,限制上传文件的类型,只能是我们指定的,而且要限制文件的大小,还要对文件重命名,限制文件类型不能简单的根据后缀来判断,可能后缀被篡改了,要根据文件二进制数据的开头几个字节代表的magic number(魔数)来判断文件的类型。比如: FFD8FF代表JEPG格式,89504E47代表PNG。
比如说你的网站要求用户只能上传word类型,png类型,此时你就限制仅仅这几种文件是可以上传的,其他的类型的文件都不让上传。
而且最好对文件进行一定的压缩,这样可以破坏原来的文件结构,避免文件在服务器执行,利用imagemagick这种开源包,可以很方便进行文件缩放。
5、DDoS攻击
5.1 背后攻击的原理是什么
DDoS,distributed denial of service,分布式拒绝服务攻击,最可怕的黑客攻击,可以把你的网站、APP、系统给搞瘫痪了。
对于Dos攻击,注意是Dos攻击不是DDos攻击,就是说黑客知道你的服务器地址了,然后你的系统假设每秒就抗下1000请求,黑客就以每秒1000请求访问你,你的服务器线程资源全部打满,正常用户根本无法发送请求,你的网站就宕机了,甚至他以每秒1万请求攻击你的服务器呢,那就的系统机器就挂了。
DoS攻击是一对一的,就是黑客搞一台高性能服务器,拼命发送请求给你的一台服务器,但是如果你的服务器配置超高,每秒抗1万请求,结果黑客的机器每秒才5000请求,那么就没用了。
DDoS的意思就是黑客控制大量的机器,比如普通人的电脑,或者是一些公司的服务器,被他的一些木马植入给控制了,就是所谓的“肉鸡”,然后黑客下达指令,让所有肉鸡一起发送请求给攻击目标,直接搞瘫你的服务器。
5.2 DDos攻击的方式有哪些
(1)基于SYN Flood模式的DDoS攻击
SYN Flood模式的DDoS攻击是通过TCP三次握手的漏洞来进行攻击的。
TCP握手的流程:
- 客户端发送一个SYN请求,指明客户端的端口号以及TCP连接的初始序列号。
- 服务器收到SYN后,返回一个SYN+ACK,表示请求被接收,TCP序列号加1.
- 客户端收到服务器的SYN+ACK后,返回一个ACK给服务器,TCP序列号加1,连接建立完毕,接着可以通信了。
如果服务器没有收到第三步的ACK,会重试步骤二返回SYN+ACK给客户端,每隔30s重试一次,重试3~5次,遍历等待列表,再次重试发送SYN+ACK。
服务器只要返回SYN+ACK给客户端,就会为客户端预留一部分资源,重试期间都保留,等待更客户端建立连接。所以太多的客户端来建立连接,就会导致服务端资源耗尽,就会导致无法建立新的TCP连接了。
所以黑客就会根据这个漏洞,伪装大量的不同的ip地址去发送SYN请求一台服务器建立TCP连接,每次服务器返回SYN+ACK,黑客就是不会响应返回ACK,导致服务器可能为了黑客建立了大量的半连接放在等待列表里,占用大量资源,还得不停的去重试,一旦服务器资源耗尽,那么征程的请求过来,是无法建立TCP连接的,也就无法发送http请求。
(2)基于DNS Query Flood和HTTP Flood的DDoS攻击
DNS Query Flood攻击,就是通过伪造大量的域名解析请求发送给DNS服务器,然后DNS服务器必然没有,接着就会去找上级DNS服务器,一直到根域名服务器。这么做必然会导致DNS服务器的资源耗尽,其他正常用户浏览网页也需要解析域名,此时就没法访问DNS服务器了。
HTTP Flood就是直接在互联网上找大量的HTTP代理,说白了,其实有很多公司提供HTTP代理服务,你可以控制那些HTTP代理服务器去给目标服务器发送大量的HTTP请求,导致目标服务器挂掉。
5.2 如何防止DDoS攻击
防止DDos攻击其实挺难的,这其实是非常专业的一种攻击手段,通常我们可以采购云厂商的安全服务,比如DDoS高防IP,可以把攻击流量都导入到云厂商的高防IP的服务器上去,他们有专业的技术方案和算法来防御。