Java开发必知的web网络安全常识

转载整理自:
https://blog.csdn.net/lonelymanontheway/article/details/84929585

Java开发必知的web网络安全常识

攻击

SQL注入

定义

攻击者在HTTP请求中注入恶意的SQL代码,服务器使用参数构建数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。

实例

如String query = “SELECT * FROM accounts WHERE custID=’” + request.getParameter(“id”) + “’”; 如果参数id中是 ;delete from user; 或者 or 1=1 这样,就会返回所有数据。

防范
  • 不要拼接SQL字符串
  • 使用预编译的PrepareStatement
  • 服务器端校验 (防止攻击者绕过web端请求)
  • 过滤SQL中需要的参数中的特殊字符,比如单引号、双引号

XSS攻击

定义

XSS,跨站脚本攻击(cross site scripting,百科上说它和那个样式的CSS引起歧义,所以叫XSS?)。将一段Html和JavaScript代码注入到用户浏览的网页上。XSS 可以大概分为三类, DomXSS,反射型XSS和存储型XSS。

实例

假设页面上有一个表单

<input type="text" name="name"value="awesome"/>

如果,用户输入的不是一个正常的字符串,而是
"/><script>alert(“111”)</script><!-
此时,页面变成下面的内容,在输入框input的后面带上了一段脚本代码。

<input type="text"name="name"value="awesome"/>
<script>alert("haha")</script><!-"/>

XSS攻击的威力取决于用户输入的脚本。

危害

攻击者提交恶意的JS代码的评论信息或者反馈信息(这些信息,正常客户端没有做xss校验,会存在客户端注入问题),所有访问者访问该内容时,都会执行这段恶意的JS代码。

防范

前端,服务端同时需要字符串输入的长度限制。
前端,服务端同时需要对HTML转义处理。将其中的"<",">"等特殊字符进行转义编码。


CSRF攻击

定义

Cross-site request forgery,亦XSRF,跨站请求伪造,one click attack/session riding,指攻击者通过跨站请求,以合法的用户身份进行非法操作。攻击者盗用你的身份,以你的名义向第三方网站发送恶意请求。CRSF能做的事情包括利用你的身份发邮件,发短信,进行交易转账,甚至盗取账号信息。容易造成个人隐私泄露以及财产安全。

防范
  • 使用安全框架,例如Apache shiro,Spring Security。
  • token机制。在HTTP请求中进行token验证,如果请求中没有token或者token内容不正确,则认为CSRF攻击而拒绝该请求。
  • 验证码。通常情况下,验证码能够很好的遏制CSRF攻击,但是很多情况下,出于用户体验考虑,验证码只能作为一种辅助手段,而不是最主要的解决方案。
  • referer识别。在HTTP Header中有一个字段Referer,记录HTTP请求的来源地址。如果Referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。但服务器并非都能取到Referer。很多用户出于隐私保护的考虑,限制Referer的发送。在某些情况下,浏览器也不会发送Referer,例如HTTPS跳转到HTTP。

传输劫持

不只免费WiFi不安全。收费的、有密码的或是某些电信运营商都不安全。
一般来说劫持有两种:DNS,比如114;有些路由器有CSRF漏洞,可以通过CSRF来设置你的DNS地址。一但你的DNS被修改后,你访问任何网站就悲剧。还有臭名昭著的DNS污染:百度百科

还有一种就是路由器劫持。如免费WiFi;当然如果是运营商,就基本什么都能干了。 这一类有很成熟的软件来劫持。 一般安全测试用的代理软件,或前端用的Fiddler就是这一类软件。 当你是HTTP访问的时候你就什么都让别人知道了。 当然并不是说HTTPS就一定安全。


文件上传漏洞

用户上传一个可执行的脚本文件,并通过此脚本文件获得执行服务端命令的能力。

防范
  • 文件上传的目录设置为不可执行。
  • 判断文件类型。在判断文件类型的时候,可以结合使用MIME Type,后缀检查等方式。以及限制上传文件的大小。
  • 对上传的文件类型进行白名单校验,只允许上传可靠类型。
  • 上传的文件需要进行重新命名,使攻击者无法猜想上传文件的访问路径,将极大地增加攻击成本,同时向shell.php.rar.ara这种文件,因为重命名而无法成功实施攻击。
  • 单独设置文件服务器的域名。

访问控制

