未授权服务加固与泛解析字符绕过

admin 2025年4月23日22:17:46未授权服务加固与泛解析字符绕过已关闭评论1 views字数 6180阅读20分36秒阅读模式

前言

24年厂商把测试范围全部划到公网资产、IP

顿时压力暴增,公网资产已经23年已经测得七七八八了,未授权漏洞都少的可怜,开发作加固都做了好几轮。

公网资产,测试测着,每天都看着哪些服务容易出洞

很多服务测着测着,大半天过去了,最后发现是强认证,有的测着测着,关键位置上开发做了加固。

干了大半天白忙活,我做测试,最后变成测试牵着鼻子走。

要是能像审计代码一样,通过他的实现、回显筛选出脆弱的服务点就好了。就算没后续测试,也能点到为止

"跑路"转向下一处位置。

后续,观察到通过代码让服务抛出异常信息回显是很有效的,就能确认到这些服务点鉴权、调用、地址的方式。

通过几个季度的积累,完善了通过"泛解析字符"探测功能业务的场景,大幅缩短业务测试时间成本,所谓的无后续点到为止

未授权服务加固与泛解析字符绕过

树形图

未授权服务加固与泛解析字符绕过

泛解析服务探测

(案例涉及的场景均已修复,由于项目原因,严重厚码;场景更多面向服务功能的实现,以实用为主,请慢食用)

泛解析字符

通过代码让服务抛出异常信息回显的字符,根据服务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,跟到一处传参

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

在大类已知的情况下边,探测功能类地址,如下图,

泛解析探测布尔型回显

场景是公网一处域名,已获取到父类地址/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 这类都是泛解析字符的结果,缩短测试成本

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

业务的挂钩场景

路由场景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型如何处理

comon下边的query实现

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

混淆的 data: t

怎么去处理这个t值?

因为是business的实现,所以得先跟business,跟过来是两处键值key1:sendBusiness和key2:sendBusiness2

未授权服务加固与泛解析字符绕过

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

未授权服务加固与泛解析字符绕过

简单构造发包测试

{
"sendInterface":"1",
"staffName":"1",
"staffId":"11",
"provinceCode":"51",
"userId":"admin",
"businessList":"11"
}

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

强认证字段

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

未授权服务加固与泛解析字符绕过

既返回调用成功,又返回未获取Token,而且状态码也是200

很难确定功能类需要的required,先通过泛解析字符,获取不同的回显异常

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

通过两处泛解析字符,analysis和下边的实现类已经完全接入认证。

跟过来、或者往上跳

跟到一处policy父类,返回403

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

通过泛解析字符,返回包回显,policy这处类应该是可以后续测试的,和上边analysis类相隔开了。

强认证回显处理比较棘手,大多数功能类实现接入认证,通过泛解析字符确认相关类的权限情况后,后续测试路线可以断了,节省后续测试时间成本。

编辑器场景

打包的JS文件里调用的编辑器指纹,通常得归到业务指纹里边,但这里单独列出来,编辑器他通常是插件,大多数编辑器都是完善的,无需借助web,集成过来就能用。

指纹类发现,参考23年的https://forum.butian.net/share/2639

看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里边,有定义到列表

未授权服务加固与泛解析字符绕过

逐个访问,观察未授权页

未授权服务加固与泛解析字符绕过

未授权服务加固与泛解析字符绕过

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月23日22:17:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   未授权服务加固与泛解析字符绕过https://cn-sec.com/archives/3992501.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.