如何從一道CTF題目談PHP中的命令執(zhí)行

這篇文章給大家介紹如何從一道CTF題目談PHP中的命令執(zhí)行,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、主機(jī)域名、網(wǎng)絡(luò)空間、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。

快睡的時(shí)候,打開B站發(fā)現(xiàn)有位用戶留言,大意就是讓我?guī)兔匆坏李},正好當(dāng)時(shí)有空,于是就打開了他發(fā)的鏈接,代碼如下

如何從一道CTF題目談PHP中的命令執(zhí)行

很明顯是一道PHP代碼審計(jì)的題目,而且只需要繞過第三行的if即可進(jìn)行任意命令執(zhí)行。

解決思路

看了代碼之后覺得是道普通的題目,對于/a-zA-Z/這個(gè)正則表達(dá)式,我們可以利用PHP動(dòng)態(tài)函數(shù)的特性,構(gòu)造出字符串即可。

對于想要的字符串,我們可以通過以下三種方式來構(gòu)造:

1. 異或

對于PHP中的字符串,兩個(gè)字符串異或的結(jié)果是將兩個(gè)字符串逐位異或,返回一個(gè)新字符串。那么我們便可以使用此特性進(jìn)行構(gòu)造。

例如我們需要構(gòu)造phpinfo,則可以用腳本得到('0302181', '@[@[_^^')這兩個(gè)字符串,腳本如下:

如何從一道CTF題目談PHP中的命令執(zhí)行

其中valid是可用的字符,answer是我們需要構(gòu)造的字符串。那么我們得到了這個(gè)字符串,又該如何去執(zhí)行呢。我們可以通過一個(gè)變量存儲兩字符串異或后的值,再讓這個(gè)變量進(jìn)行動(dòng)態(tài)函數(shù)執(zhí)行即可,而變量的話因?yàn)镻HP的變量命名規(guī)則和C語言相同,可以使用下劃線進(jìn)行命名,如下:

如何從一道CTF題目談PHP中的命令執(zhí)行

2. 取反構(gòu)造

和第一種類似,都是基于PHP字符串位運(yùn)算的特點(diǎn)(會逐位進(jìn)行位運(yùn)算)。而取反構(gòu)造某些情況比異或構(gòu)造要方便,因?yàn)楫惢虻那闆r某些字符是無法直接通過其他字符進(jìn)行異或構(gòu)造的,而取反卻可以利用漢字或者其他特殊字符進(jìn)行構(gòu)造(不會有題目會限制某個(gè)漢字吧)。比如字母s我們可以通過~('和'{2})得到。而這個(gè)時(shí)候如果要用異或去構(gòu)造的話,你得找到兩個(gè)異或值為s的特殊字符。

取反構(gòu)造的腳本和異或構(gòu)造類似,在此不再給出。

3. 自增構(gòu)造

`++'a' == 'b'`

這個(gè)特點(diǎn)是利用了PHP是弱類型語言的特性,在對變量進(jìn)行操作的時(shí)候,PHP會隱式的轉(zhuǎn)換其變量類型,很多代碼審計(jì)的題目也是利用了這一特性。

遇到障礙

有了上面的思路后,而且也成功執(zhí)行了phpinfo(),下一步是不是就可以直接構(gòu)造命令執(zhí)行函數(shù)去進(jìn)行讀取文件,當(dāng)時(shí)我也是這么想的,于是我構(gòu)造了passthru(), system(), shell_exec(), exec()等函數(shù),都受到了阻礙,沒有回顯,通過進(jìn)一步的調(diào)試之后發(fā)現(xiàn)是禁用了這些函數(shù)(通過在函數(shù)后面加一個(gè)打印函數(shù)觀察是否執(zhí)行)。

在這里我停留了很久,試過打印$GLOBALS等都沒有任何有用的信息。最后通過使用glob()函數(shù)進(jìn)行目錄掃描,發(fā)現(xiàn)了flag.php文件,以及file_get_contents()進(jìn)行獲取,最終的payload如下

?mess=$_="`0123"^"?`~``";${$_}[_](${$_}[__]);&_=assert&__=print_r(base64_encode(file_put_contents("flag.php")))

如何從一道CTF題目談PHP中的命令執(zhí)行

