Skip to content
Back to skills

Webapp Rpc Api Security

ASecurity

JSON-RPC and XML-RPC API security testing — method enumeration, unauthenticated and privileged RPC calls, batch authorization inconsistencies, method confusion, ID handling, and hidden internal method…

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
securitypythongophpbashsqlnodetestinggitapisecurity

Works with

  • api

Security analysis

A100/100

Scanned November 7, 2026

npx -y skills add bitbytelabio/arsenal --skill webapp-rpc-api-security --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Webapp Rpc Api Security?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Webapp Rpc Api Security
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/bitbytelabio-webapp-rpc-api-security/badge)](https://www.skillsdirectory.com/skills/bitbytelabio-webapp-rpc-api-security)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: webapp-rpc-api-security
description: JSON-RPC and XML-RPC API security testing — method enumeration, unauthenticated and privileged RPC calls, batch authorization inconsistencies, method confusion, ID handling, and hidden internal method…
domain: webapp
category: api
hide: true
license: Apache-2.0
metadata:
  manifest_entry: src/corpus/webapp-rpc-api-security/SKILL.md
---
# RPC API Security (JSON-RPC / XML-RPC)

## Purpose
Exploit RPC-style APIs: enumerate callable methods, invoke privileged or internal methods with lower-privilege sessions, abuse batch semantics, and exploit ID/param handling — applying the same differential evidence contracts as REST skills.

## Preconditions
- An identified JSON-RPC (POST with `{"jsonrpc":"2.0","method":...}`) or XML-RPC (`<methodCall>`) endpoint
- At least one valid session for differential testing
- The target's error behavior catalogued (invalid method, invalid params, authz failure)

## Attack Surface Signals
- JSON bodies with `jsonrpc`, `method`, `params`, `id` keys
- `Accept: application/json` endpoints rejecting normal REST calls
- Known frameworks: Ethereum nodes (`eth_*`), Solr, supervisor, MantisBT, WordPress XML-RPC, CMS RPC layers
- `/rpc`, `/jsonrpc`, `/xmlrpc.php`, `/api/jsonrpc` paths

## Methodology

### Step 1: Error-Triplet Baseline
```bash
curl -sk -X POST "https://TARGET/rpc" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"no_such_method","params":[],"id":1}'
curl -sk -X POST "https://TARGET/rpc" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"target_method","params":[],"id":1}'
```
Compare: unknown-method error vs real-method response (authz error, param error, or execution). Different error strings = method EXISTS and is callable to some depth. Catalog these before concluding anything.

### Step 2: Method Enumeration
```bash
for m in user.list user.get admin.list system.listMethods rpc.discover \
  getRoles updateUser deleteUser debug.status internal.exec importData; do
  resp=$(curl -sk -X POST "https://TARGET/rpc" -H "Content-Type: application/json" \
    -d "{\"jsonrpc\":\"2.0\",\"method\":\"$m\",\"params\":{},\"id\":1}")
  echo "$m => $resp" | head -c 200; echo
done
# Framework-specific discovery
# system.listMethods (XML-RPC), rpc.discover (JSON-RPC OpenRPC), eth_* on chain nodes
```
Treat readable responses as CANDIDATES — a finding requires a concrete unauthorized outcome.

### Step 3: Privileged Method Invocation
```text
1. Invoke the privileged method legitimately as the admin/high session → record the effect (baseline)
2. Same exact call with the lower-privilege session → if it executes identically: BFLA finding
3. Same call anonymous → additional finding surface
Verify the privileged effect with a second read (role changed, user created, data returned).
```

### Step 4: Param and Type Abuse
- Positional vs named params: `params:[victim_id]` vs `params:{"id":victim_id}` — some stacks authorize one shape
- Extra params: `params:[own_id, {"role":"admin"}]`
- Type confusion: string IDs vs numeric; null params; nested objects where scalars expected
- Parameter injection: `params:{"id": {"$ne": null}}` (NoSQL operator reaching the RPC layer)

### Step 5: Batch Authorization Inconsistencies
```bash
curl -sk -X POST "https://TARGET/rpc" -H "Content-Type: application/json" -d '[
  {"jsonrpc":"2.0","method":"user.get","params":[123],"id":1},
  {"jsonrpc":"2.0","method":"user.get","params":[456],"id":2},
  {"jsonrpc":"2.0","method":"admin.purgeUsers","params":[],"id":3}
]'
```
Some implementations authorize the batch container, not each method — mixed-role batches can smuggle privileged calls. Per-item responses must be checked individually: one executed admin.purgeUsers result = finding.

### Step 6: ID and Notification Handling
- `id` reflection: does the response echo attacker-controlled `id` values into logs/views (injection into ID fields)?
- Notifications (`id` omitted): fire-and-forget calls that may skip authz/logging
- `id` collisions in batches: response misattribution between calls
- Error responses leaking stack traces, file paths, versions (misconfig chain)

### Step 7: XML-RPC-Specific
```xml
<methodCall><methodName>system.listMethods</methodName><params></params></methodCall>
<!-- WordPress/MantisBT: system.multicall as auth-bypass batch primitive
     (password brute force via multicall, historically); pingback.ping as
     SSRF primitive (chains into api-ssrf) -->
```

## Evidence Contract
An RPC finding requires:
1. Baseline: the method's legitimate behavior (privileged execution observed or documented)
2. Manipulation: the lower-privilege/anonymous/param-abused invocation
3. Differential: the privileged effect actually happened for the unauthorized caller (verified by a second read), or privileged data returned in the result

**NOT evidence**: a different error string, method existence, a 200 with `{"result":null}`, batch accepted but no per-item effects

## Common Misses
- Error-string differences never catalogued, so method existence is missed
- Batch per-item results never inspected individually
- Named/positional param shapes not both tried
- Notifications (no `id`) never tested for authz bypass
- Framework-specific hidden methods (system.*, internal.*, debug.*) not probed
- XML-RPC system.multicall/pingback primitives forgotten

## False Positives / Non-Findings
- Unknown-method errors (routing working)
- `result: null` on authorized methods without state change
- Batch rejected wholesale (per-method authz working)
- Enumerated methods that exist but correctly enforce authorization

## Arsenal Tool Strategy
- `http_request`/curl for precise RPC envelopes; Python for batch construction and per-item parsing
- `oob_callback` where RPC methods accept URLs (pingback SSRF chains)
- `authz_matrix` for multi-role method differentials

## Stopping Rule
Every enumerated method x every session tier x positional/named/extra/type-abused params x batch and notification variants.

## Handoff
Report the method, session tier, param manipulation, and the verified unauthorized effect. URL-accepting methods chain into api-ssrf; chain-node RPC (eth_*) into blockchain-specific skills.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.