WSO PHP WebShell 深度解析:从认证机制到功能模块的完整技术拆解
2026/9/24 16:32:50 网站建设 项目流程
  • 网络安全
  • 渗透测试

【免费下载链接】webshell

This is a webshell open source project

项目地址:https://gitcode.com/gh_mirrors/we/webshell
点击查看免费下载

导读

WSO(Web Shell by HARD_LINUX)是一套经典的 PHP Web Shell / 文件管理器,仓库中的 php/wso/readme.md 将其定位为 2015 年新一代的 PHP Web Shell,并明确声明它仅用于测试与获得严格授权许可的场景。本仓库的 php/wso 目录下完整保留了 WSO 2.2.0、2.5、4.0.5 至 4.2.5 等多个版本及若干混淆变体。本文将以 php/wso/wso.php(WSO 2.2.0,共 1469 行)为源码主体,逐层拆解其登录认证、反爬伪装、文件管理、命令执行、数据库管理、安全模式绕过等核心实现,帮助安全研究人员与渗透测试人员在授权范围内理解这类工具的架构与检测对抗思路。

一、WSO 是什么:项目背景与定位

根据 php/wso/readme.md 的说明,WSO 是作者 twepl(HARD_LINUX)发布的一款以 PHP 编写的 Web Shell / 文件管理器,其原始发布形态为 2015 年版本。README 中强调:"This PHP Shell is a useful tool for system or web administrator to do remote management without using cpanel, connecting using ssh, ftp etc. All actions take place within a web browser"——即它面向系统管理员或 Web 管理员,用于在不使用 cPanel、SSH、FTP 等传统通道的情况下,仅凭浏览器完成远程管理。

README 同时包含两条关键约束信息:

  • 默认密码admin(对应 MD5 值见下文源码分析);
  • 免责声明"This is only for testing purposes and can only be used where strict consent has been given. Do not use this for illegal purposes"——仅限授权测试,禁止非法用途。

此外 README 还列出了捐赠信息(Bitcoin / Яндекс.Деньги / WebMoney),并引导用户将 Bug 与功能增强建议提交到原始上游仓库的 Issues。需要说明的是,README 中引用的截图位于外部图床(cs621518.vk.me),在当前仓库中不存在,因此本文以源码实现作为事实依据展开。

二、仓库内的 WSO 版本谱系

php/wso 目录保存了完整的版本演进链条,便于对比研究:

文件版本/特征默认密码(MD5)
php/wso/wso.phpWSO 2.2.0,1469 行,标准单文件形态21232f297a57a5a743894a0e4a801fc3(admin)
php/wso/wso2.phpWSO 2.5 变体,扩展了 UA 黑名单,默认 AJAX、默认字符集 Windows-125163a9f0ea7bb98050796b649e85481845(root)
php/wso/WSO_4_0_5.phpWSO 4.0.5,1568 行21232f297a57a5a743894a0e4a801fc3(admin)
php/wso/wso-4.1.3.php4.1.3,引入 Unicode 变量名与参数加密(decrypt/iconv)混淆admin 同上
php/wso/wso-4.2.0.php 至 php/wso/wso-4.2.5.php4.2.x 系列,持续迭代admin 同上
php/wso/WSO_base64.php2.2.0 的 Base64 整体编码混淆版admin 同上
php/wso/wso2_pack.php2.5 的 preg_replace/e+ gzinflate + base64 多层混淆版63a9f0ea7bb98050796b649e85481845
php/wso/wso_404.php"404 伪装登录页" 私改版,默认密码为4044f4adcbf8c6f66dcfc8a3282ac2bf10a

从版本演进可以观察到两个显著趋势:一是从 4.1.3 开始引入变量名混淆与 POST 参数加密(见 php/wso/wso-4.1.3.php 顶部对a/c/p1/p2/p3各字段统一执行decrypticonv转码的逻辑),二是出现了 php/wso/wso_404.php 这类将登录页伪装成 404 错误页的隐蔽部署形态。下文所有功能拆解均以 php/wso/wso.php 的 2.2.0 版本为准。

三、部署方式与登录认证机制

3.1 单文件部署

WSO 是纯 PHP 单文件实现,只需将 php/wso/wso.php 上传到 Web 根目录(或任意可被 PHP 解释的目录),通过浏览器访问即可。文件头部即完成全部初始化:常量定义、会话启动、错误抑制、超时控制等,见 php/wso/wso.php:

