5大IT风险评估框架 安全闲碎

5大IT风险评估框架

从网络安全的角度来看,如今的组织正在一个高风险的世界中运营。这种情况下,拥有风险管理框架显得至关重要,因为风险永远无法完全消除;它只能得到有效管理。企业评估和管理风险的能力变得前所未有得重要。而选择风险评估框架时,最关键的考虑因素就是确保它“迎合目的”并最适合预期结果。此外,选择广为人知且易于理解的框架同样有好处,它能够确保框架的使用更加一致和有效,并允许组织内的个人使用一致的语言。组织可以利用风险评估框架来帮助指导安全和风险管理人员。以下是其中一些最突出的框架,每个框架都旨在解决特定的风险领域。 NIST风险管理框架美国国家标准与技术研究院(NIST)的风险管理框架(Risk Management Framework,简称RMF)提供了一个全面、可重复和可衡量的七步流程,组织可以用其管理信息安全和隐私风险。它还附带一套NIST标准和指南,以支持风险管理计划的实施,使其满足联邦信息安全现代化法案(FISMA)的合规要求。据NIST称,RMF提供了一个将安全、隐私和供应链风险管理活动集成到系统开发生命周期中的流程。它可以应用于任何类型的系统或技术,包括物联网(IoT)和控制系统,以及任何类型的企业组织——无论其规模或部门如何。NIST RMF的七个步骤为:准备,包括使组织准备好管理安全和隐私风险的必要活动;分类,包括分类系统和基于影响分析处理、存储和传输的信息;选择,即根据风险评估选择一组NIST SP 800-53控制来保护系统;实施,部署控制系统并记录它们的部署方式;评估,确定控制系统是否到位,是否按预期运行,并产生预期的结果;授权,高级管理人员做出基于风险的决定来授权系统运行;监控,包括持续监控控制系统的实施和系统风险。NIST RMF可以根据企业组织需求进行定制,且经常能够得到评估和更新,许多工具支持该标准。IT专业人员在部署NIST RMF时要明白,它不是一个自动化工具,而是一个需要严格遵守纪律以正确建模风险的文件化框架,这一点至关重要。目前,NIST已经出版了一些易于理解且适用于大多数组织的风险相关出版物。这些参考资料提供了一个整合安全、隐私和网络供应链风险管理活动的流程,有助于控制选择和政策制定。 OCTAVE运营关键威胁、资产和漏洞评估(OCTAVE)由卡内基梅隆大学的计算机应急小组(CERT)开发,是用于识别和管理信息安全风险的框架。它定义了一种综合评估方法,允许组织识别对其目标很重要的信息资产、对这些资产的威胁以及可能使这些资产面临威胁的漏洞。通过将信息资产、威胁和漏洞结合在一起,组织能够全面了解哪些信息面临风险。而有了这种理解,他们就可以设计和部署策略来降低信息资产的整体风险敞口。目前,有两个版本的OCTAVE。一个是OCTAVE-S,这是一种简化方法,专为具有扁平层次结构的小型企业组织而设计。另一个是OCTAVE Allegro,这是一个更全面的框架,适用于大型或结构复杂的企业组织。可以说,OCTAVE是一个精心设计的风险评估框架,因为它从物理、技术和人力资源的角度来看待安全。它可以识别对任何组织而言都是关键任务的资产,并发现威胁和漏洞。但是,部署起来可能非常复杂,而且只能通过定性方法进行量化。不过,这种框架的灵活性允许运营团队和IT团队一起协作来解决企业组织的安全需求。 COBIT来自ISACA(国际信息系统审计协会)的“信息和相关技术的控制目标”(COBIT)是IT管理和治理的框架。它旨在以业务为中心,并为IT管理定义了一组通用流程。每个流程都融合了流程输入和输出、关键活动、目标、绩效度量和基本成熟度模型等因素。据ISACA称,最新版本的COBIT 2019提供了更多的实施资源、实践指导和见解,以及全面的培训机会,其实施更加灵活,使组织能够通过框架定制他们的治理过程。COBIT是与IT管理流程和政策执行相一致的高级框架。不过,挑战在于COBIT成本高昂,并且需要具备很高的知识和技能才能实施。该框架是解决企业组织信息和技术治理和管理的唯一模型。虽然COBIT的主要目的不是专门针对风险,但它在整个框架中整合了多种风险实践,并引用了多个全球公认的风险框架。 TARA据非营利组织MITRE(从事包括网络安全在内的技术领域研究和开发)称,威胁评估和补救分析(TARA)是一种工程方法,用于识别和评估网络安全漏洞并部署对策来缓解它们。该框架是MITRE系统安全工程(SSE)实践组合的一部分。MITRE表示,“TARA评估方法可以被描述为联合交易研究,其中第一个交易是基于评估的风险识别和排列攻击向量,第二个交易是基于评估的效用、成本识别和选择对策。”该方法的独特之处包括使用目录存储的缓解映射,为给定的攻击向量范围预先选择可能的对策,以及提供基于风险容忍度的对策策略。TARA是一种在考虑缓解措施的同时确定关键风险的实用方法,并且可以增强正式的风险方法以包含有关攻击者的重要信息,这些信息可以改善风险状况。 FAIR信息风险因素分析(FAIR)是对导致风险的因素以及它们如何相互影响的分类法。该框架由 Nationwide Mutual Insurance前首席信息安全官Jack Jones开发,主要为数据丢失事件的频率和幅度建立准确的概率。FAIR不是执行企业或个人风险评估的方法。但它为组织提供了一种理解、分析和衡量信息风险的方法。该框架的组成部分包括信息风险分类法、信息风险术语的标准化命名法、建立数据收集标准的方法、风险因素的度量尺度、评估风险的计算引擎以及分析复杂风险情景的模型。FAIR是为信息安全和运营风险提供可靠量化模型的少数方法之一。这种务实的风险框架为评估任何企业的风险提供了坚实基础。不过,虽然FAIR提供了威胁、漏洞和风险的全面定义,但它却没有很好的记录,因此很难实施。与其他风险框架不同的是,FAIR的重点是将风险量化为实际美元,而不是传统的“高、中、低”评分。这一点也正在获得高级领导者和董事会成员的关注,通过有意义的方式更好地量化风险,从而实现更深思熟虑的业务讨论。参考及来源:https://www.csoonline.com/article/2125140/it-risk-assessment-frameworks-real-world-experience.html原文来源:嘶吼专业版“投稿联系方式:孙中豪 010-82992251   [email protected]” 原文始发于微信公众号(网络安全应急技术国家工程实验室):5大IT风险评估框架
阅读全文
通过几道CTF题学习yii2框架 CTF专场

通过几道CTF题学习yii2框架

原创稿件征集邮箱:[email protected]:3200599554黑客与极客相关,互联网安全领域里的热点话题漏洞、技术相关的调查或分析稿件通过并发布还能收获200-800元不等的稿酬简介Yii是一套基于组件、用于开发大型 Web 应用的高性能 PHP 框架,Yii2 2.0.38 之前的版本存在反序列化漏洞,程序在调用unserialize()时,攻击者可通过构造特定的恶意请求执行任意命令,本篇就分析一下yii2利用链以及如何自己去构造payload,并结合CTF题目去学习yii2框架Yii2<2.0.38反序列化安装:在 https://github.com/yiisoft/yii2/releases 下载2.0.37的版本然后在 yii-basic-app-2.0.37basicconfigweb.php里面往cookieValidationKey随意给点值,运行 php yii serve,新建一个控制器yii-basic-app-2.0.37basiccontrollersTestController.php<?phpnamespace appcontrollers;use yiiwebController;class TestController extends Controller{ public function actionTest($name){ return unserialize($name); }}就可以进行测试了?r=test/test&name=链一链的入口在yii-basic-app-2.0.37basicvendoryiisoftyii2dbBatchQueryResult.phppublic function __destruct(){ // make sure cursor is closed $this->reset(); }跟进$this->reset();public function reset(){ if ($this->_dataReader !== null) { $this->_dataReader->close(); }这里的$this->_dataReader可控,并调用了close()方法,那么可以找到一个类不存在close()方法,但存在__call方法就可以调用他了在yii-basic-app-2.0.37basicvendoryiisoftyii2-giisrcGenerator.phppublic function __call($method, $attributes){ return $this->format($method, $attributes); }这里的$method为close,$attributes为空,继续跟进formatpublic function format($formatter, $arguments = array()){ return call_user_func_array($this->getFormatter($formatter), $arguments); }跟进getFormatterpublic function getFormatter($formatter){ if (isset($this->formatters)) { return $this->formatters; }似曾相识的代码,laravel5.8某条链就出现过,这里$this->formatters可控,也就是$this->getFormatter($formatter)这这个可控,但是$arguments的值我们无法控制,值为空到这里可以执行phpinfo了<?phpnamespace yiidb{ class BatchQueryResult{ private $_dataReader; public function __construct($_dataReader) { $this->_dataReader = $_dataReader; } }}namespace Faker{ class Generator{ protected $formatters = array(); public function __construct($formatters) { $this->formatters = $formatters; } }}namespace { $a =...
阅读全文
SpringBoot攻击面剖析 安全文章

