WEB页面常见安全问题

1、DOS、DDOS攻击

DOS(Denial of Service),拒绝服务,造成远程服务器拒绝服务的行为,叫做DOS攻击。

DOS攻击的目的:使计算机或网络无法提供正常的服务。

常见的DOS攻击:计算机网络带宽攻击、连通性攻击。

 

DOS攻击的栗子:

    首先说一下TCP握手:Client发送SYN连接请求报文,Server接受连接,回复ACK确认连接报文和SYN报文,并为这次连接分配资源。Client接收到SYN和ACK后,相对于SYN向Server回复ACK报文,并分配资源。这样TCP连接就建立起来。

 

    前两次握手,是为了保证Server能获得Client的信息并能做出正确应答;

    后两次握手,是为了保证Client能接收到Server的信息并能做出正确应答。

 

   当Client向服务器发送一个SYN报文后,Server会向Client发送SYN+ACK,然后等待Client回复ACK确认,如果未收到Client的确认包,就会重发请求包一直到连接超时,才将此条目从未连接队列删除这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);

扫描二维码关注公众号,回复: 4937307 查看本文章

 

    因此,也就出现了一种叫做SYN  FLOOD的攻击手段:

   

    SYN FLOOD(SYN洪水攻击)攻击者配合IP欺骗,SYN攻击会达到很好的效果。通常攻击者在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN 请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源,即数以万计的半连接,将会对服务器的CPU和内存造成极大的消耗。若服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃。实际上,就算服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求,导致用户的正常请求失去响应。 

   

DOS攻击的防范:

  • 缩短SYN Timeout时间:由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃该连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。
  • 限制同时打开的SYN半连接数目,关闭不必要的服务
  • 设置SYN Cookie:给每一个请求连接的IP地址分配一个Cookie。如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃

 

DDOS:分布式拒绝服务,是DOS攻击的一种方法。

DDOS攻击:借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDOS攻击,从而成倍提高DOS攻击的威力,阻止合法用户对正常网络资源的访问。

DDOS攻击的策略侧重于通过很多僵尸主机,向受害主机发送大量看似合法的网络包,从而造成网络阻塞或服务器资源耗尽从而导致拒绝服务。

 

DDOS攻击的防范:

  • 反欺骗:对数据包地址以及端口的正确性进行验证,同时进行反向探测
  • 协议栈行为模式分析:每个数据包类型需要符合RFC规定,这就好像每个数据包都要有完整规范的着装,只要不符合规范,就自动识别并将其过滤掉。
  • 特定应用防护:非法流量总是有一些特定特征的,这就好比即便你混进了顾客群中,但你的行为还是会暴露出你的动机,比如老重复问店员同一个问题,老做同样的动作,这样你仍然还是会被发现的。
  • 带宽控制:真实的访问数据过大时,可以限制其最大输出的流量,以减少下游网络系统的压力。 

 

2、CSRF攻击

CSRF:Cross  Site  Requset  Forgery,跨站请求伪造

CSRF攻击的原理步骤:

  • 受害者用户正常登录网站A,输入个人信息,在本地保存cookie
  • 攻击者构建一条恶意链接
  • 受害者打开了攻击者构建的恶意链接,浏览器发出该恶意链接的请求,请求时发送本地保存的cookie到网址A
  • A网站收到cookie,以为此请求时受害者发出的,导致受害者身份被盗用,完成恶意攻击的目的。

CSRF攻击防范:

  • 验证码应用程序和用户进行交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终请求。在通常情况下,验证码够很好地遏制CSRF攻击。但增加验证码降低了用户的体验,网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段,在关键业务点设置验证码。
  • Referer Check:HTTP Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。可以通过检查请求的来源来防御CSRF攻击。正常请求的referer具有一定规律,如在提交表单的referer必定是在该页面发起的请求。所以通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击。但在某些情况下如从https跳转到http,浏览器处于安全考虑,不会发送referer,服务器就无法进行check了。若与该网站同域的其他网站有XSS漏洞,那么攻击者可以在其他网站注入恶意脚本,受害者进入了此类同域的网址,也会遭受攻击。出于以上原因,无法完全依赖Referer Check作为防御CSRF的主要手段。但是可以通过Referer Check来监控CSRF攻击的发生。
  • Anti CSRF Token:目前比较完善的解决方案是加入Anti-CSRF-Token,即发送请求时在HTTP 请求中以参数的形式加入一个随机产生的token,并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个token值,会进行校验该请求当中的token和cookie当中的token值是否都存在且相等,才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。这种方法相比Referer检查要安全很多,token可以在用户登陆后产生并放于session或cookie中,然后在每次请求时服务器把token从session或cookie中拿出,与本次请求中的token 进行比对。

 

3、XSS攻击

XSS:Cross  Site  Scripting , 跨站脚本攻击

XSS攻击原理:恶意攻击者往web页面注入恶意Script代码,当用户浏览这些网页时,就会执行其中的恶意代码,可对用户进行盗取cookie信息、会话劫持等各种攻击。

XSS攻击的类型:

  • 本地利用漏洞:

这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:

Alice给Bob发送一个恶意构造了Web的URL

Bob点击并查看了这个URL。

恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。

具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。