$auth_pass = "21232f297a57a5a743894a0e4a801fc3"; //admin $color = "#fff"; $default_action = 'FilesMan'; @define('SELF_PATH', __FILE__); if( strpos($_SERVER['HTTP_USER_AGENT'],'Google') !== false ) { header('HTTP/1.0 404 Not Found'); exit; } @session_start(); @error_reporting(0); @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('max_execution_time',0); @set_time_limit(0);

其中:

  • $auth_pass为登录口令的MD5 摘要21232f297a57a5a743894a0e4a801fc3正是明文admin的 MD5 值,与 README 中"Пароль: admin"(密码:admin)相互印证;
  • $default_action = 'FilesMan'决定未指定操作时的默认功能页(文件管理器);
  • SELF_PATH常量被 SelfRemove(自删除)等功能引用;
  • 初始化阶段将error_reportingerror_loglog_errors全部关闭,并将max_execution_timeset_time_limit置 0,规避长耗时操作的超时限制。

3.2 登录校验逻辑

认证逻辑位于 php/wso/wso.php:

function printLogin() { ?> <center> <form method=post style="font-family:fantasy;"> Password: <input type=password name=pass ...><input type=submit value='>>' ...> </form></center> <?php exit; } if( !isset( $_SESSION[md5($_SERVER['HTTP_HOST'])] )) if( empty( $auth_pass ) || ( isset( $_POST['pass'] ) && ( md5($_POST['pass']) == $auth_pass ) ) ) $_SESSION[md5($_SERVER['HTTP_HOST'])] = true; else printLogin();

要点:

  1. MD5 比对:用户提交的pass字段经md5()后与$auth_pass比较,明文口令本身不会出现在源码中;
  2. 会话密钥按主机隔离:Session 键名取md5($_SERVER['HTTP_HOST']),同一 Session 下不同域名/虚拟主机的登录态彼此独立;
  3. 空密码降级:若$auth_pass为空,则跳过校验直接放行——这一点在实际部署中通常会被配置者显式修改,也是检测工具重点检查的弱配置;
  4. magic_quotes 兼容:若get_magic_quotes_gpc()开启,会递归调用stripslashes_array$_POST反转义(php/wso/wso.php)。

3.3 搜索引擎爬虫伪装(反侦查)

源码在初始化最前端检查User-Agent是否包含Google字样,命中即直接返回HTTP/1.0 404 Not Found并退出(php/wso/wso.php)。这一设计的意图是:当管理员或搜索引擎爬虫(Googlebot 等)访问时返回 404,降低被收录与被发现的概率。

该反爬名单在 php/wso/wso2.php 中被扩充为正则黑名单数组,覆盖GoogleSlurpMSNBotia_archiverYandexRambler等:

$userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler"); if(preg_match('/' . implode('|', $userAgents) . '/i', $_SERVER['HTTP_USER_AGENT'])) { header('HTTP/1.0 404 Not Found'); exit; }

而 php/wso/wso_404.php 更进一步:整个登录界面即模拟 404 错误页,文件头注释提示"将文件命名为 404.php 放入默认主页目录,站长在浏览器中打开只会看到一个 404 页面,因而不会删除它"。

四、核心框架:动作分发、字符集与命令执行链

4.1 action 分发机制

WSO 的全部功能以actionXxx()函数形式组织,末尾统一分发(php/wso/wso.php):

if( empty($_POST['a']) ) if(isset($default_action) && function_exists('action' . $default_action)) $_POST['a'] = $default_action; else $_POST['a'] = 'SecInfo'; if( !empty($_POST['a']) && function_exists('action' . $_POST['a']) ) call_user_func('action' . $_POST['a']);

即前端通过隐藏表单字段a指定动作名,后端拼接action前缀后调用对应函数。动作清单定义于 php/wso/wso.php:

$m = array('Sec. Info'=>'SecInfo','Files'=>'FilesMan','Console'=>'Console','Infect'=>'Infect', 'Sql'=>'Sql','Php'=>'Php','Safe mode'=>'SafeMode','String tools'=>'StringTools', 'Bruteforce'=>'Bruteforce','Network'=>'Network','Domains'=>'Domains'); if(!empty($GLOBALS['auth_pass'])) $m['Logout'] = 'Logout'; $m['Self remove'] = 'SelfRemove';

共有 11 个核心动作外加 Logout 与 SelfRemove。前端交互通过隐藏表单mf(字段a/c/p1/p2/p3/charset)配合 JS 函数set/g/a/sr完成:普通提交走g()整页刷新,勾选 "send using AJAX" 后走a()异步提交,后端返回字节数\nJS代码格式的响应,由processReqChange()截取后eval执行(php/wso/wso.php),这是 WSO 实现无刷新操作的底层协议。