SpringBoot攻击面剖析

SpringBoot简介 SpringBoot是一种全新的框架,目的是为了简化Spring应用的初始搭建以及开发过程。该框架使用特定的方式(集成starter,约定优于配置)来进行配置,从而使开发人员不需要再定义样板化的配置。SpringBoot提供了一种新的编程范式,可以更加快速便捷地开发Spring项目,在开发过程当中可以专注于应用程序本身的功能开发,而无需在Spring配置上花太大的工夫。 SpringBoot基于Sring4进行设计,继承了原有Spring框架的优秀基因。SpringBoot并不是一个框架,而是一些类库的集合。maven或者gradle项目导入相应依赖即可使用SpringBoot,而无需自行管理这些类库的版本。 SpringBoot攻击面剖析 1080P超清版 公众号平台本身会对素材进行二次压缩,会导致画面出现不清晰等情况。 如有需要查看超清1080P版视频,可以选用以下2种方式进行查看。 国内使用腾讯视频做为视频内容存储点,可自定义选择超清1080P。 链接地址:https://v.qq.com/x/page/e3278jlu7a9.html 如果腾讯视频访问出现异常或页面不存在等,可以访问国外Youtube 站点进行观看。国外站点作为备用站点也支持超清1080P进行观看 任意两种方式皆可选择。 国外备用视频站点: 链接地址:https://www.youtube.com/watch?v=ca6f597T4GE 其他说明 本视频基于直播内容进行了剪辑和优化,去除多余杂音及跳帧画面 后续会更新更多技术、娱乐、生活方面的视频及内容,如有其他需求或建议请发送 E-mail一起交流,一般看到会及时回复~ 备注:该内容仅做技术交流和内容备存!!! 备注:该内容仅做技术交流和内容备存!!! 相关推荐: CVE-2020-0796检测与修复 漏洞影响版本 Windows 10版本1903(用于32位系统)Windows 10版本1903(用于基于ARM64的系统)Windows 10版本1903(用于基于x64的系统)Windows 10版本1909(用于32位系统)Windows 10版本190…
阅读全文
安全运维管理-(十三)应急预案管理 未分类

安全运维管理-(十三)应急预案管理

安全运维管理控制点13.应急预案管理为有效处理等级保护对象运行过程中可能发生的重大安全事件,需要在统一框架下制定针对不同安全事件的应急预案,就应急预案内容向设计的人员开展培训、演练、并根据等级保护对象的变化情况和安全策略的调整结果开展应急预案的评估、修订与完善。a)安全要求:应规定统一的应急预案框架,包括启动预案的条件、应急组织构成、应急资源保障、事后教育和培训等内容。要求解读:应急预案框架一般为单位总体应急预案管理的顶层文件,明确应急组织构成、人员职责、应急预案启动条件、响应、后期处置、预案日常管理、资源保障等内容,与各类网络安全事件专项应急预案共同构成整个应急预案体系。检查方法检查应急预案框架,内容是否包括了启动应急预案的条件、应急组织构成、应急资源保障、事后教育和培训等。测评对象应急预案相关文档期望结果1.具有应急预案框架。2.应急预案框架覆盖了启动应急预案的条件、应急组织构成、应急资源保障、事后教育和培训等方面的内容。b)安全要求:应制定重要事件的应急预案,包括应急处理流程、系统恢复流程等内容。要求解读:对重要事件制定专项应急预案,并对处理流程、恢复流程进行明确的定义。检查方法检查针对重要事件的应急预案,预案内容是否包括了应急处理流程、系统恢复流程等。测评对象重要事件应急预案期望结果1.具有重要事件的专项应急预案,如针对机房(供电、火灾、漏水等)、系统(病毒爆发、数据泄露等)、网络(断网、拥塞等)等各个层面。2.专项事件应急预案包含应急处理流程、恢复流程。高风险判定满足以下任一条件即可判定为高风险且无补偿措施:1.未制定重要事件应急预案。2.应急预案内容不完整,未明确重要事件的应急处理流程、恢复流程等内容,一旦出现应急事件,无法合理有序的进行应急事件处置。c)安全要求:应定期对系统相关的人员进行应急预案培训,并进行应急预案的演练。要求解读:应急预案培训和演练是应急的重要环节,应定期组织相关人员予以培训和演练,以保障及时有效的处理应急事件。检查方法1.检查以往开展过应急预案培训所产生的记录,确认培训的频度,记录内容是否包括了培训对象、培训内容、培训结果等。2.检查以往开展过应急预案演练所产生的记录,确认演练的频度,记录内容是否包括了演练时间、主要操作内容、演练结果等。测评对象应急预案培训和演练记录文档期望结果1.定期(每季度、每半年、每年)对相关人员进行应急预案培训和演练。2.具有应急预案培训的记录文件,包括培训对象、培训内容、培训结果等。3.具有应急预案演练记录文件,主要包括演练时间、主要操作内容、演练结果等。高风险判定满足以下条件即可判定为高风险:未定期(至少每年一次)对相关人员进行应急预案培训,未根据不同的应急预案进行演练,无法提供应急预案培训和演练记录。补偿因素:对于定级对象还未正式上线的情况,可以从培训演练制度、相关培训计划等角度进行综合风险分析,根据分析结果,酌情判定风险等级。d)安全要求:应定期对原有的应急预案重新评估、修订完善。要求解读:机房根据每次应急演练的情况,对应急预案进行重新评估和修订。检查方法检查应急预案修订记录,记录内容是否包括修订时间、参与人、修订内容、评审情况等。测评对象应急预案修订记录相关文档期望结果1.具有应急预案修订记录。2.记录内容包括了修订时间、参与人、修订内容、评审情况等。 相关推荐: 秋招火爆来袭!简历上的哪些内容才是招聘者眼中的干货?点击上方“蓝字”关注我们 9月,秋招如期而至。应届毕业生们,做好准备了吗? 是不是为了工作辗转失眠?是不是初入职场焦虑不知所措?是不是为了简历愁秃了头?…… 在找工作,应聘大厂前,如果仅用关键词去对堆砌自己的简历,缺少实战,很容易在简历海中,直接被 pass …
阅读全文
浅见:将JS代码注入到第三方CEF应用程序 安全文章

浅见:将JS代码注入到第三方CEF应用程序

