WSO is the most dangerous shell in the corpus. Not because of sophistication — because of surface area. Five independent attack vectors, all firing before or bypassing authentication entirely. Combined with the W0rm supply-chain injection, any WSO deployment is compromised-on-deploy: the operator gives W0rm persistent unauthenticated access to every host they touch.
Default charset: Windows-1251 (Cyrillic). 69 KB delivers full functionality.
Capabilities
File browser. Command execution. SQL client (MySQL). FTP brute-force. PHP eval. Windows + Linux support. Self-rename. CLI mode — can be invoked as php wso.php <base64_POST> <base64_SERVER> with serialized arguments, enabling persistence even if web access is removed.
Authentication: none by default. The $auth_pass variable is never declared. !empty($auth_pass) evaluates to false — no login prompt, direct access to all shell functions for any visitor.
W0rm Supply-Chain Backdoor
Injected at the file-manager dispatch (fires when FilesMan action loads). Three covert mechanisms:
| Vector | Access | Impact |
|---|---|---|
GET ?cmd=<command> | Unauthenticated | OS command execution as web server user |
GET ?xsec=blocker + POST multipart | Unauthenticated | Arbitrary file write to webroot |
mail() callback | Automatic on first load | Exfiltration of victim URL + filepath to W0rm controller |
The W0rm ?cmd= handler executes before any shell logic — it is prepended code, not integrated. The operator deploying WSO has no visibility into these vectors. The shell functions as expected for the operator while simultaneously serving W0rm.
IOC markers: errors_log file written to webroot. Pastebin payload URL: pastebin[.]com/raw/yTXtLFyx (rotatable). Exfil mailbox: md5[.]undersociety[@]gmail[.]com. Campaign tag: 8987RM.
W0rm infects 4 out of 10 Tier 1 shells in the corpus (40% infection rate): WSO, b374k, r57, IndoXploit. The redistributor backdoors the buyers.
Vulnerabilities
| # | Class | Impact | Status |
|---|---|---|---|
| 1 | W0rm supply-chain RCE — unauthenticated GET ?cmd= | Pre-auth RCE | Live-proven |
| 2 | W0rm file upload — unauthenticated ?xsec=blocker drops files to webroot | Arbitrary file write | Live-proven |
| 3 | W0rm mail() beacon to md5.undersociety@gmail.com | Supply-chain surveillance | Live-proven |
| 4 | Zero authentication — $auth_pass never declared, auth block skipped | Unrestricted access | Live-proven |
| 5 | Dispatch gadget — call_user_func on POST-controlled function name | Attacker-controlled dispatch | Confirmed |
| 6 | Object injection — unserialize on user-controlled cookie | POP chain to RCE | Confirmed |
| 7 | CLI mode — invocable as php wso.php without HTTP | Persistence without web logs | Confirmed |
Additional Attack Surfaces
Beyond W0rm, WSO carries four independent vulnerability classes:
| # | Class | Detail |
|---|---|---|
| 1 | Zero authentication | $auth_pass never declared — any visitor gets full shell access |
| 2 | Dispatch gadget | call_user_func('action' . $_POST['a']) — attacker-controlled function dispatch, no validation |
| 3 | Object injection | unserialize($_COOKIE['f']) — POP chain possible if gadget classes loaded in PHP environment |
| 4 | CLI mode | $argv[1]/$argv[2] parsed as base64-serialized POST/SERVER — shell runs without HTTP, harder to detect via web logs |
All four fire independently of the W0rm injection. Combined severity: any WSO copy is exploitable from five different angles simultaneously, none requiring authentication.
Detection Surface
File-system indicators
| Indicator | Type | Detail |
|---|---|---|
| Single PHP file ≈ 69 KB | Size | Source variant (WSO 2.5) |
WSOsetcookie | Function | WSO-specific cookie setter — unique identifier across all webshell families |
$auth_pass | Variable | Auth password hash — empty string on default install = no auth |
$_POST['p1'] in eval() | Code pattern | PHP eval dispatch — appears 3 times in source |
@unserialize($_COOKIE['f']) | Code pattern | PHP object injection (POP chain to RCE) |
Action dispatch: FilesMan, Console, Sql, Network, SecInfo | Code pattern | $_POST['a'] values for each shell module |
Obfuscated variant: $XnNhAWEnhoiqwciqpoHH=file(__FILE__); | Variable | WebShellOrb 2.6 packer signature |
errors_log in webroot | Marker file | W0rm drops this on first execution (W0rm variant only) |
HTTP access-log indicators
| Log pattern | What it means |
|---|---|
POST with a=FilesMan | File manager action dispatch — strong WSO indicator |
POST with p1= containing PHP code | Arbitrary PHP eval execution |
POST with pass= | Login form password field |
POST with a=Console / a=Sql / a=Network | Interactive console, SQL interface, network tools |
GET ?cmd=<command> | W0rm backdoor — unauthenticated OS command execution |
GET ?xsec=blocker | W0rm file upload trigger |
| Cookie name = MD5 of hostname | Auth cookie — md5($_SERVER['HTTP_HOST']) |
YARA rules
rule webshell_wso {
meta:
description = "WSO (Web Shell by Orb) v2.x"
author = "OHIIHO Threat Research"
reference = "https://research.ohiiho.com/arsenal/wso/"
status = "validated"
strings:
$auth_pass = "$auth_pass" ascii
$wso_cookie = "WSOsetcookie" ascii
$eval_p1 = "eval($_POST['p1'])" ascii
$md5_host = "md5($_SERVER['HTTP_HOST'])" ascii
$globals_auth = "$GLOBALS['auth_pass']" ascii
$post_pass = "$_POST['pass']" ascii
$filesman = "FilesMan" ascii
condition:
filesize < 100KB
and $auth_pass
and ($wso_cookie or $md5_host or $globals_auth)
and ($eval_p1 or $filesman or $post_pass)
}
W0rm supply-chain rule (generic — catches any W0rm-infected tool):
rule webshell_w0rm_prepend {
meta:
description = "W0rm supply-chain prepend (cleartext or base64)"
author = "OHIIHO Threat Research"
status = "validated"
strings:
$w0rm_cmd = "$_GET[\"cmd\"]" ascii
$w0rm_xsec = "$_GET[\"xsec\"]" ascii
$w0rm_mail = "md5.undersociety" ascii
$w0rm_pb = "pastebin.com/raw/" ascii
$w0rm_block = "xsec=blocker" ascii
$w0rm_log = "errors_log" ascii
$w0rm_b64pb = "aHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3" ascii
$w0rm_from = "RnJvbTogVzBybQ" ascii
condition:
filesize < 500KB and 3 of them
}
MITRE ATT&CK
| Technique | Context |
|---|---|
| T1505.003 | Web Shell |
| T1059.004 | Command and Scripting Interpreter — Unix Shell (dispatch gadget) |
| T1212 | Exploitation for Credential Access (object injection via cookie) |
| T1041 | Exfiltration Over C2 Channel (W0rm mail callback) |
| T1105 | Ingress Tool Transfer (W0rm file upload via ?xsec=blocker) |
OHIIHO Threat Research.
