作者:京东物流 陈维
本文我们将以围绕系统安全质量提升为目标,讲述在功能安全测试&安全渗透测试上实践过程。
希望通过此篇文章,帮助大家更深入、透彻地了解安全测试。
安全前置扫描主要是识别白盒漏洞、黑盒漏洞问题,针对JSRC类问题,需要通过渗透测试进行漏洞发现。
安全测试根据开展的阶段不同,测试对象不同,可以分为:功能安全测试、安全渗透测试。
以下是两者定义、两者的区别:
| 两者定义 | 功能安全测试 | 在安全开发生命周期(SDL)的测试验证阶段,对应用系统进行检验,验证是否符合安全需求定义和产品质量标准的过程 。 |
|---|---|---|
| 安全渗透测试 | 在功能安全测试完成后和产品正式上线发布前,以黑客视角对应用系统的可以被利用的安全漏洞进行发现和检查,以保护资产和重要数据的机密性、完整性和可用性。 |
| 功能安全测试 | 安全渗透测试 | ||
|---|---|---|---|
| 两者区别 | 出发点不同 | 以发现系统所有可能的安全隐患为出发点 | 以成功入侵系统,证明系统存在安全问题为出发点 |
| 视角不同 | 站在防护者角度思考问题,尽量发现所有可能被攻击者利用的安全隐患,并指导其进行修复 | 渗透测试是以攻击者的角度来看待和思考问题 | |
| 思考域不同 | 以系统所具有的功能为思考域 | 不但包括系统的功能,还有系统的机制、外部环境、应用与数据自身安全风险与安全属性等 |
具体内容:
功能安全测试:
在功能测试阶段进行,由各业务线测试工程师进行,主要包括以下几个方面:
• 人员权限设置,是否满足需求文档中的说明:
1). 是否初始化好所有的角色;
2). 每个角色是否按最小权限进行功能配置;
•权限测试:水平越权、垂直越权、交叉越权;
•敏感信息处理是否符合规范;
1). 加密存储;
2). 显示屏蔽;
3). 脱敏导出;
4). 操作安全日志记录;
安全渗透测试:
| 逻辑安全测试 | 登录逻辑安全测试 | 主要测试登录验证逻辑是否可以绕过,是否存在验证码、是否可以撞库和暴力破解 |
|---|---|---|
| 修改密码逻辑安全测试 | 针对修改密码逻辑顺序绕过问题测试,针对修改密码中短信、邮件发送逻辑和其中验证码逻辑做相关测试 | |
| 验证码逻辑测试 | 对验证码复杂度和验证码验证顺序逻辑、验证码验证重放攻击做安全测试 | |
| 认证模块测试 | 对手机短信、ca证书等强认证模块的绕过测试 | |
| 客户端安全测试 | XSS测试 | 用户输入畸形脚本及标签过滤转义 |
| CSRF测试 | 验证服务器是否添加会话TOKEN及验证referer | |
| JSON挟持测试 | 检测json格式变化及是否验证referer | |
| XSIO测试 | 测试是否限制图片postion为absolute | |
| 基础认证钓鱼测试 | 检查是否可以修改img标签的src属性构造基础钓鱼页面 | |
| URL跳转测试 | 检测用户能否修改应用的url参数使页面跳转到指定页面 | |
| Flash安全测试(客户端) | 测试Flash配置中allowscriptaccess、allowNetworking是否合理配置 | |
| cookie安全测试 | 测试重点cookie是否使用了HttpOnly | |
| CRLF测试 | 检查用户输入在HTTP头中返回,并且没有过滤%0a%0d | |
| 服务端安全测试 | SQL注入测试 | 在数据库交互操作的输入点,输入sql语句测试是否可以执行 |
| 上传漏洞测试 | 在上传功能点,测试服务端是否对上传文件类型进行有效限制 | |
| 信息泄露测试 | 测试应用是否对系统报错、测试页面等进行有效处理,是否会泄露系统敏感信息 | |
| 文件下载安全测试 | 在文件下载或者读取功能上,测试功能设计是否合理,是否文件名称和路径用户可控 | |
| HTTP头测试 | HTTP头代理伪造、HTTP头PUT请求等畸形数据测试 | |
| 远程代码执行测试 | 提交特定的代码,测试代码是否会被应用执行 | |
| 路径遍历测试 | 访问各个路径,测试是否可以显示路径下文件信息 | |
| 垂直权限测试 | 检测普通用户是否能进入当前用户权限不能进入的功能,执行高权限操作 | |
| Flash安全测试(服务端) | 检查配置文件crossdomain.xml是否配置合理 | |
| 水平权限测试 | 测试用户是否只能操作自己当前用户的资源,是否能够操作其他相同权限用户的资源 | |
| SSRF漏洞 | 测试相关服务是否存在对内部网络探测 | |
| 框架安全测试 | struts框架安全测试 | 针对struts2表达式代码执行漏洞进行测试 |
| springMVC框架安全测试 | 针对springMVC标签多个代码执行漏洞进行测试 | |
| openssl安全测试 | 针对openssl“心脏出血”等漏洞进行测试 |
Step1:确定项目是否需要安全评审
参考标准(来源安全部):
•公司重点战略项目
•外网新系统
•大量外部人员使用的内网系统(建议15人以上)
•含重大商业机密,特殊敏感性的系统;
•新采购的乙方项目或外包项目;
•上面几类系统在重大升级时。
Step2:依托SDL流程开展安全测试:
Step3:测试阶段的功能安全测试:
安全用例设计->测试执行->漏洞报告
Step4:上线前的提交渗透测试
SDL测试阶段开展功能安全测试:
①确定测试方案:功能安全测试、安全渗透测试、代码白盒扫描、应用黑盒扫描。
②安全用例设计
③功能安全用例: 基于功能点,从权限控制、越权类、数据类 维度进行用例设计。
SDL上线前提交安全渗透测试.
Step1:使用测试工具:
•BurpSuite安装:
下载地址:https://portswigger.net/burp/communitydownload
Proxy SwitchyOmega(代理插件):代理插件下载地址
•浏览器代理配置:
•BurpSuite -Proxy监听配置:
•BurpSuite使用:
浏览器启用Proxy进行代理,通过BurpSuite进行数据抓取:
Proxy-Repeater进行请求包的重发:
Proxy-Intruder进行暴力爆破:
选定变量参数--参数化--批量重发请求--结果获取分析。
Step2:测试执行
Step3:整理报告
定义:指权限控制功能不严谨,系统用户可以访问或者操作未授权的功能或者数据。
水平越权场景:当系统存在多个相同权限的用户时,A用户越权访问或操作到B用户的资源。
垂直越权场景:当系统存在不同权限的用户时,低权限用户越权访问或操作到高权限用户的资源。
未授权访问:用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问的页面或者信息。
提交了大量的举证单信息:
定义:由攻击者构造请求,由服务端发起请求的安全漏洞,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。
定义:跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。允许恶意用户将代码注入网页,其他用户在浏览网页时会受到影响。恶意用户利用XSS代码攻击成功后,很可能获得很高的权限。
XSS分为:反射型,存储型,DOM型。
本文主要讲述了功能安全测试&安全渗透测试 的定义、区别、开展方案,以及实践举例。
这两中安全测试既可在项目开展SDL流程的过程中开展,同时也可将安全渗透测试单独拿出来,针对组内外网系统,专项进行渗透测试。
通过这样的测试,可以降低遗漏到JSRC外部白帽问题数。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的: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
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您