最后再將其界面就可以得到最終的flag了。在最終的payload中我沒有去一個(gè)一個(gè)的構(gòu)造字符串異或,因?yàn)槟翘L了,而是構(gòu)造了一個(gè)$_POST[_]($_POST[__])的動(dòng)態(tài)函數(shù),這樣就可以在其他參數(shù)位置直接寫函數(shù)了。

深入分析

題目到這里就結(jié)束了,其實(shí)并沒有多難,首先是通過特性去構(gòu)造動(dòng)態(tài)函數(shù),然后發(fā)現(xiàn)了命令執(zhí)行被禁用之后,能夠知道使用其他函數(shù)去進(jìn)行獲取信息就行了。但是做完這道題后,不僅引發(fā)了我的思考,PHP中的命令執(zhí)行就只有這些方式了嗎,肯定不是。于是,我總結(jié)了幾種新的命令執(zhí)行技巧供大家參考。

1. 當(dāng)打印函數(shù)被禁用時(shí)

如果沒有了打印函數(shù),意味著你無法看到回顯,這時(shí)候即使命令執(zhí)行成功了你也無法得到信息,這個(gè)時(shí)候你就得利用其他方式去獲取回顯了。

首先是網(wǎng)上很多blog使用的方式,phpinfo如果發(fā)現(xiàn)開啟了curl,或者其他文件傳輸擴(kuò)展的的話,可以自建一個(gè)靶機(jī),將所有訪問信息存入數(shù)據(jù)庫或是文件,然后將回顯信息發(fā)送到你的靶機(jī)地址,這樣你去看日志就可以了,這種方式不是很方便而且有一定的局限性。這里我要介紹的是一種新的方式。

如果你使用過Django或者jsp開發(fā)web的話,你肯定知道輸出一個(gè)變量可以使用{{xxx}}或是<%=xxx%>的方式,那么在PHP中是否也有這種方式呢,答案是肯定的,PHP中的<?=xxx?>就可以將一個(gè)變量輸出,那么如果使用它呢,你只需要構(gòu)造如下的payload

$_="xxx";?><?=$_?>

這樣就可以將變量$_里面的內(nèi)容打印到屏幕上,而且關(guān)鍵的是這個(gè)輸出方式默認(rèn)是開啟的,管理員很容易就忽視這個(gè)選項(xiàng)。所以在做題時(shí)不妨一試。

2. 其他的命令執(zhí)行方式

當(dāng)system,passthru等不能用時(shí),網(wǎng)上會告訴你可以使用popen,proc_open這些管道命令去進(jìn)行執(zhí)行命令,當(dāng)然這沒有問題,而這里我向你介紹一種新方式,使用反引號,在PHP中,被兩個(gè)反引號括起來的內(nèi)容將會作為shell命令執(zhí)行,并將輸出信息返回,所以你可以構(gòu)造下面的payload進(jìn)行命令執(zhí)行

$_=`ls`;

3. 不能使用數(shù)字字母的命令執(zhí)行

當(dāng)不能使用字母數(shù)字時(shí),當(dāng)然你可以使用上述的方式構(gòu)造字符串進(jìn)行執(zhí)行,但是這里提供一些新東西,對于linux中的shell是支持正則表達(dá)式的,當(dāng)你忘記某些字符時(shí)可以通過? % *來代替,經(jīng)過測試,這里的匹配方式也是按照順序進(jìn)行匹配,所以你可以查看你的linux中/bin目錄下面的順序,來獲取一些可以使用的命令,比如

 => /bin/cat

那么這樣的話,如果要獲取/var/www/html/index.php(你得感謝apache默認(rèn)目錄如此之深),則可以直接使用來獲取

這篇文章只是針對這道題而延展出的一些東西,在真正做題時(shí),情況可能更加復(fù)雜,例如限制長度,限制參數(shù)等等情況,而我們的做法也不可能千篇一律,可能某些時(shí)候我們甚至?xí)玫揭恍〤VE漏洞。而本篇文章只是告訴讀者一些可能以前沒有見過的新東西。

關(guān)于如何從一道CTF題目談PHP中的命令執(zhí)行就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前題目:如何從一道CTF題目談PHP中的命令執(zhí)行
路徑分享:http://bm7419.com/article6/pssdig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管、外貿(mào)建站定制開發(fā)、企業(yè)建站外貿(mào)網(wǎng)站建設(shè)

廣告

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

網(wǎng)站優(yōu)化排名