|
现在只对常读和星标的公众号才展示大图推送,建议大家把“潇湘信安”设为星标,否则可能看不到了!
0x00 前言
公网资产,测试测着,每天都看着哪些服务容易出洞,很多服务测着测着,大半天过去了,最后发现是强认证,有的测着测着,关键位置上开发又做了加固,干了大半天白忙活,我做测试,最后变成测试牵着鼻子走。
要是能像审计代码一样,通过他的实现、回显筛选出脆弱的服务点就好了,就算没后续测试,也能“点到为止”,“跑路”转向下一处位置。
后续,观察到通过代码让服务抛出异常信息回显是很有效的,就能确认到这些服务点鉴权、调用、地址的方式。
通过几个季度的积累,完善了通过“泛解析字符”探测功能业务的场景,大幅缩短业务测试时间成本,所谓的无后续“点到为止”。

树形图

0x01 泛解析服务探测
通过代码让服务抛出异常信息回显的字符,根据服务string
值
string 原字符
string11、string1 相似字符
str1aing、straaing 混淆字符
1aaa、222 垃圾字符
相似字符场景
目录地址,解析特性,回显相同


混淆字符场景
目录地址,回显异常,状态码通常404

探测功能类的回显和其父类回显


垃圾字符
常见为故障排查,无意义字符,看服务怎么回显


泛解析探测功能类实现
以常见的user
类为例,每个具体实现的函数login
、get
函数、upload
函数都归到user
这个类下边


同级功能类,不同权值
上边两处实现都在同个功能类下边,查询都是
Api-Base+/user/getSymbolDetail
Api-Base+ /user/getReportDeal
getReportDeal
鉴权了,需要提供一处token(required)
,这时候getReportDeal
是否也需要提供一处token(required)
?
但getReportDeal
实现只需要一个Name
值,虽然都是在同个父类user
下面,但这不需要token
值。
场景1
一个难啃的公网域名站,啃了两年
业务接入认证,业务只要请求就是401
,需要token
、返回用户未登录


能看到porjectApi/zuul
有一处类实现,但zuul
下边的实现跟上任何地址,一律返回401
Link到几个JS

