T09 · Insecure Skill Coding Practices
- Location
SKILL.md:166- Finding
CRM Authentication Token Transmitted in URL Query String
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 166-185; repeated at lines 742-755
Vulnerability Type: Authentication credential exposure through URL query parameters
Risk Level: HighVulnerable Code
bash cat > /tmp/crm_query.json << 'JSONEOF' {"jsonrpc":"2.0","method":"tools/call","params":{"name":"ToolName","arguments":{"parameter":"value"}},"id":1} JSONEOF curl -s "https://www.wininsales.com/mcp_api/mcp?token=" \ -X POST -H "Content-Type: application/json" \ -d @/tmp/crm_query.jsonThe same invocation pattern appears again in the employee lookup and lead-assignment examples:
bash cat > /tmp/crm_query.json << 'JSONEOF' {"jsonrpc":"2.0","method":"tools/call","params":{"name":"QueryEmployeeUserId","arguments":{"employee_name":"","multiple":0,"status":0}},"id":1} JSONEOF curl -s "https://www.wininsales.com/mcp_api/mcp?token=" \ -X POST -H "Content-Type: application/json" \ -d @/tmp/crm_query.json cat > /tmp/crm_query.json << 'JSONEOF' {"jsonrpc":"2.0","method":"tools/call","params":{"name":"AssignLead","arguments":{"id":"LeadID","receiver":"","suggest":"Note"}},"id":1} JSONEOF curl -s "https://www.wininsales.com/mcp_api/mcp?token=" \ -X POST -H "Content-Type: application/json" \ -d @/tmp/crm_query.jsonTechnical Analysis
The documented API format places the CRM authentication token in the URL query string. Although the examples leave the token blank and explicitly warn against embedding a real token in the Skill file, an operational request would have to populate the query parameter.
URL query strings can be recorded by reverse proxies, load balancers, web-server access logs, application monitoring systems, debugging tools, command histories, process inspection tools, and error reports. HTTPS protects the request while it is in transit but does not prevent the complete URL from being recorded at either endpoint or in local tooling.
Because the document states that the token represents the current CR ...[truncated 1441 chars]
- Remediation
View remediation
Remediation Suggestions
-
Change the MCP API authentication design to accept credentials through an HTTP authorization header, for example:
bash curl -s "https://www.wininsales.com/mcp_api/mcp" \ -X POST \ -H "Authorization: Bearer ${WININSALES_TOKEN}" \ -H "Content-Type: application/json" \ -d @request.json -
Obtain the token from a protected runtime secret source or environment variable rather than placing it directly in a command or file.
-
Ensure authorization headers are redacted from application, proxy, and monitoring logs.
-
Remove or redact query parameters from existing access logs and diagnostic data where feasible.
-
Rotate any token that may previously have appeared in a URL, shell history, log, or support bundle.
-
Use short-lived, revocable tokens with the minimum CRM permissions needed for each operation.
-
Update every example in
SKILL.mdso that none encourages authentication through URL query parameters.
-