本文为看雪论坛优秀文章看雪论坛作者ID:renbohanCEF是Chromium Embedded Framework的缩写,即“Chromium嵌入式框架”,采用c++编写,地位类似于Electron,是web开发应用程序的重要框架,被许多软件包括微信、网易云、生死狙击等采用,是一款十分优秀的嵌入式框架。 由于一些原因,需要把js注入到某款使用CEF的应用中,通过js代码与应用web进行一些交互,于是乎研究了一下CEF这个框架,并分享注入js代码到第三方CEF应用的一些经验。1CEF应用典型特征文件目录特征很明显:cef.pakcef_100_percent.pakcef_200_percent.paklibcef.dll2着手点既然CEF功能核心全部都在libcef.dll里面,那么自然首选也是从这个dll入手。 网上简单搜索CEF的教程后发现,CEF的框架在基础libcef.dll的导出函数的基础上,增加了一层c++类的实现,实现了c2cpp接口的对接。 观察官方给出的demo发现,创建浏览器对象,最终会调用libcef.dll!cef_browser_host_create_browser来创建出浏览器。 而一旦得到浏览器对象,我们就可以根据CEF框架中的头文件,非常方便的执行js代码了。 所以很自然想到把libcef.dll!cef_browser_host_create_browser给hook掉,然后从中间偷出 cef_browser_t*对象。int cef_browser_host_create_browser( const cef_window_info_t* windowInfo, struct _cef_client_t* client, const cef_string_t* url, struct _cef_browser_settings_t* settings, struct _cef_request_context_t* request_context);然而新的问题马上出现,cef_browser_host_create_browser 是使用异步的方法创建浏览器,因此cef_browser_t*对象只会在创建成功的回调函数中才能得到,于是我准备设法从_cef_client_t* client这个参数中得到回调地址,然后inline hook掉回调函数(直接改回调地址失败了,估计是地址不可写)。 很不幸的是,虽然获取回调地址很顺利,但是不知什么原因,回调函数始终没有得到调用,因此此路不通,只能另辟蹊径。 此时完全没有头绪,根本不知道该如何下手了,毕竟cef_browser_t*得不到,想执行js代码根本不可能,无聊之余打开了ApiMonitor,想看看能否从应用的libcef.dll的调用情况中得到一点启发。 ApiMonitor监视自定义dll的调用情况也非常方便,设置监视的函数为libcef.dll中的全部函数。然后启动应用,由于浏览器内核特性,应用自然也是多进程的,一个个查看后,其中一个进程调用的api引起我的兴趣。cef_v8context_get_current_context这个函数的调用瞬间将思路打开。看到V8,那这个函数传参或者返回值多半和Javascript分不开了,再去CEF的源码里找找参数或者返回值的含义。///// Returns the current (top) context object in the V8 context stack.///CEF_EXPORT cef_v8context_t* cef_v8context_get_current_context();惊喜的发现居然没有参数,直接反汇当前V8引擎上下文中最前的context。 由于browser是与V8js引擎绑定的,所以也可以通过返回值cef_v8context_t*得到browser对象了。cef_browser_t* browser = NULL;cef_v8context_t* my_cef_v8context_get_current_context() { cef_v8context_t* js_context = ori_cef_v8context_get_current_context(); Print("my_cef_v8context_get_current_context js_context: %X!!n", js_context); browser = js_context->get_browser(js_context); //Print(" browser = %Xn", browser); _cef_frame_t* frame = browser->get_main_frame(browser); //Print(" frame = %Xn", frame); CefString script = payload; CefString url = xorstr("app/wd").crypt_get(); frame->execute_java_script(frame, script.GetStruct(), url.GetStruct(), 0); return js_context;}接下来的事也就水到渠成了,按照网上教程的方法,得到browser过后一切变得简单明了起来。 而且写完后我发现这样的写法还有个好处,就是可以考虑到页面刷新的情况,因为浏览器一旦页面刷新,重启js虚拟环境,那么浏览器又会主动调取cef_v8context_get_current_context,因此只要我们hook这个函数过后,所有的页面,不管是否刷新,我们都能够注入自己想要的js代码。3总结在时间有限,没有足够时间去完整系统学习一个框架的时候,例如这里的CEF框架,我们依然想快速的实现目标,就必须要开拓思路,不要始终拘泥于网上别人教授的正常/官方方法,有时另辟蹊径反而可以带来意料之外的惊喜。 研究CEF的前大半部分时间,我始终困在网上一些无比老旧,东搬西凑,复制粘贴的教程中,边抱怨作者,边复制代码,最后还实现不了功能,最后干脆还是只能放弃,进行独立思考,将成果分享给大家。4参考https://blog.csdn.net/gaga392464782/article/details/49490101?spm=1001.2014.3001.5502https://zhuanlan.zhihu.com/p/29077686https://stackoverflow.com/questions/54398446/how-do-i-add-a-access-control-allow-origin-to-a-requested-resource-with-a-custhttps://blog.csdn.net/gaga392464782/article/details/49490101?spm=1001.2014.3001.5502 看雪ID:renbohanhttps://bbs.pediy.com/user-home-751959.htm*本文由看雪论坛 renbohan 原创,转载请注明来自看雪社区# 往期推荐1. 基于Mono注入保存Draw & Guess历史房间数据2. 一个方案:家用路由器D-LINK DIR-81漏洞挖掘实例分析3. 2015年AliCrackMe学习Android逆向4. JSONP和CORS跨域漏洞学习笔记5. 云丁鹿客门锁BLE通信的分析6. Windows驱动编程之WFP/TDI公众号ID:ikanxue官方微博:看雪安全商务合作:[email protected]球分享球点赞球在看点击“阅读原文”,了解更多! 本文始发于微信公众号(看雪学院):浅见:将JS代码注入到第三方CEF应用程序
阅读全文
代码审计第三讲实战挖掘sql注入漏洞 代码审计

代码审计第三讲实战挖掘sql注入漏洞

为了更好去挖掘php漏洞,对于流行的框架,我们也要了解一下,这样才能挖掘到高位漏洞。对于框架学习,不同公司有不同框架,所以对于框架,也因人而应,另外看公司需求,如果你的公司大部分采用某一种框架,你来学习这种框架就可以了。因为这样才可以提高你的工资。这里我推荐大家学习是ThinkPHP。http://document.thinkphp.cn/manual_3_2.htmlhttp://sec-redclub.com/相对来说,我们也不能全部去把开发手册看完。我们要有需求型去查看文档,比如基础部分,查看哪些知识,掌握最基本知识就可以了。如果你想挖掘框架漏洞,那么必须有必要去开发一些小程序,利用上框架,这样你就可以掌握的节奏快一些,而且也能更好理解。Application├─Common         应用公共模块│  ├─Common      应用公共函数目录│  └─Conf        应用公共配置文件目录├─Home           默认生成的Home模块│  ├─Conf        模块配置文件目录│  ├─Common      模块函数公共目录│  ├─Controller  模块控制器目录│  ├─Model       模块模型目录│  └─View        模块视图文件目录├─Runtime        运行时目录│  ├─Cache       模版缓存目录│  ├─Data        数据目录│  ├─Logs        日志目录│  └─Temp        缓存目录以前你看到大写字母I、M,知道代表什么意思么? 模板就是把所有的过滤方法、函数全部给框起来,你直接调用就可以。如果框架一出现问题,那么所以调用者就会出现问题了。https://segmentfault.com/q/1010000002988073框架问题就简单给大家介绍到这里。本次审计代码为damiCMS,进行sql注入漏洞挖掘。 文中箭头打的地方,就是我们重点去查看代码的地方。Action文件夹里面的文件是我们重点查看的文件。你可以重点去一个一个分析,也可以用notepad++对整个文件夹的$_GET或者$_POST等进行查找。去查找有没有相对应的漏洞。对于代码一定去细看,如果不细看,你是发现不了什么问题的。这个是查找出来的结果,我们需要对结果一一进行分析。看看是否有漏洞。我们注意到这个文件,里面目前没有看到相关的过滤函数。对于前面的文件里面,出现了大量的过滤函数,如htmlspecialchars、remove_xss等过滤函数。对于这些函数,本文就不再一一进行解释了,如果对此两个函数不了解,可以查看以下URLhttp://www.w3school.com.cn/php/func_string_htmlspecialchars.asp我们通过阅读源代码,发现ajax_arclist()这个函数发现问题,被圈住的这三个变量没有经过任何的过滤,直接就进过赋值,可能会发生问题。那现在我们开始验证问题。1.首先需要搭建damicms,我们采用环境是wamp。具体搭建我就不给大家介绍了,前几节,有具体搭建的内容。从前面的几步过程中,我们发现where没有经过加固,直接就带入数据库中, 找到这个测试点以后,为了证明我们查找是否存在注入点。我们开始利用火狐浏览器,进行验证。依次构造的路径为api/ajax_arclist(函数名)/model(requst接收的值)/article/页数。只有这个page页为真,才会执行sql语句,所以我们这里随意给赋值一个数值。执行完语句之后利用常规判断sql语句,and 1=1和and 1=2,来进行判断是否有注入。页面返回值不一样,证明页面存在注入。我们利用sqlmap进行跑表,其实手工也可以进行猜表,如果手工你不会,则去看前两节,我在这里就给大家利用工具进行跑表了。 代码第一处问题。其实利用$_GET查找还发现了第二处问题,在articleAction.class.php这个文件家里面,$_GET传输没有进行过滤,导致出现了注入,后来高版本加上inject_here()这个函数,但是依然可以进行绕过。//防止sql注入          functioninject_check($str)          {           $tmp=eregi('select|insert|update|and|or|delete|'|/*|*|../|./|union|into|load_file|outfile',$str);                   if($tmp)                   {                   alert("非法操作!",3);                   }                   else                   {                           return$str;                   }          }这个是在common.php文件里面,我们可以采取双竖线||进行绕过。具体测试我就不给大家演示了。此次文章就给大家写到这里。下一节预计讲XSS基础,文章总体比较基础,还希望能给新手一些帮助。 本文作者:whitecell-club.org  redBu11文章欢迎转载,但请务必保留作者与出处! 本文始发于微信公众号(WhiteCellClub):代码审计第三讲实战挖掘sql注入漏洞
阅读全文
白小勇:数据安全需要新框架、新战法(附下载) 云安全

