HTTP Method Manipulation in GraphQL
GraphQL 中的 HTTP 方法操作
描述
HTTP 方法操作涉及利用 GraphQL 服务器处理 HTTP 方法时的不一致性。在 GraphQL 中,如果服务器错误地允许使用 GET 请求执行变异(mutations),敏感数据可能会暴露在 URL 中,从而导致安全漏洞。
如果使用代理来路由请求,风险会增加,因为代理可能会记录这些 URL,从而无意中存储敏感信息(例如 API 密钥或用户数据),如果访问这些日志,这些信息随后可能会遭到破坏。
GraphQL 中 HTTP 方法操作的安全影响包括:
- 敏感数据暴露:当敏感信息(例如,变异参数)包含在 URL 中时,它可能会暴露给日志或其他未经授权的第三方。
- 代理风险:如果代理记录请求的 URL,嵌入在 GET 请求中的敏感数据可能会被存储,随后可能被未经授权的人员访问。
- 访问控制不当:允许通过 GET 请求进行变异可能会导致在没有适当保护措施的情况下执行不安全的操作。
要检查 GraphQL API 是否容易受到此漏洞的影响,您可以尝试使用 GET 请求执行变异:
import requests
response = requests.get("https://your-graphql-endpoint.com/graphql",
params={
'query': 'mutation { MutationName(input: { yourField: "value" }) { resultField } }'
})
fetch('https://your-graphql-endpoint.com/graphql?query=mutation%20{updateUser(id:%201,name:%20%22Malicious%22)}', {
method: 'GET'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
如果允许通过 GET 进行变异,则表明存在需要解决的潜在漏洞。
建议
为了缓解 GraphQL 中与 HTTP 方法操作 相关的风险,请遵循以下安全做法:
-
仅强制通过 POST 进行变异:确保只能通过 POST 方法执行变异。拒绝任何使用 GET 进行的变异请求,以防止敏感信息在 URL 中传递。
-
禁止针对变异使用 GET:更新服务器配置以明确禁止通过 GET 请求进行变异。这确保了无法通过 URL 执行数据更改操作。
from flask import request, jsonify
from flask_graphql import GraphQLView
@app.route('/graphql', methods=['POST'])
def graphql():
return GraphQLView.as_view('graphql')()
```javascript // Example of setting method restrictions in Express.js app.post('/graphql', (req, res) => { // Handle GraphQL mutations here });
app.get('/graphql', (req, res) => { res.status(405).send('Method Not Allowed'); // Reject GET requests }); ```
链接
标准
- OWASP_ASVS_L1:
- V4_1_3
- V5_3_3
- OWASP_ASVS_L2:
- V4_1_3
- V4_1_5
- V5_3_3
- V9_1_2
- OWASP_ASVS_L3:
- V4_1_3
- V4_1_5
- V5_3_3
- V9_1_2
- V12_1_1
- V13_4_1
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_4
- REQ_11_3
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_9_1
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213