引言
自己学习Java安全也有半年了,但是学了又好像没有学还是停留在复现漏洞用脚本的水平,自己也很困惑,就找点文章看看。
明确观点
问题
- 怕麻烦,觉得环境搭建困难,操作麻烦
- 看见大量代码,无处下手
- 机械式复现,无论是动手调试,还是打payload,都是一种机械复现
- 觉得项目很大,高手不知道已经挖过多学少遍了,早没了
- 沉迷学习,缺少实践(大忌)
必须改掉这些问题,树立以下核心观念:
- 挖洞有手就行,不一定需要很高超的技巧
- 挖洞需要学习基础,但不能陷入到无限理论中
- 挖洞需要的不是天赋,需要的是专注、勇气、自信和努力
为什么复现很多却挖不倒洞
漏洞复现和漏洞挖掘有着本质的区别,当复现漏洞的时候,已经有很多参考:
- xxx组件存在xxx漏洞这个信息提示
- 可能有了一些泄漏部分的payload截图
- 可能有了完整的复现文章
在这些前提下,你的目标会变得很明确,随着条件的完善复现的难度越来越低,当已经有完整复现文章的时候,你甚至不需要自己去思考跟着操作即可。那么你在复现的时候如果不进行反思和归纳就会沦为F8工具人,整个流程下来你只是知道了这回事。如果你长期进行漏洞复现,然后第一次接到一个漏洞挖掘项目的时候会发生什么?你失去了前面漏洞复现时候所说的几个前提条件,失去了这些条件给你框定的明确路径后,由于你从来没有真正的自我决策过所以你陷入了无法决策的思维恐慌中。在一个真正挖掘项目里,你需要独立的去规划自己的工作流程,对每一次测试方向做决策,如果你缺少这种能力就应该从复现工作中进行总结归纳锻炼自己这种思维。
漏洞利用的逻辑
先来看几个概念:
- 可控输入:也就是source点(污点分析)
- 目标输出:sink点
- 程序机制:就是处于source与sink点之间对整个数据进行各种变化
- trick:一些技巧,例如绕沙箱,绕过过滤,溢出到执行命令等
一个漏洞利用链如下:
这个图里输入1是用户侧可控的输入,输出3可以认为是最终的命令执行函数,那么中间的输出1可能是写配置文件,输出2可能是发送请求到别的端口,通过机制4和机制5将这些中间输出进行转化与搬运,最终把几个点串联起来做到输入1到输出3的命令执行。上面这个图主要还是关注一个数据传播和转化,那么再加上各个流程中可能会用到的trick就最终得到了一个完整的利用
技能
有了整体的思路后,我们需要对漏洞进行分类
漏洞类型 | 分类标签 | 效果 |
---|---|---|
SQL注入 | 代码执行 | 执行部分SQL语句,可能造成命令执行、数据获取、读写文件 |
XSS | 代码执行 | 有限或无限的Javascript代码执行,可能获取cookie凭证 |
命令注入 | 命令执行 | 直接拼接命令执行系统命令 |
反序列化 | 代码执行 | 有限或无限的执行java代码,或根据gadget的不同执行各类操作,比如读写文件、发起请求等 |
SSRF | 网络请求 | 有限制或无限制的发起各类请求转发,将部分可控数据通过网络进行转发 |
加密缺陷 | 伪造 | 加解密的问题可以统一归为各类伪造,包括伪造凭证、数据包签名等 |
任意读 | 敏感信息获取 | 读取各类敏感信息 |
任意写 | 写文件 | 写各种文件,通常配合系统机制或者框架机制,任意写文件大概率可以串代码执行或者命令执行 |
未授权访问 | 权限校验缺失 | 权限校验缺失,可以访问各类需要鉴权的接口 |
内存溢出 | 代码执行 | 内存溢出后如果利用成功通常可以造成任意代码执行、改变程序判断条件 |
漏洞类型可以参考Owasp所有的类型,每一个漏洞能达到的效果,都要熟知,列举完后,就是一些组合:
- 未授权访问+命令执行
- 未授权访问+反序列化
- 未授权访问+任意写+系统机制(PHP的webshell或者Linux的crontab)
- 未授权访问+SSRF+本地进程未授权+命令注入
- 加密缺陷可构造凭证+后台命令执行功能
- 未授权访问+SSRF+内存溢出
还有一些特定场景的连招:
- XSS+electron
- 未授权+fastjson
- 人工点击+XSS+electron
当然不止这些combo,你能想象到的组合都可以试一试,一般来说要实现RCE,最后一个终结技都是要跟上代码执行或者命令执行或者是写文件的漏洞类别,而在终结技前面的漏洞类别通常选各类未授权以及各类数据搬运如SSRF,甚至于XXE也能作为SSRF来用。这也是为什么我们需要把每种漏洞类型所能造成的效果都罗列一下,这种罗列有助于组合combo。(一旦你思路打开,受限制的反序列化也可以是一种SSRF) 在我们罗列各类漏洞类型和他们所能造成的影响时,我们不应该过多的关注自己是否实际掌握具体的利用方式,比如学web的通常不懂内存溢出,那么他们可能就不会考虑内存溢出作为其中一个RCE的终结技。但实际上,你就算是不会,你在寻找整个利用链路的时候都应该把它考虑进去,如果链路能走通再考虑实际的利用。
决策
有了前面的铺垫,拿到一个全新项目就可以做规划:
- 搜集信息,对功能和三方组件进行了解,大致对可能的combo有个预测
- 根据预测的combo搜寻对应的sink,找出几个可能的独立的漏洞片段
- 尝试进行简单的片段串联,如果能够快速串联那么很有可能就已经RCE了
- 如果几个漏洞片段无法串联,那么需要深入学习整个程序的内在运作机制包括所在系统的一些机制
- 利用各种机制曲线的将几个漏洞片段串联到一起
- 串联完毕后,深入到解决具体的细节问题,比如利用一些trick来绕过过滤、穿透沙箱等
- 期间可以配合黑盒测试的一些方式来进行调试,避免纯白盒的单步跟进,最终完成RCE
漏洞复现关注点
我们学习各种漏洞复现技巧的时候,我们应该关注什么?根据我前面说的,我们应该重点看这个文章里运用了哪些技巧,比如如何绕过过滤、用了哪些偏门gadget。其次关注这个产品、这个组件它的整体框架逻辑是什么样的,他有哪些有趣的功能机制是可以拿来串联链。我们可以忽略什么?繁琐的各种函数跟进,根本毫无意义,随便看看就行了,除非你也专门研究这个产品的0day挖掘那么你可以细致的看一看,如果你想用它来挖别的产品那么你可以直接忽略掉很多没有用的函数跟进,只看那些对数据有一定复杂过滤操作的典型函数就行了。
标签:SSRF,学习,漏洞,复现,挖掘,授权,执行,代码执行 From: https://www.cnblogs.com/gk0d/p/16819409.html