白小勇:数据安全需要新框架、新战法(附下载)

近日,第九届互联网安全大会(简称ISC 2021)在北京国家会议中心成功举办,本届大会以“网络安全需要新战法,网络安全需要新框架”为主题,是网络安全行业的顶级盛会之一。炼石网络创始人、CEO白小勇受邀出席“数据安全与隐私保护战略峰会“,并作《DTTACK:以数据为中心的安全技术框架》主题演讲,分享对数据安全的新框架、新战法的探索。(关注公众号,回复关键词“ISC2021”,下载演讲PDF高清文档)图1:炼石网络创始人CEO白小勇作主题演讲 本文共计 4085 个字,预计阅读时间 15 分钟。 注: DTTACK技术框架后续将陆续更新迭代,欢迎业界同仁共同完善。 一、数据安全需要新框架 (一)“五法一典”构筑新合规 数据安全需求来源,一是内在的风险驱动,二是外部的合规驱动,两者是辩证统一的。数据泄露等安全事件本身具备经济学的外部效应特征,即消费方与受益方不一致,类似化工厂,如果没有《环境保护法》等法律法规制约,在不考虑社会责任的情况下,其最经济的选择是就地排污排废。就个人信息保护来说,如果没有外部的合规要求,数据泄露最直接的受害者就是老百姓,而对企业等个人信息处理者的自身利益没有实质损害,因此,通过合规引导企业实施数据安全建设是非常重要的。目前,我国初步建立了数据安全相关的法律法规体系,形成“五法一典”共治的新合规局面,包括《国家安全法》《网络安全法》《数据安全法》《密码法》《个人信息保护法(草案)》以及《民法典》。“五法一典“之间紧密关联又各有侧重,《国家安全法》是维护国家总体安全的基础法律,《网络安全法》提出了安全治理道路,《数据安全法》和《个人信息保护法(草案)》明确了保护目标,《民法典》包含了自然人的人格权保护,而《密码法》强调了保护信息与数据的技术手段。 图2:“五法一典”构筑“平安中国” (二)回顾经典的网络安全框架 ATT&CK是网络安全行业目前公认权威、并被普遍接受的攻击模型框架,由MITRE提出,全称是Adversarial Tactics, Techniques, and Common Knowledge(对抗性的战术、技术和通用知识),其最新版本包括14个攻击战术、205个攻击技术、573个攻击流程,覆盖了绝大多数网络攻击手段,能够为网络安全防护提供专业的技术参考。ATT&CK框架以及关联的Shield主动防御框架,以网络攻防为视角,侧重“以网络为中心的安全”保护思路,通过防漏洞、堵漏洞的应对方式保护数据。而当下来看,网络漏洞始终在所难免,所以直接针对数据本身进行主动式保护,是实现数据安全的最直接有效的手段。因此,企业安全建设趋势正在从“以网络为中心的安全”转向“侧重以数据为中心的安全”。 图3:经典网络安全ATT&CK框架 (三)打造数据安全新框架 进入数据时代,侧重攻防对抗的ATT&CK框架,难以覆盖“主动式保护数据”的各种技术手段。炼石尝试从“以数据为中心”的角度提出DTTACK数据安全技术框架,全称是Data-centric Tactics, Techniques And Common Knowledge(以数据为中心的战术、技术和通用知识)。DTTACK框架尝试填补“以数据为中心”的安全技术体系的空白,它不是网络、服务器或应用程序安全性的模型,更强调数据本身的安全性,并从对数据的“应对式”防护,向“主动式”防护转变,重视从业务风险映射视角列举数据保护需求,可以为信息化建设、企业业务架构设计提供数据安全能力参考。同时,DTTACK结合NIST安全能力模型和安全滑动标尺模型,选择了六大战术作为基本结构:IDENTIFY(识别)、PROTECT(防护)、DETECT(检测)、RESPOND(响应)、RECOVER(恢复)、COUNTER(反制)。目前,炼石已初步梳理6个战术,36个技术,116个子技术,86个方法,并持续更新迭代,致力于打造数据安全领域的专业权威技术框架,期望为数据安全厂商提供通用知识库,为甲方的数据安全规划和技术对比提供参考依据。我们在此也欢迎业内同仁、相关企业共同参与完善DTTACK框架。图4:DTTACK数据安全技术新框架DTTACK不是孤立的,我们认为,“以网络攻防为中心的安全”与“以数据保护为中心的安全”之间是相互关联、依赖、叠加演进的,“网络与数据并重的新安全建设”是当下企业安全建设的方向。网络安全是实现数据安全的基础,但光靠网络安全又很难有效保护数据,数据安全新框架是安全技术演进的必然,把“以网络攻防为中心的ATT&CK框架”和“以数据保护为中心的DTTACK框架”相结合,两者相辅相成,全方位保护网络与数据安全。 图5:网络与数据并重的新安全建设   二、数据安全需要新战法 (一)面向失效的数据安全新战法 安全漏洞层出不穷,攻击手段与利用手法日益复杂精妙,攻击方和内部威胁方天然具有单点突破的优势。同时,在构建安全防御体系的过程中,由于防护规则覆盖难以面面俱到,或在具体实施过程中难免疏漏,或内部人员天然有接触数据的风险,这些都可能导致某个安全节点被突破失效,所以简单堆叠防护技术和产品在体系化进攻和日益复杂的内部威胁面前是难以奏效的。DTTACK框架列举了诸多技术,其作用类似于“兵器库”,防守方需要体系化的思路整合这些技术,才能利用好先发优势,精心“排兵布阵”,环环相扣构造纵深防御战线,体系化的防范内外部威胁,提升防御有效性。基于DTTACK框架,我们考虑要从几个重要维度层层切入,基于面向失效(Design for Failure)的防御理念,综合利用多样化手段构建纵深,当一种保护手段失效后,有后手安全机制兜底,打造纵深协同、而非简单堆叠的新战法。我们选择三个比较重要的维度,一是安全能力维度(I.识别、P.防护、D.检测、R.响应、R.恢复、C.反制),二是数据形态维度(使用态、存储态和传输态等),三是技术栈维度(SaaS/业务应用、Paas/平台、IaaS/基础设施),这三个维度之间关系是独立的、正交的,三者叠加可构建更有效的数据纵深防御体系。图6:面向失效的数据安全新战法 (二)从安全能力构建数据防御纵深 “IPDRRC”体现了数据保护的时间顺序,基于时间维度,可以有机结合多种安全机制。识别是一切数据保护的前提,在数据识别与分类分级、以及身份识别的前提下,针对数据安全威胁的事前防护、事中检测和响应、事后恢复和追溯反制等多种安全机制环环相扣,协同联动,可以有效构建出面向失效的纵深防御机制。图7:越靠近事前防护,投资回报率越高当然,从当前企业的数据安全建设重点看,越靠近“事前防护”,投资回报率越高,如果仅依靠检测/响应、恢复以及反制等环节,损失已经发生,企业会付出更高成本。因此,数据安全建设之初,应当优先建设事前防护能力,需要综合应用多种安全技术,尤其是采用密码技术开展数据安全保护,比如加密、脱敏等。 (三)从数据形态构建数据防御纵深 数据大致可以分成传输态、存储态和使用态,而身份鉴别及信任体系则是对数据访问的补充或者前提,基于“数据三态”可延伸出数据全生命周期。围绕数据形态,可以构建多种安全机制有机结合的防御纵深。我们梳理出20种密码应用模式,采用IPDRRC中数据防护段的密码技术,进入了数据形态维度的纵深防御构建。图8:二十种密码应用模式一览在信息系统中,数据在传输、存储、使用等不同形态之间的转化,每时每刻都在发生,在这种转化过程中,可以利用多种安全技术构建协同联动的纵深防御机制。在传统网络安全防护中,边界是非常重要的概念,边界上可以构建防火墙或IDS等规则。但数据防护过程中,数据没有边界,如果应用密码技术,则可以起到一种虚拟边界的作用,从而在虚拟边界基础上对数据实施保护,形成有效保护作用。在数据存储和使用态的切换中,如果不经过数据加密,只进行访问控制和身份认证,当明文数据在数据库或归档备份时,数据访问容易被绕过。但当我们在数据流转的关键节点上,对数据进行加解密,并结合用户的身份信息和上下文环境做访问控制,可以构建防绕过的访问控制、高置信度的审计,进而在数据存储、使用形态上形成防护纵深,构建出密码安全一体化的数据防护体系。 (四)从技术栈构建数据防御纵深 信息系统的技术栈体现了空间维度,这也可以作为数据保护的纵深。沿着数据流转路径,在典型B/S三层信息系统架构(终端侧、应用侧、基础设施侧)的多个数据处理流转点,综合业内数据加密技术现状,总结出适用技术栈不同层次的数据保护技术。我们继续前文所述的IPDRRC中数据防护段的密码技术,保护数据存储态,再结合典型信息系统的技术栈分层,可以从技术栈维度构建数据防御纵深。本文列举了10种数据存储加密技术,在应用场景以及优势挑战方面各有侧重:DLP终端加密技术侧重于企业PC端的数据安全防护;CASB代理网关、应用内加密(集成密码SDK)、应用内加密(AOE面向切面加密)侧重于企业应用服务器端的数据安全防护;数据库加密网关、数据库外挂加密、TDE透明数据加密、UDF用户自定义函数加密则侧重于数据库端的数据安全防护;TFE透明文件加密、FDE全磁盘加密则侧重于文件系统数据安全防护。其中,覆盖全量数据的FDE技术可作为基础设施层安全标配,进一步的,针对特别重要的数据再叠加AOE等技术实施细粒度加密保护,两者的结合可以面向技术栈构建出数据防护纵深。图9:覆盖不同技术栈的数据加密技术综上所述,数据时代面临新威胁、新合规,呼唤数据安全新框架、新战法。以数据为中心的安全防护体系,应当采用面向失效的防御理念,在安全能力、数据形态、技术栈等多个不同维度上,有机结合多种安全技术构建纵深防御机制,形成兼顾实战和合规、协同联动体系化的数据安全新战法。(关注公众号,回复关键词“ISC2021”,下载演讲PDF高清文档) ▼ 往期精彩回顾 ▼ 三万字 | 2021密码产业洞察报告(附下载) 收藏贴 | 2021上半年网安政策标准、产业报告大合集 图解 | 从《数据安全法》法定义务读企业行动指南 图解《数据安全法》                                                   炼石网络是一家以数据为中心的安全技术创新厂商,提倡“以数据为中心的新安全理念”,自主研发CASB业务数据安全平台和高性能国密产品,开创性实现免开发改造应用、敏捷实施细粒度数据保护,该产品入选工信部2020年网络安全技术应用试点示范推荐项目,并夺得第七届互联网安全大会(ISC 2019)首届“创新独角兽沙盒大赛”总冠军。基于AOE面向切面数据安全技术,将安全与业务在技术上解耦、但又在能力上融合交织 ,实现主体到应用内用户、客体到字段级的防护,打造“以密码技术为核心,访问控制、审计等多种安全技术互相融合”的实战化数据安全防护体系。炼石为政府、金融、教育医疗文旅、工业央企商业等行业用户,提供个人信息保护、商业秘密保护以及国密合规改造方案,让数据共享更安全、更有价值。 微信号:炼石网络CipherGateway 本文始发于微信公众号(炼石网络CipherGateway):白小勇:数据安全需要新框架、新战法(附下载)
阅读全文
(文末送书)PickleC2 横向移动框架 安全文章