4.2 页面字符集

printHeader()会读取$_POST['charset'],默认 UTF-8,并列出UTF-8 / Windows-1251 / KOI8-R / KOI8-U / cp866五种可切换字符集(php/wso/wso.php),用于兼容俄语等环境的输出编码;后续 SQL 模块也会依据该字符集设置数据库连接编码。

4.3 命令执行链 ex()

所有需要执行系统命令的功能都收敛到ex()函数(php/wso/wso.php),按可用性依次回退到exec → passthru → system → shell_exec → popen

function ex($in) { $out = ''; if(function_exists('exec')) { @exec($in,$out); $out = @join("\n",$out); }elseif(function_exists('passthru')) { ob_start(); @passthru($in); $out = ob_get_clean(); }elseif(function_exists('system')) { ob_start(); @system($in); $out = ob_get_clean(); }elseif(function_exists('shell_exec')) { $out = shell_exec($in); }elseif(is_resource($f = @popen($in,"r"))) { $out = ""; while(!@feof($f)) $out .= fread($f,1024); pclose($f); } return $out; }

这一多级回退策略使 WSO 在disable_functions部分屏蔽命令函数时仍有机会执行命令——这也是 WAF 与主机防护需要把整条函数链都纳入封禁的原因。类似的兼容性兜底还有scandir不存在时用opendir/readdir自行实现(php/wso/wso.php)。

五、功能模块详解

5.1 Sec Info:服务器安全信息侦察

actionSecInfo()(php/wso/wso.php)一次性汇总目标主机的安全配置与敏感信息:

  • PHP 层面SERVER_SOFTWAREdisable_functionsopen_basedirsafe_mode_exec_dirsafe_mode_include_dir、cURL 支持情况;
  • 数据库能力探测:通过function_exists检查mysql_get_client_info / mssql_connect / pg_connect / oci_connect,输出支持的数据库类型;
  • Unix 敏感文件/etc/passwd/etc/shadow是否可读(可读则直接提供查看入口)、/proc/version/etc/issue.net/etc/hosts/etc/fstabdf -h磁盘信息;
  • 工具链盘点:将gcc/lcc/cc/ld/make/php/perl/python/ruby/tar/nc/locate/suidperl列为 "Userful"(可被利用的编译与下载工具),将kav/nod32/clamd/rkhunter/chkrootkit/iptables/tripwire/snort等安全软件列为 "Danger",并单独盘点wget/fetch/lynx/curl等下载器——这份清单本质上是为后续提权与横向工具准备的能力地图;
  • Windows 分支:执行vernet accountsnet user收集系统与账户信息。

5.2 FilesMan:文件管理器

actionFilesMan()(php/wso/wso.php)是默认首页,提供完整文件管理能力:

  • 操作子命令(由p1区分):uploadFile(move_uploaded_file 上传)、mkdirdelete(含递归删除目录的deleteDir)、copy/move(把选中文件清单存进 Session,再paste到目标目录)、s_字段_方向(按名称/大小/修改时间/权限排序);
  • 列表视图:对每个条目展示大小、修改时间、属主/属组(posix_getpwuid/posix_getgrgid)、带颜色标注的权限位(可读红色、只读白色、可写青色,见viewPermsColor);
  • 行内快捷操作:R(rename)、T(touch)、E(edit)、D(download)、chmod 入口;
  • 目录无法打开时输出Can't open this folder!并返回。

文件级工具集中在actionFilesTools()(php/wso/wso.php):View(按 1024 字节分块读取)、Highlight(highlight_file语法高亮)、Download(ob_gzhandler压缩流 +Content-Disposition头)、Hexdump(三栏十六进制视图)、Edit(file_put_contents保存)、Chmod(八进制字符串转chmod)、Rename、Touch。

5.3 Console:命令控制台与内置命令别名

actionConsole()(php/wso/wso.php)提供类终端界面:只读输出区 + 命令输入框,支持上下方向键翻阅历史(JS 数组cmds)、输入clear清屏,以及 AJAX 模式(后端返回document.cf.cmd.value=''; ...形式的 JS 增量更新)。

控制台内置大量命令别名(aliases)(php/wso/wso.php),按平台区分,可直接在下拉框选择执行。Windows 侧包括dirnetstat -annet startnet usernet viewarp -aipconfig /all等;Unix 侧覆盖信息收集的常用姿势:

