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

声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。


现在只对常读和星标的公众号才展示大图推送,建议大家把潇湘信安设为星标否则可能看不到了


0x00 前言

24年厂商把测试范围全部划到公网资产、IP。顿时压力暴增,公网资产已经23年已经测得七七八八了,未授权漏洞都少的可怜,开发做加固都做了好几轮。

公网资产,测试测着,每天都看着哪些服务容易出洞,很多服务测着测着,大半天过去了,最后发现是强认证,有的测着测着,关键位置上开发又做了加固,干了大半天白忙活,我做测试,最后变成测试牵着鼻子走。

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

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

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

树形图


0x01 泛解析服务探测

泛解析字符

通过代码让服务抛出异常信息回显的字符,根据服务string

string 原字符string11、string1 相似字符str1aing、straaing 混淆字符1aaa222 垃圾字符


相似字符场景

目录地址,解析特性,回显相同


混淆字符场景

目录地址,回显异常,状态码通常404


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


垃圾字符

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


泛解析探测功能类实现

以常见的user类为例,每个具体实现的函数loginget函数、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 401projectapi+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任意类实现,都需要认证,无认证返回401login

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返回404project/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跳转,通过泛解析字符进一步确认地址,login11log11in 


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


泛解析探测目录路径

挑出来一处Java配tomcat场景,无js模块打包,只有必要的login加载,然后,不管怎么测试,他都会跳到watermark/login

在目录来说,watermark/login算路由,但跟到JS里又发现后面有getupdate类实现


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/#/ 跟上打包文件的路径


常用路由字符

pagepages loginhomehome/indexindex.html

集成web路由

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


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


泛解析处理路由

泛解析字符探测一下


是一处实打实的集成业务地址,不是后端的功能大类,根据他的路由写两处#/业务相关场景: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"接受数据字段,测试观察到了和他对应查询调用成功


相邻的父类地址

commongrid的父类monitor同目录,common的实现有数据


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


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


拼接上缺失的值


GET型虽然统一了认证,但并不是完全的接入权限,通过其他类的实现,依旧能绕过到相关业务。

那么,POST型应该怎么来处理呢?

上边,monitor父类做了限制,通过和他相邻的common类来GET型查询

common类的POST型如何处理

common下边的query实现


混淆的data: a


怎么去处理这个a值?

因为是business的实现,所以得先跟business,跟过来是两处键值key1:sendBusinesskey2: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,集成过来就能用。


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

看JS打包的相关函数

相关函数

资产是一处公网域名地址,跟到JS里边,preViewViewpdfupload相关的函数


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


目录地址

资产是一处公网IP地址


存储桶场景

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


异常页场景

中间件正常,服务异常

公网域名、IP常出现地址不通,无前端的问题,这大概是最棘手、最常见的情况

青一色的500,nginx有回显,服务异常、中间件正常(可能挂了、访问方式不对、限制)


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


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


中间件挂了,服务挂了

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


业务指纹场景


三无站点指纹

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

目录测试,找他的目录业务


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


功能插件指纹

访问是一处500


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


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


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


通过springboot的路由异常,观察到开发重写的路由login#/,后续功能路径测试。

域名指纹

业务域名和他资源域名


images域名只存放业务的资源文件,但开发运维到后期,观察到业务共用的情况

估计别的厂商测过,开发做过加固,关闭服务或者限制入口,比如下面的shzx子类


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


对应shzx子类功能测试


实际是同套调用,用好可以处理一些加固站点。

JS文件指纹

多轮测试的站点,无JS文件打包,无登录地址、无前端展示,也是妥妥的三无站点,但访问有业务的JS文件加载,站点有统一的异常页面,跟到他的JS里边,有定义到列表。


逐个访问,观察未授权页


关注我们

 还在等什么?赶紧点击下方名片开始学习吧 



知 识 星 球



星球已过800人,暂不再发放优惠券,如还有需要的师傅可加我VXS_3had0w等你一起来学习…!


推 荐 阅 读





评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注