(文末送书)PickleC2 横向移动框架

    PickleC2 是一个用 python3 编写的简单 C2 框架,用于帮助渗透测试人员的社区参与红队活动。    PickleC2 能够为后期开发和横向移动导入您自己的 PowerShell 模块或自动化该过程。特征测试版有一个植入物,它是 powershell。PickleC2 是完全加密的通信,即使在通过 HTTP 通信时也能保护 C2 流量的机密性和完整性PickleC2 可以毫无问题地处理多个侦听器和植入程序PickleC2 支持任何想要添加自己的 PowerShell 模块的人在即将到来的更新中,pickle 将支持:去植入不使用 System.Management.Automation.dll 的 Powershell-Less Implant。将支持可锻 C2 配置文件。将支持 HTTPS 通信。注意:即使是 HTTP 通信也是完全加密的。安装    PickleC2 是一个开源的,可以在 Github 上找到。PickleC2 目前只支持 linux,你可以通过https://github.com/xRET2pwn/PickleC2下载git clone https://github.com/xRET2pwn/PickleC2.gitcd PickleC2sudo apt install python3 python3-pippython3 -m pip install -r requirements.txt./run.py今日赠书福利一:Python 3.x网络爬虫从零基础到项目实战      本书通过精选案例引导读者系统学习,系统完整地介绍了网络爬虫的开发知识和技巧。本书主要基于Python 3.7开发网络爬虫,主要内容包括认识爬虫、爬虫需要具备的基础知识、数据提取的方式、如何提高爬虫的效率、数据的存储、动态页面的爬取、机器识别、模拟登陆、设置代理IP、Scrapy爬虫框架和分布式爬虫等知识点。为了让读者更好的掌握这些技术和更多的了解爬虫的功能,本书后提供了九个实战项目,通过大量案例操作,来让读者提高爬虫的反爬和数据提取等爬虫技术实战的能力。本书不仅适合零基础或有部分编码能力并对爬虫技术有兴趣的读者,而且适合准备从事或学习数据科学与人工智能相关行业的读者。二:机器学习与深度学习算法基础    本书从机器学习的概念与基本原理开始,介绍了机器学习及近年来流行的深度学习领域的经典模型。阅读本书可以让读者系统地了解机器学习和深度学习领域的基本知识,领会模型算法的思路与策略。    本书分为两篇,共18章。一篇为经典机器学习模型,主要介绍常用的机器学习经典模型,包括线性回归、支持向量机模型、逻辑斯蒂回归、决策树模型、k近邻、朴素贝叶斯、线性判别分析和主成分分析、流形学习、聚类算法、稀疏编码、直推式支持向量机、集成算法。第二篇为深度学习模型与方法,剖析神经网络的基本要素,并介绍常用的深度学习模型,包括感知机、卷积神经网络、循环神经网络、生成对抗网络。    本书试图从初学者的角度对机器学习和深度学习的经典算法进行详细阐述。本书插图丰富,语言通俗易懂,适合初入机器学习领域的“萌新”,也适合希望将机器学习算法应用到日常工作中的其他专业从业者,还可供对人工智能领域感兴趣的读者参考阅读。三:Python网络编程从入门到精通    《Python网络编程从入门到精通》从实际应用出发,详细介绍Python网络编程的相关知识与操作技能。全书分为3篇共计12章。1篇为基础篇, 介绍了Python编程的环境搭建、基本模块、数据库编程及测试驱动开发等内容,为读者学习网络编程做了一个很好的知 识铺垫;第2篇为核心篇,讲解了网络编程中HTTP服务器与客户端编程、Socket网络编程、Django框架应用、FTP、Telnet、POP3、SMTP、SNMP等知识,为网络编程奠定基础;第3篇为项目实战,以开发“实时在线互动聊天系统”和 “权限管理系统”两个应用案例介绍了Python网络编程的实战篇,读者可从项目部署出发,实现完整的项目开发。    本书通过示例进行讲解,每个章节均配有实现代码,便于读者掌握Python编程技术。本书既可作为Python初学者及爱好者技术提高级读物,也可作为广大职业院校、培训班的教材参考用书。     为了感谢大家一直以来的关注与支持,会有三本书籍免费赠送,中奖者可以从上述书籍中任选一本。     规则如下:     1.  本文末点‘在看’,不需要转发朋友圈,点个‘在看’就可以。     2. 公众号内发送“抽奖00”即可扫描参与抽奖,注意看 是发送暗号“抽奖00”。     3. 中奖者不满足条件1,视为放弃中奖资格。     4. 活动截止时间为8月13日 18:00点,到时候还要中奖者及时联系号主留下你的收货地址、姓名、手机号以及想要的书籍,好给您发送书籍哦!24小时内未联系号主视为自动放弃!先点“再看”,然后点击下方公众号私聊发送“抽奖00” 即可马上扫描参与抽奖 本文始发于微信公众号(LemonSec):(文末送书)PickleC2 横向移动框架
阅读全文
打造python web 框架(四): 采用Werkzeug + jinjia2 进行架构 安全开发

打造python web 框架(四): 采用Werkzeug + jinjia2 进行架构

