在互联网的早期,安全只是一个事后的想法。然后,随着黑客开始利用企业松懈的安全姿态,事情逐渐开始改变。起初,电子前沿基金会等非营利组织开始推动网络用户接受HTTPS Everywhere。作为回应,认证机构开始向任何想要的网站管理员提供免费的SSL证书变化。结果,现在至少有79.6%的活跃网站使用SSL。
这仅仅是个开始。在随后的几年里,开发人员和网络应用程序管理员逐渐开始加强他们的应用程序,以防止各种形式的攻击。他们推出了更复杂的密码要求。他们开始添加双因素认证作为默认措施。他们甚至开始把面向公众的服务放在高性能的网络应用程序防火墙后面。
但是,尽管取得了所有的进展,漏洞仍然存在,这意味着Web应用程序开发人员和管理员必须了解如何渗透测试他们的系统,看看是否有任何已知的漏洞可以穿透他们的多层防御。要做到这一点,他们必须了解渗透测试过程的各个阶段,以避免留下任何安全漏洞。以下是Web应用程序渗透测试中涉及的四个主要步骤。
第1步:观察和侦查
网络应用程序渗透测试过程中的第一个重要步骤包括采取与攻击者相同的方法:了解关于目标的所有信息。首先要做的是,从谷歌等公共网站上获取有关目标网络应用的信息。使用搜索修改器,有可能收集到与该应用程序相关的子域和页面的完整列表。这为黑客的潜在攻击面提供了一个相当不错的地图。
接下来要做的是使用像Nmap这样的网络扫描仪来收集网络应用程序本身的数据。这个想法是要弄清楚有多少关于软件和服务器的信息是对外界可见的。然后,使用像Burp Suite这样的安全测试软件进行完整的扫描,应该可以发现从服务器的软件版本到其应用环境的一切。
第2步:漏洞研究和攻击
网络应用程序渗透测试过程中的下一个主要步骤是利用收集到的数据开始缩小要尝试和利用的漏洞清单。换句话说,如果你发现攻击者可以知道你在使用一个特定的Apache和PHP版本,例如,你应该开始寻找其中的已知漏洞来尝试和利用。
幸运的是,几个伟大的开源渗透测试工具可以自动完成一些工作。你可以根据你要检查的漏洞类型,在这些工具中进行选择。流行的选项包括。
W3af
Metasploit
SQLMap
Hydra
我们的想法是尝试找到每一个可能被利用的漏洞,并将你找到的东西编成目录。如果可能的话,最好是利用这些漏洞模拟攻击,看看恶意行为者通过利用这些漏洞可以达到什么程度。
第3步:目录和报告
这个过程的下一步是创建一份报告,详细说明在前两个步骤中发现的一切。其目的是创建一个中央知识库,整个开发团队可以把它作为修复问题的路线图。这时,你在攻击模拟中收集的数据就会派上用场。
报告应该根据漏洞的严重程度对其进行分类。有各种公开的渗透测试报告样本,你可以用它们来制定适合你需要的格式。这样一来,就可以更容易地确定关闭所有安全漏洞的工作的优先次序。如果你正在处理一个已经运行的应用程序,这是一个绝对关键的步骤。记住,你所发现的漏洞可能已经在黑客的雷达上了,所以你越快修补严重的漏洞越好。
第4步:修补和重复
最后一步是通过渗透测试报告,开始解决它所发现的漏洞。如果是已经上线的应用程序,最好立即开始应用尽可能多的权宜之计。这些措施可能包括改变你的网络应用程序防火墙中的网站访问规则,或将你的应用程序中特别脆弱的部分下线。
然后,继续决定对报告中的漏洞的最佳修复方法。从最严重的开始,在每个问题被修复时简单地打勾,同时仔细记下修复的内容,以及它们可能影响应用程序的哪些其他部分。这将有助于你知道下一轮测试的重点在哪里,你必须在完成修复工作后开始测试。
创建一个有难度的目标
通过重复上述过程直到没有发现漏洞,网络应用程序的开发者和管理者可以合理地保证他们不是一只等待攻击的坐以待毙的鸭子。当然,这只是针对已知的漏洞,所以这个过程不会使攻击成为不可能--只是不可能。在一个每时每刻都在变化的网络安全环境中,这往往是任何人所能希望的最好结果。请记住,不久之前,SSL和复杂的密码还是网络应用程序安全的全部,所以持续的警惕永远是真正安全的代价。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere