src/众测中的一些越权方式
在src和众测中越权算是非常好出洞的一种漏洞,这里分享下一些越权的挖掘思路。
1.参数可遍历
最常见的越权出现在参数为数字的地方
案例:
xx科学院大学某接口越权
GET /keyuanhui/alumnus/8979 HTTP/1.1
GET /keyuanhui/alumnus/8979/career HTTP/1.1
GET /keyuanhui/user/campus?userId=8979×tamp=1700983242380 HTTP/1.12.参数不可遍历
遇见参数不可遍历的地方一般是注册2个账号然后替换参数尝试越权,但是这样在一些src中会以危害不足被打回。
这种时候,我们需要扩大危害,看看在那些地方有泄露arr的值:
1.js全局搜索arr。
2.可以去bp使用hex之类的插件正则匹配arr。
3.bp搜索arr。
4.在其他接口查看是否有arr。
案例:
xx国防工业职业技术学院
/jeecg-boot/manage/interestedCandidates/myRegistration?tenantId=70&userId=oSF-j4tZoARUQn4NmbgFO_w-JIo0
该接口存在越权,可通过userId获取用户的敏感信息(name,idcard,手机号等)。通过两个账号替换userId发现可越权。但是userId不可遍历。需要去寻找,那些地方会泄露userId。最后在一个查询接口找到。
/jeecg-boot/manage/recruitStudent/queryById?id=174311
该查询接口可遍历id获取用户部分信息,其中有个openid对应上面接口的userId。阔以遍历id去获取所有用户的openid。在到上面接口去获取用户的敏感信息。3.参数制空越权
在很多情况下,如果用户传入的值为空(例如,查询条件为空),数据库查询可能会返回所有记录。这通常是因为 SQL 查询没有正确处理空值。
默认查询所有: 开发人员可能在代码中写入了这样的逻辑:如果传入的 id 参数为空(null、""、undefined 等),则程序默认执行一个“查询所有记录”的操作(例如执行 SELECT * FROM table_name),而不是返回一个错误。
错误处理不当: 当后端尝试解析或处理一个空的 id 值时,可能会触发一个异常。如果开发人员在异常处理代码中没有正确地返回错误信息,而是选择返回所有数据(可能作为“兜底”或“默认”行为),就会导致这个问题。
类似的我们也可以传入,%,*。让查询语句,返回所有数据。当传入%时如果返回所有数据,此处大多数情况还存在sql注入。在使用like语句的时候大多数情况下没有使用预编译处理。因为like、order by直接使用#{}预编译会进行sql报错,所以开发人员在使用${}不当后会造成like注入和oder by注入。
案例:
xxx公司制空越权
4.参数类型越权
类似上面的制空越权,本来的查询逻辑你传入字符串admin,然后它查询。
可能的处理逻辑:
1.当你传入数字类型参数时它内部没有正确的处理逻辑,默认就全表查询(可能的处理逻辑)。
2.当你传入数字类型参数时,类型转化出现问题
```
SELECT * FROM users WHERE name = 'admin'
```
案例:
此处studentid一开始是字符串类型,如响应里的studentid,尝试制空和%,*后无果。尝试传入1,2,3.等数字发现只要是数字类型的。都会返回所有数据
5.无身份参数的查询功能
在一些查询功能处一般没有关于身份的参数,但是响应里有类似id之类的。可以尝试将id参数加到请求参数中,然后修改为其他用户的id看看是否返回其他用户的信息。比如你的id为123,你可以添加id为124的参数在请求里。
user/info
user/info?id=123POST /api/users/current/profile/email HTTP/2
Host: api.example.com
Authorization: Bearer eyJ...
Content-Type: application/json
{
}
#响应:
HTTP/2 200 OK
Server: nginx/1.19.0
Date: Fri, 16 Feb 2024 13:37:00 GMT
Content-Type: application/json
{
"Id": 1234,
"email": "user@example.com"
}6.修改接口的越权
1.在接口查询自己信息时,开发者经常会用current和me,my这种关键字,可以尝试利用用户id(数字)来替代current他们。
正常请求:
POST /api/users/current/profile/email HTTP/2
Host: api.example.com
Authorization: Bearer eyJ...
Content-Type: application/json
{
"email": "user@example.com"
}
#响应:
HTTP/2 200 OK
Server: nginx/1.19.0
Date: Fri, 16 Feb 2024 13:37:00 GMT
Content-Type: application/json
{
"Id": 1234,
"email": "user@example.com"
}修改current为1234后的请求:(如果修改后请求成功,说明可以将current替换为id,这时候就可以修改id为其他用户的值越权)
PUT /api/users/1235/profile/email HTTP/2
Host: api.example.com
Authorization: Bearer eyJ...
Content-Type: application/json
{
"email": "changed@example.com"
}
#响应:
HTTP/2 200 OK
Server: nginx/1.19.0
Date: Fri, 16 Feb 2024 13:37:00 GMT
Content-Type: application/json
{
"Id": 1235,
"email": "changed@example.com"
}
2.老接口越权
/v3/user/123
/v2/user/1233.如果发现查询功能,添加功能不能越权(增删改查不全的情况)可以猜测接口名称去访问增删改查的其他接口看是否越权。
案例:
功能界面只有一个addeval接口,添加评论。该接口无越权,猜测删除接口后成功越权。
管理员师傅,这篇文件真是干货中的干货,推荐精选。