说明:python里有个werkzeug框架进行了WSGI规范的实用函数库。使用广泛,flask框架底层就是采用了werkzeugwerkzeug: http://werkzeug.pocoo.org/特性:HTTP头解析与封装易于使用的request和response对象基于浏览器的交互式JavaScript调试器与 WSGI 1.0 规范100%兼容支持Python 2.4-Python 2.7 (Python 3.0实验性支持)支持Unicode支持基本的会话管理及签名Cookie支持URI和IRI的Unicode使用工具内置支持兼容各种浏览器和WSGI服务器的实用工具集成URL请求路由系统安装:easy_install Werkzeugorpip install Werkzeugorhttps://pypi.python.org/pypi/Werkzeugpython setup.py install第一个程序运行结果一个很简单的web server 启动了。架构升级jinjia2:http://jinja.pocoo.org/Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。Kiss.pyrun.pyindex.htmlinn0team是一个正在成长的安全团队微信号:inn0team长按可关注我们 本文始发于微信公众号(inn0team):打造python web 框架(四): 采用Werkzeug + jinjia2 进行架构
阅读全文
PoC 编写指南(基于Pocsuite框架SQL注入PoC编写) 安全文章

PoC 编写指南(基于Pocsuite框架SQL注入PoC编写)

版权声明:本教程为笔者原创,转载需征求笔者同意。港真,这一篇也是在教你怎么赚钱的PoC指南,所以呢,如果你通过这篇文章赚钱了,请不要吝啬你的转发跟点赞。呀比!   学过了无框架的PoC编写跟基于Bugscan框架的编写,我们来学习基于Pocsuite框架的SQL注入PoC编写,接下来看代码2_2_2.py中使用了 Python 标准库中的 urllib2 来发送 HTTP 请求,而在 Pocsuite 中,框架要求使用 Pocsuite 框架封装好的 req , 其实它就是 python 的 requests 库,具体的用法直接看 requests 帮助文档就好了。    为什么不让你在 PoC 中直接 import requests 呢?上面我已经说过了,哦,好像没说,我们在批量的时候,有一些站为了防机器人,需要看你有没有 HTTP 请求头的,比如有一些 WAF 会检测请求中是否有 User-Agent, 对,就是怕有些人忘记了,于是框架就处理了这些啊。再比如,你这个 PoC 中需要 Cookie ,你总不能在扫描的时候弹一个框让用户写 Cookie 吧,那你批量的时候不累死用户了。对,这些东西,框架都帮你解决了。好了看代码:代码 2_2_3.py:将上面的代码保存为 2_2_3.py 然后下载 Pocsuite 框架后,用 Pocsuite 框架执行我们的 PoC, 执行结果如图 2-5:图 2-5本想在注释里面解释一下的,写完发现代码实在是太乱了,于是我还是放下面解释吧。我们先看一下代码整体结构:    最上面是引入一些类库,中部是一个 PoC 的类,继承自 PoCBase 类,类中有两个函数,_verify和 _attack ,这两个分别是 verify 和 attack 模式的入口函数,然后还有一个用户自己定义的函数parse_result , 用于统一输出。下面是针对每个具体的部分的说明,其实在人家框架里面已经有详细说明了,我重复一下。   上面这些代码的意思是引入 pocsuite 的类库,当然你直接去按目录找肯定是找不到的,因为这个是老版本的 pocsuite 框架的目录结构,为了兼容老版本的就这么处理了。在加载的时候会自动将其替换成正确的路径。总结起来就一句话,人这么规定的你就这么写就对了。这一部分代码,用于填写一些基础信息,PoC 多的情况下很有用的。根据漏洞实际情况填写就行了。   这里就是具体的 verify 的代码了。如果你看过 代码 2_2_2.py ,那么这段代码对你来说并不是问题,与代码 2_2_2.py 不同的是,这里使用了 req 来发送数据,还有一处不同的就是输出不再是 print 了,而是将我们要输出的信息保存在了一个叫 result 的字典里面,然后再调用 parse_result 将其输出。   这里是 attack 模式的入口,这个是带有攻击性质的验证模式,也就是说,在这个函数里面,你可以直接注出管理员密码出来。相对于 _verify 来说,这个就稍微复杂了那么一丢丢。我偷了个懒不想写了,就让它返回 verify 了。   这个函数,是我自己定义的一个函数,有些人有问题,到底能不能自己定义函数,答案就是 能!记住,_verify 和 _attack 是入口,也就是框架要调用这两个函数,程序执行进来了以后,你想怎么调用就怎么调用。关于这里面的代码,就是调用了框架输出的实例 Output 了而已。这是最后,也是比较容易忽视的地方,一定要注意在最后要调用 register 来注册你的 PoC 类,这样框架才知道你这个类是 PoC 类,就会去调用它。总结   本小节中主要讲了 基于报错的 SQL 注入 PoC 编写,也就是针对有回显的 SQL 注入,我们 PoC 模拟了浏览器提交数据的这一过程,我们判断是否存在漏洞的依据就是看返回页面的内容是否有我们预期的值。 ...
阅读全文
批处理框架 Spring Batch 指北 安全文章

批处理框架 Spring Batch 指北

