博客

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

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


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


    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等你一起来学习…!


    推 荐 阅 读





  • 肥羊AllInOne绝配!可视化IPTV直播源格式化神器来了

    肥羊AllInOne绝配!可视化IPTV直播源格式化神器来了

    兄弟们,最近是不是总被家里老人吐槽电视直播卡顿?刚找到的源没两天就失效?今天二冰
    给大家安利一个能彻底解决直播源维护难题的神器——allinone_format!搭配肥羊AllInOne
    使用,能像搭积木一样自定义央视、卫视、4K等频道分组,手机电视都能流畅观看!

    项目简介

    allinone_format是专为肥羊AllInOne设计的直播源聚合工具(项目地
    址:https://hub.docker.com/r/yuexuangu/allinone_format)。它能将AllInOne里上千个直播源自动归类重组,生成带分类标签的m3u/txt订阅列表,支持Kodi、PotPlayer等主流播放器。

    五大核心优势

    1.可视化配置:网页端直接拖拽调整频道顺序,小白也能秒上手2.灵活分组:支持删除4K/8K等不常用分组,保留「央视+卫视+本地台」黄金组合3.多格式支持:同时生成m3u普通版、精简版和txt三种格式订阅4.智能跳转:自动添加jump跳转参数,解决部分地区运营商屏蔽问题5.源类型过滤:可单独启用ysptp/itv/tptv等不同线路源

    一键部署教程

    打开Dockge面板 -> 创建堆栈 -> 设置堆栈名称 -> 粘贴compose代码 -> 30秒启动成功!

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    version: '3'services: allinone_format: image: yuexuangu/allinone_format:latest container_name: allinone_format restart: unless-stopped pull_policy: always network_mode: host # openwrt 等系统可能需要此参数 ports: - 35456:35456 volumes: - /etc/allinone_format:/app/config

    使用全流程演示

    1.访问http://NASIP:35456进入控制台2.在「源类型」勾选需要启用的直播线路(默认全选效果最佳)3.拖拽「分组管理」调整频道顺序,建议把「央视频道」置顶4.保存配置后,通过订阅链接访问:

    m3u普通版:http://NASIP:35456/m3utxt精简版:http://NASIP:35456/txt

    Image

    避坑指南

    开启「启用跳转」可解决移动网络屏蔽问题删除config目录下的config.json可重置配置建议配合肥羊AllInOne的自动更新功能,实现7×24小时稳定播放

    总结推荐

    实测在浙江移动宽带下,央视13套直播秒开无缓冲。配合电视端安装TiviMate播放器,老人
    用遥控器就能直接选台。还在为直播源失效头疼的兄弟,这套组合拳绝对值得一试!

    觉得有用的兄弟欢迎在评论区交流使用心得,如果对你有帮助请点赞收藏支持!

    最后,奉上我的超级无敌至尊docker库,二冰平时玩过的docker都整理到了这个仓库中了,
    一直在更新中,希望有github账号的兄弟能去给点个star,不知道玩啥的,都去这里面找,
    都给你们分好类了 仓库链接:
    https://github.com/TWO-ICE/Awesome-NAS-Docker

  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!