尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

WSO PHP WebShell 深度解析:从认证机制到功能模块的完整技术拆解

WSO PHP WebShell 深度解析:从认证机制到功能模块的完整技术拆解 网络安全渗透测试【免费下载链接】webshellThis is a webshell open source project项目地址https://gitcode.com/gh_mirrors/we/webshell点击查看免费下载导读WSOWeb 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.phpWSO 2.2.0共 1469 行为源码主体逐层拆解其登录认证、反爬伪装、文件管理、命令执行、数据库管理、安全模式绕过等核心实现帮助安全研究人员与渗透测试人员在授权范围内理解这类工具的架构与检测对抗思路。一、WSO 是什么项目背景与定位根据 php/wso/readme.md 的说明WSO 是作者 tweplHARD_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 目录保存了完整的版本演进链条便于对比研究文件版本/特征默认密码MD5php/wso/wso.phpWSO 2.2.01469 行标准单文件形态21232f297a57a5a743894a0e4a801fc3adminphp/wso/wso2.phpWSO 2.5 变体扩展了 UA 黑名单默认 AJAX、默认字符集 Windows-125163a9f0ea7bb98050796b649e85481845rootphp/wso/WSO_4_0_5.phpWSO 4.0.51568 行21232f297a57a5a743894a0e4a801fc3adminphp/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 多层混淆版63a9f0ea7bb98050796b649e85481845php/wso/wso_404.php404 伪装登录页 私改版默认密码为4044f4adcbf8c6f66dcfc8a3282ac2bf10a从版本演进可以观察到两个显著趋势一是从 4.1.3 开始引入变量名混淆与 POST 参数加密见 php/wso/wso-4.1.3.php 顶部对a/c/p1/p2/p3各字段统一执行decrypt与iconv转码的逻辑二是出现了 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_reporting、error_log、log_errors全部关闭并将max_execution_time与set_time_limit置 0规避长耗时操作的超时限制。3.2 登录校验逻辑认证逻辑位于 php/wso/wso.phpfunction printLogin() { ? center form methodpost stylefont-family:fantasy; Password: input typepassword namepass ...input typesubmit 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();要点MD5 比对用户提交的pass字段经md5()后与$auth_pass比较明文口令本身不会出现在源码中会话密钥按主机隔离Session 键名取md5($_SERVER[HTTP_HOST])同一 Session 下不同域名/虚拟主机的登录态彼此独立空密码降级若$auth_pass为空则跳过校验直接放行——这一点在实际部署中通常会被配置者显式修改也是检测工具重点检查的弱配置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 中被扩充为正则黑名单数组覆盖Google、Slurp、MSNBot、ia_archiver、Yandex、Rambler等$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.phpif( 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. InfoSecInfo,FilesFilesMan,ConsoleConsole,InfectInfect, SqlSql,PhpPhp,Safe modeSafeMode,String toolsStringTools, BruteforceBruteforce,NetworkNetwork,DomainsDomains); 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 → popenfunction 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_SOFTWARE、disable_functions、open_basedir、safe_mode_exec_dir、safe_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/fstab、df -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 分支执行ver、net accounts、net user收集系统与账户信息。5.2 FilesMan文件管理器actionFilesMan()php/wso/wso.php是默认首页提供完整文件管理能力操作子命令由p1区分uploadFilemove_uploaded_file 上传、mkdir、delete含递归删除目录的deleteDir、copy/move把选中文件清单存进 Session再paste到目标目录、s_字段_方向按名称/大小/修改时间/权限排序列表视图对每个条目展示大小、修改时间、属主/属组posix_getpwuid/posix_getgrgid、带颜色标注的权限位可读红色、只读白色、可写青色见viewPermsColor行内快捷操作Rrename、Ttouch、Eedit、Ddownload、chmod 入口目录无法打开时输出Cant open this folder!并返回。文件级工具集中在actionFilesTools()php/wso/wso.phpView按 1024 字节分块读取、Highlighthighlight_file语法高亮、Downloadob_gzhandler压缩流 Content-Disposition头、Hexdump三栏十六进制视图、Editfile_put_contents保存、Chmod八进制字符串转chmod、Rename、Touch。5.3 Console命令控制台与内置命令别名actionConsole()php/wso/wso.php提供类终端界面只读输出区 命令输入框支持上下方向键翻阅历史JS 数组cmds、输入clear清屏以及 AJAX 模式后端返回document.cf.cmd.value; ...形式的 JS 增量更新。控制台内置大量命令别名aliasesphp/wso/wso.php按平台区分可直接在下拉框选择执行。Windows 侧包括dir、netstat -an、net start、net user、net view、arp -a、ipconfig /all等Unix 侧覆盖信息收集的常用姿势类别示例命令目录/文件属性ls -la、lsattr -va端口与连接netstat -an \| grep -i listenSUID/SGID 搜索find / -type f -perm -04000 -ls、find . -type f -perm -02000 -ls敏感文件定位find / -type f -name config.inc.php、find / -type f -name .htpasswd、find / -type f -name .bash_history、find / -type f -name service.pwd可写目录搜索find / -perm -2 -lslocate 系列locate httpd.conf、locate proftpd.conf、locate config.php、locate .sql、locate backup等可以看到别名表的设计目标非常明确快速定位配置文件中可能携带口令的文件、SUID 提权点、可写目录等后续渗透所需的关键信息。5.4 Php任意 PHP 代码执行actionPhp()php/wso/wso.php提供两个能力phpinfop2 info时输出phpinfo()并做正则清洗以适配深色主题替换 body 样式、h1→h2代码执行textarea 中的代码经p1传入后端直接eval()同时支持 AJAX 模式后端将eval输出包装成设置PhpOutputinnerHTML 的 JS 返回。这是 WSO 中风险最高的功能之一配合 Sec Info 的disable_functions情报攻击者可精确挑选未被禁用的函数继续推进。5.5 SafeModesafe_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、大小写转换、htmlspecialchars、strlen等另提供将哈希提交到外部在线破解站的表单hashcrack.com、md5decrypter.com 等。从检测角度看这一模块常被用作 WAF 规则里的特征锚点如full_urlencode、hex2ascii等函数名。5.7 Bruteforce内置 FTP/MySQL/PostgreSQL 爆破actionBruteforce()php/wso/wso.php内置三类服务的口令爆破目标协议FTPftp_connectftp_login默认端口 21、MySQLmysql_connect默认 3306、PostgreSQLpg_connect默认 5432字典来源两种模式——type1直接读取/etc/passwd用户名作为口令可勾选 reverse 再试反写用户名type2指定字典文件默认路径为当前目录下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 输入任意 SQLquery fetch渲染结果表NULL 值以斜体显示nl2br保留换行分页浏览按每页 30 行分页LIMIT 30 OFFSET n/LIMIT n,30Dump 下载勾选多个表后输出dump.sqlMySQL 用SHOW CREATE TABLE重建结构并以mysql_real_escape_string转义数据PostgreSQL 用addslashesLoad fileSELECT LOAD_FILE(...)借助 MySQL 权限读取服务器文件——与 SafeMode 模块互补的又一读文件通道连接字符集跟随页面charset映射UTF-8→utf8、Windows-1251→cp1251、KOI8-R→koi8r 等。5.10 Infect 与 Domains感染面统计与虚拟主机枚举Infectphp/wso/wso.php递归扫描DOCUMENT_ROOT下所有.php文件标记其中可写且非自身的文件并计数为后续植入做准备Domainsphp/wso/wso.php面向 cPanel/虚拟主机环境读取/etc/named.conf解析域名 zone通过/etc/valiases/域名的属主反查站点用户并创建sym目录、写.htaccess将 txt 扩展名与 PHP 处理器关联后建立指向/home/user/public_html的符号链接实现跨站读取。5.11 安全收尾Logout 与 SelfRemoveactionLogout()php/wso/wso.phpunset会话键实现退出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 中可逐一验证文件特征$auth_pass$color$default_action三变量组合、actionFilesMan/actionSecInfo等函数命名、document.mf隐藏表单、SELF_PATH常量请求特征POST 字段a/c/p1/p2/p3/charset的组合以及ajaxtrue与返回格式数字\nJS代码行为特征对exec/passthru/system/shell_exec/popen的多函数回退链、compress.zlib://与file://流包装器、/tmp/bp.c、/tmp/bc.c等固定落盘路径口令弱点大量变体仍沿用adminMD521232f297a57a5a743894a0e4a801fc3或root的默认口令WAF 与 EDR 可直接将已知 MD5 值加入威胁情报。八、合规使用与结语最后必须重申 README 中的声明WSO 仅可用于获得明确授权的测试环境不得用于任何非法目的。本文对 php/wso/wso.php 的源码拆解目的在于帮助安全研究人员、蓝队检测人员与合规的渗透测试人员理解经典 PHP Web Shell 的架构与对抗思路——从 MD5 口令认证、爬虫 UA 伪装到动作分发框架、命令执行回退链、安全模式绕过与内嵌数据库/爆破/反弹模块WSO 作为 2010 年代最具代表性的 PHP 大马之一其模块化设计至今仍是研究 Web 攻击面与构建检测规则的重要标本。赞分享网络安全渗透测试【免费下载链接】webshellThis is a webshell open source project项目地址https://gitcode.com/gh_mirrors/we/webshell点击查看免费下载相关推荐PHP WebShell免杀技术深度解析从零学习到实战绕过PHP WebShell免杀技术深度解析从零学习到实战绕过 前言 在网络安全攻防对抗中WebShell作为攻击者维持权限的重要工具其免杀技术一直是安全研究3 条命令导出微信 PC 版聊天记录PyWxDump 新手指南3 条命令导出微信 PC 版聊天记录PyWxDump 新手指南 PyWxDump 是一款用于微信数据恢复与微信数据库解密的免费工具它会自动解密 PC 版微信深度拆解OrcaSlicer从3D模型到G代码的完整技术指南深度拆解OrcaSlicer从3D模型到G代码的完整技术指南 OrcaSlicer作为一款专业级的3D打印切片软件支持BambuLab、Prusa、Voro桌面应用3D渲染图形学上一篇DownGitGitHub精准下载利器告别整库克隆的烦恼下一篇DownGit重新定义GitHub资源获取方式的革命性工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表