类别示例命令
目录/文件属性ls -lalsattr -va
端口与连接netstat -an \| grep -i listen
SUID/SGID 搜索find / -type f -perm -04000 -lsfind . -type f -perm -02000 -ls
敏感文件定位find / -type f -name config.inc.phpfind / -type f -name .htpasswdfind / -type f -name .bash_historyfind / -type f -name service.pwd
可写目录搜索find / -perm -2 -ls
locate 系列locate httpd.conflocate proftpd.conflocate config.phplocate .sqllocate backup

可以看到,别名表的设计目标非常明确:快速定位配置文件中可能携带口令的文件、SUID 提权点、可写目录等后续渗透所需的关键信息。

5.4 Php:任意 PHP 代码执行

actionPhp()(php/wso/wso.php)提供两个能力:

  1. phpinfop2 == 'info'时输出phpinfo(),并做正则清洗以适配深色主题(替换 body 样式、h1→h2);
  2. 代码执行:textarea 中的代码经p1传入后端直接eval(),同时支持 AJAX 模式(后端将eval输出包装成设置PhpOutputinnerHTML 的 JS 返回)。

这是 WSO 中风险最高的功能之一:配合 Sec Info 的disable_functions情报,攻击者可精确挑选未被禁用的函数继续推进。

5.5 SafeMode:safe_mode / open_basedir 绕过工具箱

actionSafeMode()(php/wso/wso.php)内置 6 种历史绕过手法,每种对应一个编号,前端以表单形式提供:

编号手法实现
1Copy(读文件)copy("compress.zlib://" . 目标, $temp)file_get_contents($temp)
2Glob(列目录)glob(路径 . '*')
3Curl(读文件)curl_init("file://" . 目标 . "\x00" . SELF_PATH)利用空字节截断
4Ini_restore(读文件)ini_restore("safe_mode"); ini_restore("open_basedir"); include(目标)
5Posix_getpwuid(读 /etc/passwd)遍历 UID 区间,posix_getpwuid枚举用户
6Imap_open(读文件)imap_open(邮箱串)imap_body读取邮件正文

需要说明的是:safe_mode 与 register_globals 等机制在 PHP 5.4 后已移除,这些手法主要适用于 PHP 5.2/5.3 时代的存量主机,但其方法论(利用流包装器、空字节、ini_restore 恢复配置)对理解 PHP 历史漏洞仍具参考价值。

5.6 StringTools:字符串转换与哈希工具

actionStringTools()(php/wso/wso.php)内置 21 种转换函数的下拉选择,包括 Base64 编解码、URL 编解码、md5/sha1/crypt/CRC32 哈希、ASCII↔HEX、HEX↔DEC↔BIN、大小写转换、htmlspecialcharsstrlen等;另提供将哈希提交到外部在线破解站的表单(hashcrack.com、md5decrypter.com 等)。从检测角度看,这一模块常被用作 WAF 规则里的特征锚点(如full_urlencodehex2ascii等函数名)。

5.7 Bruteforce:内置 FTP/MySQL/PostgreSQL 爆破

actionBruteforce()(php/wso/wso.php)内置三类服务的口令爆破:

  • 目标协议:FTP(ftp_connect+ftp_login,默认端口 21)、MySQL(mysql_connect,默认 3306)、PostgreSQL(pg_connect,默认 5432);
  • 字典来源:两种模式——type=1直接读取/etc/passwd用户名作为口令(可勾选 "reverse" 再试反写用户名),type=2指定字典文件(默认路径为当前目录下passwd.dic);
  • 结果统计:输出 Attempts 与 Success 计数。

该模块将爆破能力内嵌进 Web Shell,使得攻击者在拿到一个低权限入口后即可对同网段服务发起横向口令攻击。

5.8 Network:反向连接与端口绑定

actionNetwork()(php/wso/wso.php)提供两类反弹能力,且各备 C 与 Perl 两种实现(源码以 Base64 常量内嵌,运行时解码写入/tmp再编译/执行):

  • Bind port(端口绑定)bpc/bpp两种模式,将/bin/sh绑定到指定端口(默认 31337,密码默认wso),执行后通过ps aux | grep bp回显进程确认;
  • Back-connect(反向连接)bcc/bcp模式,由目标主机主动连接攻击者指定的 Server:Port,默认回填$_SERVER['REMOTE_ADDR']作为监听地址。

C 版本依赖gcc编译(gcc -o /tmp/bp /tmp/bp.c),因此 Sec Info 中对gcc的探测与这里形成了闭环;Perl 版本则依赖which("perl")定位解释器。

5.9 Sql:数据库浏览器