点击下方“IT牧场”,选择“设为星标”Spring Batch简介Spring Batch是Spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作。这些业务运营包括:无需用户交互即可最有效地处理大量信息的自动化,复杂处理。这些操作通常包括基于时间的事件(例如月末计算,通知或通信)。在非常大的数据集中重复处理复杂业务规则的定期应用(例如,保险利益确定或费率调整)。集成从内部和外部系统接收的信息,这些信息通常需要以事务方式格式化,验证和处理到记录系统中。批处理用于每天为企业处理数十亿的交易。Spring Batch是一个轻量级,全面的批处理框架,旨在开发对企业系统日常运营至关重要的强大批处理应用程序。Spring Batch构建了人们期望的Spring Framework特性(生产力,基于POJO的开发方法和一般易用性),同时使开发人员可以在必要时轻松访问和利用更高级的企业服务。Spring Batch不是一个schuedling的框架。Spring Batch提供了可重用的功能,这些功能对于处理大量的数据至关重要,包括记录/跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。它还提供更高级的技术服务和功能,通过优化和分区技术实现极高容量和高性能的批处理作业。Spring Batch可用于两种简单的用例(例如将文件读入数据库或运行存储过程)以及复杂的大量用例(例如在数据库之间移动大量数据,转换它等等) 上)。大批量批处理作业可以高度可扩展的方式利用该框架来处理大量信息。Spring Batch架构介绍一个典型的批处理应用程序大致如下:从数据库,文件或队列中读取大量记录。以某种方式处理数据。以修改之后的形式写回数据。其对应的示意图如下:spring batch的一个总体的架构如下:在spring batch中一个job可以定义很多的步骤step,在每一个step里面可以定义其专属的ItemReader用于读取数据,ItemProcesseor用于处理数据,ItemWriter用于写数据,而每一个定义的job则都在JobRepository里面,我们可以通过JobLauncher来启动某一个job。Spring Batch核心概念介绍下面是一些概念是Spring batch框架中的核心概念。什么是JobJob和Step是spring batch执行批处理任务最为核心的两个概念。其中Job是一个封装整个批处理过程的一个概念。Job在spring batch的体系当中只是一个最顶层的一个抽象概念,体现在代码当中则它只是一个最上层的接口,其代码如下:/** * Batch domain object representing a job. Job is an explicit abstraction * representing the configuration of a job specified by a developer. It should * be noted that restart policy is applied to the job as a whole and not to a * step. */public interface Job {  String getName();   boolean isRestartable();   void execute(JobExecution execution);   JobParametersIncrementer getJobParametersIncrementer();   JobParametersValidator getJobParametersValidator(); }在Job这个接口当中定义了五个方法,它的实现类主要有两种类型的job,一个是simplejob,另一个是flowjob。在spring batch当中,job是最顶层的抽象,除job之外我们还有JobInstance以及JobExecution这两个更加底层的抽象。一个job是我们运行的基本单位,它内部由step组成。job本质上可以看成step的一个容器。一个job可以按照指定的逻辑顺序组合step,并提供了我们给所有step设置相同属性的方法,例如一些事件监听,跳过策略。Spring Batch以SimpleJob类的形式提供了Job接口的默认简单实现,它在Job之上创建了一些标准功能。一个使用java config的例子代码如下:@Beanpublic Job footballJob() {    return this.jobBuilderFactory.get("footballJob")                     .start(playerLoad())                     .next(gameLoad())                     .next(playerSummarization())                     .end()                     .build();}这个配置的意思是:首先给这个job起了一个名字叫footballJob,接着指定了这个job的三个step,他们分别由方法,playerLoad,gameLoad, playerSummarization实现。什么是JobInstance我们在上文已经提到了JobInstance,他是Job的更加底层的一个抽象,他的定义如下:public interface JobInstance { /**  * Get unique id for this JobInstance.  * @return instance id  */ public long getInstanceId(); /**  * Get job name.  * @return value of 'id' attribute from <job>  */ public String getJobName(); }他的方法很简单,一个是返回Job的id,另一个是返回Job的名字。JobInstance指的是job运行当中,作业执行过程当中的概念。Instance本就是实例的意思。比如说现在有一个批处理的job,它的功能是在一天结束时执行行一次。我们假定这个批处理job的名字为'EndOfDay'。在这个情况下,那么每天就会有一个逻辑意义上的JobInstance, 而我们必须记录job的每次运行的情况。什么是JobParameters在上文当中我们提到了,同一个job每天运行一次的话,那么每天都有一个jobIntsance,但他们的job定义都是一样的,那么我们怎么来区别一个job的不同jobinstance了。不妨先做个猜想,虽然jobinstance的job定义一样,但是他们有的东西就不一样,例如运行时间。spring batch中提供的用来标识一个jobinstance的东西是:JobParameters。JobParameters对象包含一组用于启动批处理作业的参数,它可以在运行期间用于识别或甚至用作参考数据。我们假设的运行时间,就可以作为一个JobParameters。例如, 我们前面的'EndOfDay'的job现在已经有了两个实例,一个产生于1月1日,另一个产生于1月2日,那么我们就可以定义两个JobParameter对象:一个的参数是01-01, 另一个的参数是01-02。因此,识别一个JobInstance的方法可以定义为:因此,我么可以通过Jobparameter来操作正确的JobInstance什么是JobExecutionJobExecution指的是单次尝试运行一个我们定义好的Job的代码层面的概念。job的一次执行可能以失败也可能成功。只有当执行成功完成时,给定的与执行相对应的JobInstance才也被视为完成。还是以前面描述的EndOfDay的job作为示例,假设第一次运行01-01-2019的JobInstance结果是失败。那么此时如果使用与第一次运行相同的Jobparameter参数(即01-01-2019)作业参数再次运行,那么就会创建一个对应于之前jobInstance的一个新的JobExecution实例,JobInstance仍然只有一个。JobExecution的接口定义如下:public interface JobExecution { /**  * Get unique id for this JobExecution.  * @return execution id  */ public long getExecutionId(); /**  * Get job name.  * @return value of 'id' attribute from <job>  */ public String getJobName();  /**  * Get batch status of this execution.  * @return batch status value.  */ public BatchStatus getBatchStatus(); /**  * Get time execution entered STARTED status.   * @return date (time)  */ public Date getStartTime(); /**  * Get time execution entered end status: COMPLETED, STOPPED, FAILED   * @return date (time)  */ public Date getEndTime(); /**  * Get execution exit status.  * @return exit status.  */ public String getExitStatus(); /**  * Get time execution was created.  * @return date (time)  */ public Date getCreateTime(); /**  * Get time execution was last updated updated.  * @return date (time)  */ public Date getLastUpdatedTime(); /**  * Get job parameters for this execution.  * @return job parameters    */ public Properties getJobParameters(); }每一个方法的注释已经解释的很清楚,这里不再多做解释。只提一下BatchStatus,JobExecution当中提供了一个方法getBatchStatus用于获取一个job某一次特地执行的一个状态。BatchStatus是一个代表job状态的枚举类,其定义如下:public enum BatchStatus {STARTING, STARTED, STOPPING,    STOPPED, FAILED, COMPLETED, ABANDONED }这些属性对于一个job的执行来说是非常关键的信息,并且spring batch会将他们持久到数据库当中. 在使用Spring batch的过程当中spring batch会自动创建一些表用于存储一些job相关的信息,用于存储JobExecution的表为batch_job_execution,下面是一个从数据库当中截图的实例:什么是Step每一个Step对象都封装了批处理作业的一个独立的阶段。事实上,每一个Job本质上都是由一个或多个步骤组成。每一个step包含定义和控制实际批处理所需的所有信息。任何特定的内容都由编写Job的开发人员自行决定。一个step可以非常简单也可以非常复杂。例如,一个step的功能是将文件中的数据加载到数据库中,那么基于现在spring batch的支持则几乎不需要写代码。更复杂的step可能具有复杂的业务逻辑,这些逻辑作为处理的一部分。与Job一样,Step具有与JobExecution类似的StepExecution,如下图所示:什么是StepExecutionStepExecution表示一次执行Step, 每次运行一个Step时都会创建一个新的StepExecution,类似于JobExecution。但是,某个步骤可能由于其之前的步骤失败而无法执行。且仅当Step实际启动时才会创建StepExecution。一次step执行的实例由StepExecution类的对象表示。每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。下面是一个从数据库当中截图的实例:什么是ExecutionContextExecutionContext即每一个StepExecution 的执行环境。它包含一系列的键值对。我们可以用如下代码获取ExecutionContextExecutionContext ecStep = stepExecution.getExecutionContext();ExecutionContext ecJob = jobExecution.getExecutionContext();什么是JobRepositoryJobRepository是一个用于将上述job,step等概念进行持久化的一个类。它同时给Job和Step以及下文会提到的JobLauncher实现提供CRUD操作。首次启动Job时,将从repository中获取JobExecution,并且在执行批处理的过程中,StepExecution和JobExecution将被存储到repository当中。@EnableBatchProcessing注解可以为JobRepository提供自动配置。什么是JobLauncherJobLauncher这个接口的功能非常简单,它是用于启动指定了JobParameters的Job,为什么这里要强调指定了JobParameter,原因其实我们在前面已经提到了,jobparameter和job一起才能组成一次job的执行。下面是代码实例:public interface JobLauncher { public JobExecution run(Job job, JobParameters jobParameters)            throws JobExecutionAlreadyRunningException, JobRestartException,                   JobInstanceAlreadyCompleteException, JobParametersInvalidException;}上面run方法实现的功能是根据传入的job以及jobparamaters从JobRepository获取一个JobExecution并执行Job。什么是Item ReaderItemReader是一个读数据的抽象,它的功能是为每一个Step提供数据输入。当ItemReader以及读完所有数据时,它会返回null来告诉后续操作数据已经读完。Spring Batch为ItemReader提供了非常多的有用的实现类,比如JdbcPagingItemReader,JdbcCursorItemReader等等。ItemReader支持的读入的数据源也是非常丰富的,包括各种类型的数据库,文件,数据流,等等。几乎涵盖了我们的所有场景。下面是一个JdbcPagingItemReader的例子代码:@Beanpublic JdbcPagingItemReader itemReader(DataSource dataSource, PagingQueryProvider queryProvider) {        Map<String, Object> parameterValues = new HashMap<>();        parameterValues.put("status", "NEW");         return new JdbcPagingItemReaderBuilder<CustomerCredit>()                                           .name("creditReader")                                           .dataSource(dataSource)                                           .queryProvider(queryProvider)                                           .parameterValues(parameterValues)                                           .rowMapper(customerCreditMapper())                                           .pageSize(1000)                                           .build();} @Beanpublic SqlPagingQueryProviderFactoryBean queryProvider() {        SqlPagingQueryProviderFactoryBean provider = new SqlPagingQueryProviderFactoryBean();         provider.setSelectClause("select id, name, credit");        provider.setFromClause("from customer");        provider.setWhereClause("where status=:status");        provider.setSortKey("id");         return provider;}JdbcPagingItemReader必须指定一个PagingQueryProvider,负责提供SQL查询语句来按分页返回数据。下面是一个JdbcCursorItemReader的例子代码: private JdbcCursorItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,            String tenant) {         JdbcCursorItemReader<Map<String, Object>> itemReader = new JdbcCursorItemReader<>();        itemReader.setDataSource(dataSource);        itemReader.setSql("sql here");        itemReader.setRowMapper(new RowMapper());        return itemReader;    }什么是Item Writer既然ItemReader是读数据的一个抽象,那么ItemWriter自然就是一个写数据的抽象,它是为每一个step提供数据写出的功能。写的单位是可以配置的,我们可以一次写一条数据,也可以一次写一个chunk的数据,关于chunk下文会有专门的介绍。ItemWriter对于读入的数据是不能做任何操作的。Spring Batch为ItemWriter也提供了非常多的有用的实现类,当然我们也可以去实现自己的writer功能。另外,欢迎关注公众号码猿技术专栏,后台回复“面试宝典”,送你一份面试题宝典!什么是Item ProcessorItemProcessor对项目的业务逻辑处理的一个抽象, 当ItemReader读取到一条记录之后,ItemWriter还未写入这条记录之前,I我们可以借助temProcessor提供一个处理业务逻辑的功能,并对数据进行相应操作。如果我们在ItemProcessor发现一条数据不应该被写入,可以通过返回null来表示。ItemProcessor和ItemReader以及ItemWriter可以非常好的结合在一起工作,他们之间的数据传输也非常方便。我们直接使用即可。chunk 处理流程spring batch提供了让我们按照chunk处理数据的能力,一个chunk的示意图如下:它的意思就和图示的一样,由于我们一次batch的任务可能会有很多的数据读写操作,因此一条一条的处理并向数据库提交的话效率不会很高,因此spring batch提供了chunk这个概念,我们可以设定一个chunk size,spring batch 将一条一条处理数据,但不提交到数据库,只有当处理的数据数量达到chunk size设定的值得时候,才一起去commit.java的实例定义代码如下:在上面这个step里面,chunk size被设为了10,当ItemReader读的数据数量达到10的时候,这一批次的数据就一起被传到itemWriter,同时transaction被提交。skip策略和失败处理一个batch的job的step,可能会处理非常大数量的数据,难免会遇到出错的情况,出错的情况虽出现的概率较小,但是我们不得不考虑这些情况,因为我们做数据迁移最重要的是要保证数据的最终一致性。spring batch当然也考虑到了这种情况,并且为我们提供了相关的技术支持,请看如下bean的配置:我们需要留意这三个方法,分别是skipLimit(),skip(),noSkip(),skipLimit方法的意思是我们可以设定一个我们允许的这个step可以跳过的异常数量,假如我们设定为10,则当这个step运行时,只要出现的异常数目不超过10,整个step都不会fail。注意,若不设定skipLimit,则其默认值是0.skip方法我们可以指定我们可以跳过的异常,因为有些异常的出现,我们是可以忽略的。noSkip方法的意思则是指出现这个异常我们不想跳过,也就是从skip的所以exception当中排除这个exception,从上面的例子来说,也就是跳过所有除FileNotFoundException的exception。那么对于这个step来说,FileNotFoundException就是一个fatal的exception,抛出这个exception的时候step就会直接fail批处理操作指南本部分是一些使用spring batch时的值得注意的点批处理原则在构建批处理解决方案时,应考虑以下关键原则和注意事项。批处理体系结构通常会影响体系结构尽可能简化并避免在单批应用程序中构建复杂的逻辑结构保持数据的处理和存储在物理上靠得很近(换句话说,将数据保存在处理过程中)。最大限度地减少系统资源的使用,尤其是I / O. 在internal memory中执行尽可能多的操作。查看应用程序I / O(分析SQL语句)以确保避免不必要的物理I / O. 特别是,需要寻找以下四个常见缺陷:当数据可以被读取一次并缓存或保存在工作存储中时,读取每个事务的数据。重新读取先前在同一事务中读取数据的事务的数据。导致不必要的表或索引扫描。未在SQL语句的WHERE子句中指定键值。在批处理运行中不要做两次一样的事情。例如,如果需要数据汇总以用于报告目的,则应该(如果可能)在最初处理数据时递增存储的总计,因此您的报告应用程序不必重新处理相同的数据。在批处理应用程序开始时分配足够的内存,以避免在此过程中进行耗时的重新分配。总是假设数据完整性最差。插入适当的检查和记录验证以维护数据完整性。尽可能实施校验和以进行内部验证。例如,对于一个文件里的数据应该有一个数据条数纪录,告诉文件中的记录总数以及关键字段的汇总。在具有真实数据量的类似生产环境中尽早计划和执行压力测试。在大批量系统中,数据备份可能具有挑战性,特别是如果系统以24-7在线的情况运行。数据库备份通常在在线设计中得到很好的处理,但文件备份应该被视为同样重要。如果系统依赖于文件,则文件备份过程不仅应该到位并记录在案,还应定期进行测试。如何默认不启动job在使用java config使用spring batch的job时,如果不做任何配置,项目在启动时就会默认去跑我们定义好的批处理job。那么如何让项目在启动时不自动去跑job呢?spring batch的job会在项目启动时自动run,如果我们不想让他在启动时run的话,可以在application.properties中添加如下属性:spring.batch.job.enabled=false在读数据时内存不够在使用spring batch做数据迁移时,发现在job启动后,执行到一定时间点时就卡在一个地方不动了,且log也不再打印,等待一段时间之后,得到如下错误:红字的信息为:Resource exhaustion event:the JVM was unable to allocate memory from the heap.翻译过来的意思就是项目发出了一个资源耗尽的事件,告诉我们java虚拟机无法再为堆分配内存。另外,欢迎关注公众号码猿技术专栏,后台回复“面试宝典”,送你一份面试题宝典!造成这个错误的原因是: 这个项目里的batch job的reader是一次性拿回了数据库里的所有数据,并没有进行分页,当这个数据量太大时,就会导致内存不够用。解决的办法有两个:调整reader读数据逻辑,按分页读取,但实现上会麻烦一些,且运行效率会下降增大service内存(感谢阅读,希望对你所有帮助)来源:blog.csdn.net/topdeveloperr/article/details/84337956干货分享最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论加个关注不迷路喜欢就点个"在看"呗^_^ 本文始发于微信公众号(IT牧场):批处理框架 Spring Batch 指北
阅读全文
spring框架漏洞扫描工具-springScan 安全工具