一般来说,“基于URL的访问控制”是最常见的。

  • 垂直权限管理
    访问控制实际上是建立用户与权限之间的对应关系,即“基于角色的访问控制”,RBAC。不同角色的权限有高低之分。高权限角色访问低权限角色的资源往往是被允许的,而低权限角色访问高权限的资源往往被禁止的。在配置权限时,应当使用“最小权限原则”,并使用“默认拒绝”的策略,只对有需要的主体单独配置”允许”的策略,这在很多时候能够避免发生“越权访问”。
    Spring Security, Apache Shiro都可以建立垂直权限管理。

  • 水平权限管理
    水平权限问题在同一个角色上,系统只验证了访问数据的角色,没有对角色内的用户做细分,由于水平权限管理是系统缺乏一个数据级的访问控制所造成的,因此水平权限管理又可以称之为“基于数据的访问控制”。
    举个理解,比如我们之前的一个助手产品,客户端用户删除评论功能,如果没有做水平权限管理,即设置只有本人才可以删除自己的评论,那么用户通过修改评论id就可以删除别人的评论这个就存在危险的越权操作。
    这个层面,基本需要我们业务层面去处理,但是这个也是最为经常遗落的安全点。


DDOS攻击

定义

分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。
DDOS 攻击利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务(目的)。
DDoS 攻击通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的。 具体有几种形式:

  • 通过使网络过载来干扰甚至阻断正常的网络通讯;
  • 通过向服务器提交大量请求,使服务器超负荷;
  • 阻断某一用户访问服务器;
  • 阻断某服务与特定系统或个人的通讯。
分类

按照发起的方式,DDoS可以简单分为三类:

  • 以力取胜,海量数据包从互联网的各个角落蜂拥而来,堵塞IDC入口,让各种强大的硬件防御系统、快速高效的应急流程无用武之地。这种类型的攻击典型代表是ICMP Flood和UDP Flood,现在已不常见。
  • 以巧取胜,灵动而难以察觉,每隔几分钟发一个包甚至只需要一个包,就可以让豪华配置的服务器不再响应。这类攻击主要是利用协议或者软件的漏洞发起,例如Slowloris攻击、Hash冲突攻击等,需要特定环境机缘巧合下才能出现。
  • 上述两种的混合,轻灵浑厚兼而有之,既利用协议、系统的缺陷,又具备海量的流量,例如SYN Flood攻击、DNS Query Flood攻击,是当前的主流攻击方式。
SYN攻击

属于 DDOS 攻击中的一种具体表现形式。
服务器发送 SYN-ACK 之后,收到客户端的 ACK 之前的 TCP 连接称为半连接(half-open connect)。此时服务器处于 SYN_RCVD 状态。当收到 ACK 后,服务器才能转入 ESTABLISHED 状态。
SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 SYN 包,服务器回复确认包,并等待客户的确认。
由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。

SYN Flood攻击利用TCP三次握手的缺陷,能够以较小代价使目标服务器无法响应,且难以追查。

标准的TCP三次握手过程如下:

  • 客户端发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;
  • 服务器在收到客户端的SYN报文后,将返回一个SYN+ACK(即确认Acknowledgement)的报文,表示客户端的请求被接受,同时TCP初始序号自动加1;
  • 客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加1。

经过这三步,TCP连接就建立完成。TCP协议为了实现可靠传输,在三次握手的过程中设置一些异常处理机制。第三步中如果服务器没有收到客户端的最终ACK确认报文,会一直处于SYN_RECV状态,将客户端IP加入等待列表,并重发第二步的SYN+ACK报文。重发一般进行3-5次,大约间隔30秒左右轮询一次等待列表重试所有客户端。另一方面,服务器在自己发出SYN+ACK报文后,会预分配资源为即将建立的TCP连接储存信息做准备,这个资源在等待重试期间一直保留。服务器资源有限,可以维护的SYN_RECV状态超过极限后就不再接受新的SYN报文,也就是拒绝新的TCP连接建立。

SYN Flood正是利用TCP协议的设定,达到攻击的目的。攻击者伪装大量的IP地址给服务器发送SYN报文,由于伪造的IP地址几乎不可能存在,也就几乎没有设备会给服务器返回任何应答了。因此,服务器将会维持一个庞大的等待列表,不停地重试发送SYN+ACK报文,同时占用着大量的资源无法释放。被攻击服务器的SYN_RECV队列被恶意的数据包占满,不再接受新的SYN请求,合法用户无法完成三次握手建立起TCP连接,即这个服务器被SYN Flood拒绝服务。