Alice恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。

  • 反射式漏洞:

这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。其攻击过程如下:

Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。

Charly发现Bob的站点包含反射性的XSS漏洞。

Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。

Alice在登录到Bob的站点后,浏览Charly提供的URL。

嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。

  • 存储式漏洞:

该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:

Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。

Charly注意到Bob的站点具有类型C的XSS漏洞。

Charly发布一个热点信息,吸引其它用户纷纷阅读。

Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。

类型①直接威胁用户个体,而类型和类型所威胁的对象都是企业级Web应用。

XSS防御:

  • 输入过滤:永远不要相信用户的输入,对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式,比如日期格式,Email格式,电话号码格式等等。这样可以初步对XSS漏洞进行防御。上面的措施只在web端做了限制,攻击者通抓包工具如Fiddler还是可以绕过前端输入的限制,修改请求注入攻击脚本。因此,后台服务器需要在接收到用户输入的数据后,对特殊危险字符进行过滤或者转义处理,然后再存储到数据库中。
  • 输出编码:服务器端输出到浏览器的数据,可以使用系统的安全函数来进行编码或转义来防范XSS攻击。在PHP中,有htmlentities()和htmlspecialchars()两个函数可以满足安全要求。相应的JavaScript的编码方式可以使用JavascriptEncode。
  • 安全编码:开发需尽量避免Web客户端文档重写、重定向或其他敏感操作,同时要避免使用客户端数据,这些操作需尽量在服务器端使用动态页面来实现。
  • HttpOnly Cookie预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。
  • WAF(Web Application Firewall):Web应用防火墙,主要的功能是防范诸如网页木马、XSS以及CSRF等常见的Web漏洞攻击。由第三方公司开发,在企业环境中深受欢迎。

 

 

4、session劫持

基于session的攻击有很多种方式。大部分的手段都是首先通过捕获合法用户的session, 然后冒充该用户来访问系统。也就是说,攻击者至少必须要获取到一个有效的session标识符,用于接下来的身份验证。 

 

攻击者至少可以通过以下三种方式来获取一个有效的session标识符:

  1、预测:攻击者需要猜测出系统中使用的有效的session标识符(PHP中格式为PHPSESSID=1234),有点类似暴力破解。 php内部session的实现机制虽然不是很安全,但是关于生成session id的关节还是比较安全的,这个随机的session id往往是极其复杂的并且难于被预测出来,所以说,这种攻击方式基本上是不太可能成功的。

        2捕获(劫持):会话劫持(Session hijacking),这是一种通过获取用户Session ID后,使用该Session ID登录目标账号的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。会话劫持的第一步是取得一个合法的会话标识来伪装成合法用户,因此需要保证会话标识不被泄漏。

    攻击步骤:

1、 目标用户需要先登录站点;

2、 登录成功后,该用户会得到站点提供的一个会话标识SessionID;

3 攻击者通过某种攻击手段捕获Session ID

4、  攻击者通过捕获到的Session ID访问站点即可获得目标用户合法会话。

Session劫持防御:

1、 更改Session名称。PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。

2、 关闭透明化Session ID。透明化Session ID指当浏览器中的Http请求没有使用Cookie来存放Session ID时,Session ID则使用URL来传递。

3 设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。

4 关闭所有phpinfo类dump request信息的页面。

5 验证HTTP头部信息

     在http访问头文件:[Accept-Charset、Accept-Encoding、Accept-Language、User-Agent],浏览器一般发出的头部不会改

6 加入Token校验。同样是用于检测请求的一致性,给攻击者制造一些麻烦,使攻击者即使获取了Session ID,也无法进行破坏,能够减少对系统造成的损失。但Token需要存放在客户端,如果攻击者有办法获取到Session ID,那么也同样可以获取到Token。

 

3、固定:会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。让合法用户使用黑客预先设置的sessionID进行登录,从而是Web不再进行生成新的sessionID,从而导致黑客设置的sessionId变成了合法桥梁。

会话固定也可以看成是会话劫持的一种类型,原因是会话固定的攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。

      攻击步骤: 

1 攻击者通过某种手段重置目标用户的SessionID,然后监听用户会话状态;

2 目标用户携带攻击者设定的Session ID登录站点;

3 攻击者通过Session ID获得合法会话

 

5、点击劫持:

Click Jacking,点击劫持,是一种将恶意代码经过处理使其变成透明、不可见的iframe,并将其覆盖在一个网页上,然后诱使用户在该网页上进行点击操作。通过改变iframe的在页面的位置,可以诱使用户正好点击我们设置好的透明iframe。

防御:

1、Frame Busting :这种方式是通过写JavaScript来禁止iframe嵌套,但是可以轻易饶过。

2、设置HTTP请求头(X-Frame-Options): X-Frame-Options HTTP 响应头,可以指示浏览器是否应该加载一个iframe中的页面。网站可以通过设置X-Frame-Options阻止站点内的页面被其他页面嵌入从而防止点击劫持。

    X-Frame-Options共有三个值:

DENY任何页面都不能被嵌入到iframe或者frame中。

SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。

ALLOW-FROM URI:页面只能被指定的Uri嵌入到iframe或frame中。

猜你喜欢

转载自blog.csdn.net/qq_33120763/article/details/82831732