spring框架漏洞扫描工具-springScan

每日分享好工具 1、Spring介绍:Spring是一个开源框架,核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成交由Spring来创建对象 。类比Struts 2框架绝大部分的安全漏洞都都是由于OGNL,而自从sping引入SpEL,也引起很多安全漏洞,什么事都是有利即有弊。2、Spring漏洞: Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977) Spring Security OAuth 2.0 – 2.0.9Spring Security OAuth 1.0 – 1.0.5 Spring WebFlow 远程代码执行漏洞(CVE-2017-4971) Spring Web Flow 2.4.0-2.4.4 Spring Data Rest 远程命令执行漏洞(CVE-2017-8046) Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3Spring Boot version < 2.0.0M4Spring Data release trains < Kay-RC3 Spring Messaging 远程命令执行漏洞(CVE-2018-1270) Spring Framework 5.0 -5.0.4Spring Framework 4.3 - 4.3.14 Spring Data Commons 远程命令执行漏洞(CVE-2018-1273) Spring Data Commons 1.13 - 1.13.10Spring Data Commons 2.0 - 2.0.5 3、漏洞概况:1)、Spring Security OAuth是为Spring框架提供安全认证支持的一个模块,主要分为授权服务 Authorization Service.资源服务 Resource Service.这次漏洞主要是由用户使用Whitelabel views来处理错误时,攻击者在被授权的情况下可以通过构造恶意 SpEL表达式来远程执行命令。2)、Spring WebFlow构建于Spring MVC之上,允许实现Web应用程序的“流程”。流程封装了一系列步骤,指导用户执行某些业务任务。 它的最佳位置是具有受控导航功能的有状态Web应用程序,例如购物逻辑,向表单添加确认步骤等。如果我们控制了数据绑定时的field,构造恶意 SpEL表达式来远程执行命令。3)、Spring Data是对数据访问的更高抽象。通过它,开发者进一步从数据层解放出来,更专注于业务逻辑。Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中,path的值被传入setValue,导致执行了恶意SpEL表达式,触发远程命令执行漏洞。4)、spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,用STOMP协议将数据组合成一个文本流,简单来说用sockjs协议发送文本流,sockjs会选择一个合适的通道:websocket(NEW)或ajax(OLD)进与后端通信。由于selector用SpEL表达式编写,并使用StandardEvaluationContext解析(权限太大),造成命令执行漏洞。5)、Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons有一个重要概念:Spring Data Repository抽象。使用Spring Data Repository可以极大地减少数据访问层的代码。当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为SpEL表达式进行注入,攻击者可以注入恶意SpEL表达式以执行任意命令。 4、spring框架多线程漏洞扫描 默认 .springScan.exe -u x.x.x.x 启动扫描 参考:https://zhuanlan.zhihu.com/p/62503952https://blog.csdn.net/csacs/article/details/87951940https://www.cnblogs.com/jinqi520/p/12033860.htmlhttps://github.com/YanMu2020/SpringScan     https://github.com/YanMu2020/SpringScan 本文始发于微信公众号(LemonSec):spring框架漏洞扫描
阅读全文