渗透测测之“list”查询页面利用技巧

前言

近期在处理接口越权漏洞的问题,在前期漏洞测试、调研的时候发现部分“list”的查询功能的越权漏洞可通过一些特殊技巧来获取更多的数据、扩大漏洞影响。

0x01 漏洞复现

打码比较严重,请见谅。

首先访问接口发现可越权获取数据。OK,今日KPI稳了。

看着群里大佬又再聊在上海哪哪哪买了房子,不禁眼睛一酸。又重新审视了下这个漏洞,好像只有10条,怎么扩大下漏洞危害呢?

仔细看了下数据包,一个total字段告诉我并不简单。

开始考虑“list”页面的Fuzz手段。

Fuzz的通用手段,那就是猜参数了,响应包中的字段可能就是参数,那就补上试试。

发现响应包中存在id字段,通过添加参数成功获取到对应的数据。

但是有个问题,假如ID是UUID格式,无法遍历,那这样的话影响并没有变大。

继续看

发现数据包中存在pages字段,看这数字大概率是这个接口功能设计时如下:

  1. 若没有参数,默认拉取后面的xx条数据
  2. 若有参数,根据参数查询

没毛病,可通过多种途径获取全量数据,明天的KPI也稳了。

0x02 举一反三

通过上面的例子思考了下“list”这种页面的套路,举一反三。

在日常中做Django开发做分页的时候,一般分为两种:

  • 简单分页器,也就是常见的控制page和pageSize等;
  • 偏移分页器,也就是控制limit、offset等;

2.1 页面相关参数

1
pages、pageNo、pageNum、page_num、size、length、total、totalRowNum、totalPage、page_size、pageSize、pageCount、pageIndex、pageSizestartIndex 、limitSize、prePage、nextPage、isFirstPage、isLastPage、currentPage、hasPreviousPage、hasNextPage、navigatePages、navigatepageNums、navigateFirstPage、navigateLastPage

具体形式可常规id=1类型也可json类型,根据实际情况变通。

1
{"pages":2, "pageNo":2, "pageNum":20, "page_num":20, "size":20, "length":20, "total":100, "totalRowNum":100, "totalPage":5, "page_size":2, "pageSize":2, "pageCount":20, "pageIndex":2, "pageSizestartIndex":2, "prePage":2, "nextPage":3, "isFirstPage":false, "isLastPage":false, "currentPage":2, "hasPreviousPage":true, "hasNextPage":true, "navigatePages":[2,3], "navigatepageNums":[2,3], "navigateFirstPage":2, "navigateLastPage":10}

2.2 偏移相关参数

1
limitlimitSize、startRow、endRow、currentIndex、offSet

具体形式

1
{"limit":10, "limitSize":20, "startRow":2, "endRow":5, "currentIndex":2, "offSet":5}

2.3 ID相关参数

1
byId、byid、by_id、byOrderId、ById、ByUserId、idnumber

具体形式

1
2
3
4
常规形式:
byId=1、byid=1、by_id=1、byOrderId=1、ById=1、ByUserId=1、id=1、number=1
Json形式:
{"byId":1, "byid":1, "by_id":1, "byOrderId":1, "ById":1, "ByUserId":1, "id":1, "number":1}

2.4 其他

1
apiVersion、version、channel、type

具体形式

1
apiVersion=1.0.0、version=1.0、channel=H5、type=wx

以上只是列举一些常用的,自己可私下收集作为字典使用。

0x03 获取方法

说完参数,那说下接口的问题。如果接口找不到,那参数自然也是没啥用武之地了。

我这里列举下常见的,大家自行收集。

3.1 通过第三方应用

  • druid
  • Spring boot actuator

3.2 通过API文档

  • swagger-ui
  • doc.html
  • api/xxx.html

3.3 通过已知接口

这个也需要根据实际场景来,比如有个接口为api/user/list,那么可进行的变形:

3.3.1 变形接口名

1
2
- api/user/query
- api/user/info

3.3.2 变形角色接口

1
2
3
4
- api/admin/userQuery
- api/admin/userList
# 至于命名是驼峰还是下划线还是其他,根据实际场景变通。

3.3.3 变形API版本

1
2
3
4
5
6
- api/user/listV1
- api/user/listV2
- api/user/listv1
- api/user/listv2
- api/user/listOne
- api/user/listTwo

3.4 扫描目录

  • 字典
  • 递归

琐碎

在我写完文章,准备上传到图床时,我大意了啊,没有闪开。

原本添加ssl是为了安全,现在却让本不富裕的我雪上加霜,可能不久的将来blog就关站了。(疯狂暗示富二代赶紧打赏)

七某云,我劝你耗子尾汁,好好反省,尽快把我的账单清掉!!!

大爷,赏个铜板呗!