actionSql()(php/wso/wso.php)是完整的内置数据库客户端,通过DbClass封装 MySQL / PostgreSQL 两套驱动:

  • 连接与库表浏览mysql_connect/pg_connect连接,listDbs/listTables枚举库表,并为每个表统计行数(SELECT COUNT(*));
  • 查询执行:textarea 输入任意 SQL,query + fetch渲染结果表(NULL 值以斜体显示,nl2br保留换行);
  • 分页浏览:按每页 30 行分页(LIMIT 30 OFFSET n/LIMIT n,30);
  • Dump 下载:勾选多个表后输出dump.sql,MySQL 用SHOW CREATE TABLE重建结构并以mysql_real_escape_string转义数据,PostgreSQL 用addslashes
  • Load fileSELECT LOAD_FILE('...')借助 MySQL 权限读取服务器文件——与 SafeMode 模块互补的又一读文件通道;
  • 连接字符集跟随页面charset映射(UTF-8→utf8、Windows-1251→cp1251、KOI8-R→koi8r 等)。

5.10 Infect 与 Domains:感染面统计与虚拟主机枚举

  • Infect(php/wso/wso.php):递归扫描DOCUMENT_ROOT下所有.php文件,标记其中可写且非自身的文件并计数,为后续植入做准备;
  • Domains(php/wso/wso.php):面向 cPanel/虚拟主机环境,读取/etc/named.conf解析域名 zone,通过/etc/valiases/<域名>的属主反查站点用户,并创建sym目录、写.htaccess(将 txt 扩展名与 PHP 处理器关联)后建立指向/home/<user>/public_html的符号链接,实现跨站读取。

5.11 安全收尾:Logout 与 SelfRemove

  • actionLogout()(php/wso/wso.php):unset会话键实现退出;
  • actionSelfRemove()(php/wso/wso.php):确认后unlink(SELF_PATH)自删除 Shell 文件,用于完成任务后的痕迹清理。

六、页面框架与交互细节

printHeader()/printFooter()(php/wso/wso.php)构建了完整的单页应用外壳:

  • 信息栏:内核版本(php_uname,带 Google 搜索与 Exploit-Git 快捷检索链接)、当前用户 UID/GID 与组名、PHP 版本、safe_mode 状态(红色 ON / 青色 OFF)、phpinfo 入口、磁盘总容量/剩余空间百分比、带面包屑的当前路径(可点击逐级跳转)、Windows 下自动枚举 A-Z 盘符;
  • 快捷工具栏:Change dir、Read file、Make dir、Make file、Execute、Upload file 六个快捷表单;
  • 前端脚本set/g/a/sr/processReqChange实现统一表单提交与 AJAX 协议。

七、检测与防御视角的要点归纳

基于上述源码事实,从防御侧可归纳如下检测特征(均在 php/wso/wso.php 中可逐一验证):

  1. 文件特征$auth_pass+$color+$default_action三变量组合、actionFilesMan/actionSecInfo等函数命名、document.mf隐藏表单、SELF_PATH常量;
  2. 请求特征:POST 字段a/c/p1/p2/p3/charset的组合,以及ajax=true与返回格式数字\nJS代码
  3. 行为特征:对exec/passthru/system/shell_exec/popen的多函数回退链、compress.zlib://file://流包装器、/tmp/bp.c/tmp/bc.c等固定落盘路径;
  4. 口令弱点:大量变体仍沿用admin(MD521232f297a57a5a743894a0e4a801fc3)或root的默认口令,WAF 与 EDR 可直接将已知 MD5 值加入威胁情报。

八、合规使用与结语

最后必须重申 README 中的声明:WSO 仅可用于获得明确授权的测试环境,不得用于任何非法目的。本文对 php/wso/wso.php 的源码拆解,目的在于帮助安全研究人员、蓝队检测人员与合规的渗透测试人员理解经典 PHP Web Shell 的架构与对抗思路——从 MD5 口令认证、爬虫 UA 伪装,到动作分发框架、命令执行回退链、安全模式绕过与内嵌数据库/爆破/反弹模块,WSO 作为 2010 年代最具代表性的 PHP 大马之一,其模块化设计至今仍是研究 Web 攻击面与构建检测规则的重要标本。

  • 网络安全
  • 渗透测试

【免费下载链接】webshell

This is a webshell open source project

项目地址:https://gitcode.com/gh_mirrors/we/webshell
点击查看免费下载
上一篇:DownGit:GitHub精准下载利器,告别整库克隆的烦恼
下一篇:DownGit:重新定义GitHub资源获取方式的革命性工具

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询