检测 SYN 攻击:检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击。

DNS Query Flood

打垮DNS服务能够间接打垮一家公司的全部业务,或者打垮一个地区的网络服务。UDP攻击是最容易发起海量流量的攻击手段,而且源IP随机伪造难以追查。但过滤比较容易,因为大多数IP并不提供UDP服务,直接丢弃UDP流量即可。所以现在纯粹的UDP流量攻击比较少见了,取而代之的是UDP协议承载的DNS Query Flood攻击。简单地说,越上层协议上发动的DDoS攻击越难以防御,因为协议越上层,与业务关联越大,防御系统面临的情况越复杂。
DNS Query Flood就是攻击者操纵大量傀儡机器,对目标发起海量的域名查询请求。为了防止基于ACL的过滤,必须提高数据包的随机性。常用的做法是UDP层随机伪造源IP地址、随机伪造源端口等参数。在DNS协议层,随机伪造查询ID以及待解析域名。随机伪造待解析域名除了防止过滤外,还可以降低命中DNS缓存的可能性,尽可能多地消耗DNS服务器的CPU资源。

HTTP Flood

HTTP Flood是针对Web服务在第七层协议发起的攻击。其巨大危害性主要表现在三个方面:发起方便、过滤困难、影响深远。
SYN Flood和DNS Query Flood都需要攻击者以root权限控制大批量的傀儡机。收集大量root权限的傀儡机很花费时间和精力,而且在攻击过程中傀儡机会由于流量异常被管理员发现,攻击者的资源快速损耗而补充缓慢,导致攻击强度明显降低而且不可长期持续。HTTP Flood攻击则不同,攻击者并不需要控制大批的傀儡机,取而代之的是通过端口扫描程序在互联网上寻找匿名的HTTP代理或者SOCKS代理,攻击者通过匿名代理对攻击目标发起HTTP请求。匿名代理是一种比较丰富的资源,花几天时间获取代理并不是难事,因此攻击容易发起而且可以长期高强度的持续。
HTTP Flood攻击在HTTP层发起,极力模仿正常用户的网页请求行为,与网站业务紧密相关,安全厂商很难提供一套通用的且不影响用户体验的方案。在一个地方工作得很好的规则,换一个场景可能带来大量的误杀。
HTTP Flood攻击会引起严重的连锁反应,不仅仅是直接导致被攻击的Web前端响应缓慢,还间接攻击到后端的Java等业务层逻辑以及更后端的数据库服务,增大它们的压力,甚至对日志存储服务器都带来影响。

慢速连接攻击

HTTP协议规定,HTTP Request以\r\n\r\n结尾表示客户端发送结束,服务端开始处理。如果永远不发送\r\n\r\n会如何?Slowloris就是利用这一点来做DDoS攻击的。攻击者在HTTP请求头中将Connection设置为Keep-Alive,要求Web Server保持TCP连接不要断开,随后缓慢地每隔几分钟发送一个key-value格式的数据到服务端,如a:b\r\n,导致服务端认为HTTP头部没有接收完成而一直等待。如果攻击者使用多线程或者傀儡机来做同样的操作,服务器的Web容器很快就被攻击者占满TCP连接而不再接受新的请求。

防范
  • 缩短超时(SYN Timeout)时间
  • 增加最大半连接数
  • 过滤网关防护

身份token窃取

通过 document.cookie 得到用户的cookie,而在web程序中都是通过cookie验证用户身份,也就是说cookie泄露就可能导致账号直接被黑客访问。


账密泄漏

用户喜欢在不同网站使用同一密码,有时候密码很简单,所以账号号被盗就很常见。


暴力破解

黑客使用同一个账号试不同密码, 或同一个密码试不同账号, 通过社工库,即上面提到的那个账号密码泄露,可以破解很多账号。 通过这些账号,特别是邮箱,能够得到很多很多的信息。


HTTP与HTTPS的区别

传送门:
https://blog.csdn.net/weixin_40955398/article/details/123362317


跨域问题以及解决方案

传送门:
https://blog.csdn.net/weixin_40955398/article/details/123365196

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张矜持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值