如何高效全面的提升渗透测试的小思考
思考的方向
在面试的时候,经常会有一个问题,如果给你一个登录框的场景,你会怎么去做渗透测试,其实典型漏洞无非就那几种,例如sql注入、弱口令、验证码机制失效、错误的提示不够模糊,导致用户名可爆破、对cookie的校验过于随意,随便自己伪造,或者像sso那种场景,身份授权存在缺陷等等,更多的就是带上注册或者忘记密码的功能,但是倒腾来倒腾去也就这些
但是如果现在是一整个网站,一整个后台,一个快速高效还尽可能全面的渗透测试模型应该是什么样的呢
准备工作
首先,应该识别站点框架,语言,不同框架和不同语言的站点虽然在用户体验上其实都大差不差,但是他们在程序的角度上看都有特殊性,了解他们会让你在后续发现漏洞时,能更好更快的利用上,另一方面则是nday
其次,是数据包的筛选,我们在请求网站的时候会请求大量的数据包,这些数据包有js、前端资源、检查登录状态、检查公告甚至还有第三方探针的流量,所以我们要筛选过滤,尽可能的关注“正常流程下”的数据包,尽可能少的让没用的数据包出现在某个执行流程中间,这样会分散你的注意力,干扰你理解一个功能点背后的执行逻辑
针对SwitchyOmega这类软件,我有两种推荐
- 代理所有,但是手动设置baidu.com等网站不走代理,这个需要时间的积累,总有一天你的bp不会有那种乱七八糟的流量
- 设置自动代理的场景,只代理指定的域名,这样有个问题是,如果调用第三方的接口,流程上就少了这部分的内容
同时,在Burpsuite上,把js、svg、mp4还有图片等全过滤隐藏掉,现在被动的去发现js里敏感信息的工具一抓一大把,如果不是主动审计或者主动替换js内容绕过前端,个人认为完全没必要去看这些,关注执行流程中数据包本身即可
做完上面这些后,就可以来专心看数据包了,前段时间我写了一个自动保存所有带参数的数据包,但是实际使用体验下来,最多做个留痕的操作,不会对我渗透测试有任何的帮助,主要有以下两点原因
- 只关注带参数的数据包,没上下文的关联,也只能发现top10的漏洞
- 有的接口在设计的时候就存在允许不带参数的情况,例如不带参数请求自己的信息,带?id=xxxx则请求别人的信息,如果过于依赖自己请求后带参数的数据包,肯定会漏掉,因为这类软件肯定要有去重的功能,而有的接口会在请求的时候带上时间戳,参数名不唯一,只能用下面这种方法实现这样就必然导致匹配过滤
1
2
3# 解析URL地址
parsed_url = urlparse(flow.request.url)
base_url = f"{parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path}"parsed_url.path
的时候,带参数的同个接口会被过滤
另外,红队更关心可利用的漏洞,但渗透测试更关心风险,大部分接口会展示用户明文的信息,这是存在风险的,而且,通常/list或者/getinfo这类接口也会带有一些其他越权接口所需要的accessid
,这也是决定了你能不能造成大批量、大范围影响的关键因素,毕竟如果一个值32位随机生成还带数字英文的情况下,哪怕存在越权你也无法遍历
渗透阶段
准备阶段的任务都完成之后,接下来就可以开始渗透了
首先,这个网站是用来做什么的,这点一定要清楚,因为这决定了你测试的深度
我单纯文字想的话,能直接想到的常规的测试内容也就:
- 有输入框的地方
- SQL注入
- XSS
- XXE
- 风控检测绕过
- 错误的数值
- 文件上传点
- 任意文件上传
- 上传跨目录
- 请求数据
- 越权
- 未授权
- JS信息泄漏/隐藏接口
- 文件下载/读取
- 任意文件下载
像命令执行这类就不一一赘述了,除这些外,逻辑漏洞的发现则完全不同了,逻辑漏洞是逻辑上的缺陷,存在被绕过或者不存在限制被恶意利用的情况,一般情况下,你对执行流程的熟悉程度会决定你发现的能力
例如,这是我在挖正常下单功能的逻辑漏洞的时候,脑海中的执行流程
你清楚了执行流程,你就会知道哪里的乱序操作会最大化收益,哪里可能存在绕过,存在限制不全,这一切都取决于你是否了解到了每一个流程,以及顺序
所以准备工作的内容,就是用来提升数据包的可读性
结尾
这篇文章也算是庆祝这周达成了提交100个漏洞的里程了,所以才有这番思考,想了一下漏洞挖掘的思路和之前的比有哪些改进了