无对象参数,几处封装的函数z({url:"地址"}
直接喷洒到已有的父类: projectapi/zuul
、projectapi
projectapi/zuul+getfunction 401
projectapi+getfunction 401
贴图,需要先用 泛解析字符获取到功能类实际地址




通过泛解析获取到XXxmobile
这个类是在ProjectApi
后边实现
无需认证的功能类
接着看他的子类实现

基本都和article
这个子类实现有关,但这个子类上边测试过他的getfunction
,是带鉴权的,(需要required token
)


参数t
值,简单测试,1、11、111、1111


通过泛解析获取他父类xmobile
的地址、然后探测xmobile
的功能类dept
实现,dept
的实现不需要认证,就得到一处未授权的功能未授权查询
场景2
陆续扩展



混淆的data: t
怎么去处理这个t
值?
这子类opi
实现有一处pending
值,跟着这处pending
值

params:{userId:L(“uid”),pendingStatus:0,page:0,limit:20,type:”all”,app:”na186″}

配合user/tree/1111
获取的userId
值

场景3
功能类的键值混淆
做泛解析、分析子类权限最后还是要未授权查询,如果一些键值做了混淆,那应该怎么处理?



但找不到t
值,提供任何参数都是返回200
,同时后边得跟一处items
,这处items
是常量还是字符串?


通过泛解析处理掉这处值,现在只要跟到t
值就能未授权
跟他的封装函数dt
,跟到一处传参



场景1:在大类已知的情况下边,探测功能类地址,如下图
泛解析探测布尔型回显
场景是公网一处域名,已获取到父类地址/project/api


父类回显
但通过泛解析字符处理,会得到
project/api/pdf/extract_table 401 response "not login"
project/api/pd1f/extract_table 401 response "not login"
project/api1/pdf/extract_table 404 response "404"
在project/api
任意类实现,都需要认证,无认证返回401
,login
在project
任意实现,不存在返回404



往上走一层测试,看看
project/pdf/extract_table 401 response "not login"
project/pd1f/extract_table 404 response "404"
project1/pdf/extract_table 404 response "404"
上面已经通过泛解析字符得到在project
任意实现,不存在返回404
,这里project/pd1f
返回404
,project/pdf
返回401
,两处泛解析字符,异常的回显就拿到实际的
实现地址pdf-extract
功能是通过/project+"/pdf/extract_table"
调用



场景2:在不知道大类的情况,探测功能类地址
是公网一处域名,前端异常

每次加载都会又有一次初始化,请求service/dic/initDetailData
,站点能看到的唯一调用实现
功能类地址
JS打包的地址里边有一处upload
的地址,但需要确认他的父类地址,如下图,这里做了加固,y.a
的值跟不到

由于看到了站点初始化service/dic/
这处是有调用实现的,拆分出两处测试点
service+upload的实现类
service/dic/+upload的实现类


两处都是500
,布尔型回显,仍然无法确定upload
实现的父类地址
从调用看,下边的DOMAIN_URL
值就是之前加固的父类地址y.a

相邻功能类回显

还是把要确认login
的实现类拼接到已有的实现上
service+login的实现类
service/dic/+login的实现类

302
跳转,通过泛解析字符进一步确认地址,login11
、log11in


回显的404
确认login
类实现在service
后调用,要确认的父类地址在这为app-service
,upload
和login
都是他的实现


泛解析探测目录路径
挑出来一处Java配tomcat场景,无js模块打包,只有必要的login
加载,然后,不管怎么测试,他都会跳到watermark/login
在目录来说,watermark/login
算路由,但跟到JS里又发现后面有get
、update
类实现


login在这处算路由地址还是功能实现的父类?
如果是路由地址,测试方向最多是跟上字典fuzz,没结果这条路线就可以断了,如果是功能父类,那就按功能实现的路线测试。



但他仍然可以按功能实现的路线测试



通过泛解析,看到login
这个父类,实现出现异常会返回500
路径跳转
加入常见的路径跳转,是否能看到跳转可控呢?

大致能得到跳转不可控,login
类对跳转按泛解析处理结果为异常,跳转可控会回到上边写死的路由,也就是/watermark/login
,后续跳转测试路线可以断了。
同样的路径跳转,login
类会回到对应跳转路由,像下边的案例


加入路径跳转


跳转可控,后续测试再跳一层,有组件未授权

功能路径
挑出来一处插件性场景,探测已有poc的路径,观察泛解析字符路径跳转,找poc插件位置是否存在,探测路线是否可行,缩短后续测试成本



泛解析字符的结果看到,返回包的redirect_to
参数未实际校验,单纯拼接,后续通过路径跳转探测插件位置这条路线可以断了。
再挑出一处springboot
的场景,文档插件

很明显的一处泛解析,功能地址在API,其他的api-docs
这类都是泛解析字符的结果,缩短测试成本



0x02 业务的挂钩场景
路由场景v2
去年业务未授权专题写了一版路由规则,基于#
的测试,观察到一些重写的、遗漏的规则
挑出一处和路由相关的案例,资产是公网一处IP

观察到流量包,加载了打包的JS文件

实际上,要看前端的话,他是一处空白

观察到是index
文件携带的link,引出的打包JS文件,那这儿就是入口文件

根据他的路由写两处#/
业务相关场景,index.html#/
、index.html/#/
跟上打包文件的路径


常用路由字符
page
pages
login
home
home/index
index.html


集成web路由
扩展路由规则的一些场景:资产是一处公网域名地址,强认证,任意路由路径都会跳转到account
,而account
是重写的,没有这个类,虽然路由上不可控,但拿到了JS打包的文件

这里有一处列表te
很明显,plus
、openplatform
从名字看都是携带功能的地址,跟过来

泛解析处理路由
泛解析字符探测一下


是一处实打实的集成业务地址,不是后端的功能大类,根据他的路由写两处#/
业务相关场景:openplatform#/
、openplatform/#

新title
、测试JS里边携带的功能路径

通过泛解析,拿到了集成地址,再通过路由规则发现了业务未授权,绕过加固做的强认证,分析薄弱的环节
查询类场景
公网域名功能看的见、摸得着的主要还是查询类,打包的JS文件携带了很多和业务相关的类,按业务回显,回显通常有三种
参数缺失性字段
布尔型字段
认证性字段
参数缺失型字段
来看一处和id
值实现相关的实现,通过泛解析提取到大类地址后,确认了monitor
类实现grid
的位置,查询返回"ProviceCode值不能为空"

但跟上ProviceCode
一处值后,依旧返回"ProviceCode值不能为空"
,说明required
还需要其他参数

混淆的data: t
怎么去处理这个t
值?
跟着缺失的twoDigitProvinceCode
值和fourDigitCityCode
封装在一个变量v
里面,下图画框处发现两者有组合调用

构造后发现,不回显字段缺失了,回显为布尔型,Data
数据没带过来,需要fourDigitCityCode
具体值,恰好数据包有get
实现和fourDigitCityCode
相关

查询成功,DATA
列表携带数据返回
布尔型字段
开发修复后,再次看,异常的回显统一了,类似"服务繁忙,查询异常、502之类"

但仅从回显看,更像是把和id
相关的类,这里的实现做了修复;因为回显还携带"DATA"
接受数据字段,测试观察到了和他对应查询调用成功

相邻的父类地址
common
和grid
的父类monitor
同目录,common
的实现有数据

往下跟,也是"RSP_DESC":"系统未知错误"
, 布尔型,不再返回参数缺失。

上图,529
处有一实现携带了?proviceCode
值,看着是GET
型,跟着看他的实现

拼接上缺失的值

GET型虽然统一了认证,但并不是完全的接入权限,通过其他类的实现,依旧能绕过到相关业务。
那么,POST型应该怎么来处理呢?
上边,monitor
父类做了限制,通过和他相邻的common
类来GET型查询
common类的POST型如何处理
common
下边的query
实现



混淆的data: a
怎么去处理这个a
值?
因为是business
的实现,所以得先跟business
,跟过来是两处键值key1:sendBusiness
和key2:sendBusiness2

顺着sendBusiness()
和sendBusiness2()
往上走

简单构造发包测试
{
"sendInterface":"1",
"staffName":"1",
"staffId":"11",
"provinceCode":"51",
"userId":"admin",
"businessList":"11"
}


强认证字段
强认证字段是识别度很低的回显,无论输入什么,都提示需要accesstoken
、需要token
、未登录。

既返回接口调用成功
,又返回未能获取到accessToken
,而且状态码也是200
,很难确定功能类需要的required
,先通过泛解析字符,获取不同的回显异常


通过两处泛解析字符,analysis
和下边的实现类已经完全接入认证。
跟过来、或者往上跳,跟到一处policy
父类,返回403


通过泛解析字符,返回包回显,policy
这处类应该是可以后续测试的,和上边analysis
类相隔开了。
强认证回显处理比较棘手,大多数功能类实现接入认证,通过泛解析字符确认相关类的权限情况后,后续测试路线可以断了,节省后续测试时间成本。
编辑器场景
打包的JS文件里调用的编辑器指纹,通常得归到业务指纹里边,但这里单独列出来,编辑器他通常是插件,大多数编辑器都是完善的,无需借助web,集成过来就能用。
看JS打包的相关函数
相关函数
资产是一处公网域名地址,跟到JS里边,preView
、View
、pdf
、upload
相关的函数


常规的文件操作,读取、删除、上传

目录地址
资产是一处公网IP地址


存储桶场景
资源站点、展示功能居多,业务常涉及文章、图片、素材等功能,传参在文章id
值、图片存储位置



异常页场景
中间件正常,服务异常
公网域名、IP常出现地址不通,无前端的问题,这大概是最棘手、最常见的情况
青一色的500
,nginx有回显,服务异常、中间件正常(可能挂了、访问方式不对、限制)


nginx异常页的返回,状态码200
,服务有问题(可能是端口方式),中间件正常


更改端口,401
返回,nginx返回该401可能和web鉴权相关,走字典,探测相关资源



中间件挂了,服务挂了
nginx异常页的返回,状态码502
,nginx挂了,服务也随nginx挂了


业务指纹场景

三无站点指纹
验证码处不可用,”无功能、无展示、无数据” 三无,观察站点的指纹,看着别扭,单独的域名、也没看到目录,直接把域名作为入口文件展示
目录测试,找他的目录业务

看着很有问题,入口文件没做泛解析字符跳转,测试出一处二级业务


功能插件指纹
访问是一处500

多f5
几次,就会跳到开发重写的路由project/login

再过了一会,返回一处springboot
的error
,应该是404
,但这404
就不对("error#/"
),是符合#/
业务规则的,再次替换,到开发重写的路由login#/


验证相同,测试JS里边携带的功能路径


通过springboot
的路由异常,观察到开发重写的路由login#/
,后续功能路径测试。
域名指纹
业务域名和他资源域名


images域名只存放业务的资源文件,但开发运维到后期,观察到业务共用的情况
估计别的厂商测过,开发做过加固,关闭服务或者限制入口,比如下面的shzx
子类


把业务喷洒到他资源域名,观察正常

对应shzx
子类功能测试

实际是同套调用,用好可以处理一些加固站点。
JS文件指纹
多轮测试的站点,无JS文件打包,无登录地址、无前端展示,也是妥妥的三无站点,但访问有业务的JS文件加载,站点有统一的异常页面,跟到他的JS里边,有定义到列表。

逐个访问,观察未授权页


关注我们
还在等什么?赶紧点击下方名片开始学习吧
知 识 星 球
推 荐 阅 读


