wordpress圖片插件放大珠海百度搜索排名優(yōu)化
什么是RCE?
RCE漏洞,可以讓攻擊者直接向后臺服務(wù)器遠(yuǎn)程注入操作系統(tǒng)命令或者代碼,從而控制后臺系統(tǒng)。也就是遠(yuǎn)程命令執(zhí)行。命令執(zhí)行是在目標(biāo)服務(wù)器上任意執(zhí)行系統(tǒng)命令。它屬于高危漏洞之一,也屬于代碼執(zhí)行的范疇。命令執(zhí)行漏洞與文件上傳漏洞類似,攻擊原理易于理解,但是攻擊的點(diǎn)非常多。
限制輸入長度,如何突破?
前期理解
這里我們先來看看一段源碼:
我們可以通過查找PHP的官方文檔可以知道,shell_exec()這個函數(shù),通過 shell 執(zhí)行命令并將完整的輸出以字符串的方式返回。也就是$param里面是可以直接寫入命令的。下面我們也可以試一下,輸入id。
?這也是一種典型的限制輸入長度的一個函數(shù),我們現(xiàn)在需要考慮的就是如何在限制長度的情況下,突破這個8位的限制,來進(jìn)行遠(yuǎn)程命令執(zhí)行。因?yàn)樵贚inux下的命令長度一般都比較長,命令長度較短的無非也就那幾個(w,id,whoami等等)。而我們需要用到的命令長度卻是遠(yuǎn)遠(yuǎn)大于8位的。
到這,就需要了解到Linux系統(tǒng)的重定向命令 > 和 >>。這兩個區(qū)別在于:
- >是重定向到一個文件,
- >>是追加內(nèi)容到一個文件。
如果文件不存在,那么這兩個命令都會首先創(chuàng)建這個文件。而我們就可以通過 >m 這一條極短的命令,來創(chuàng)建一個文件。但是要清楚的是,我們寫入的是文件名,不是文件內(nèi)容。
?
而Linux中還有一個按照時間的排序,打印出當(dāng)前目錄的文件。這個命令就是 ls -t 。該命令可以按照時間,讓最近創(chuàng)建的文件排在最前面。為此就可以引發(fā)一個思考,我們是否可以通過排序和拼接的方式來進(jìn)行命令執(zhí)行呢?
?
實(shí)戰(zhàn)操作
接下來,我們就繼續(xù)操作。
?
?
首先,先對需要執(zhí)行的PHP代碼進(jìn)行base64編碼,這里我寫的是 phpinfo(); (測試后發(fā)現(xiàn),那兩個 '?= ' 可以不要)
?
然后,在網(wǎng)頁上,對param一個一個的輸入(也可以在自己電腦的Linux下進(jìn)行,這樣更直觀一點(diǎn))。輸入的時候注意長度不要超過8位。
?
輸入>ls -t>0,將這些文件按照創(chuàng)建時間排序,并將文件名追加到0這個文件中。查看一下 0 這個文件里面的內(nèi)容。
?
直接sh 0 執(zhí)行,這里可能會報錯,但是文件還是會生成的。?
在Linux下,我們查看一下文件是否創(chuàng)建完成。都完成之后,就可以發(fā)現(xiàn)我們的目錄下出現(xiàn)了從。c.php這個文件,
?
直接訪問。
?
限制字母和數(shù)字如何進(jìn)行命令執(zhí)行?
?我們可以再看一個例子
<?php
if(isset($_GET['code'])){var_dump($_GET['code']);$code = $_GET['code'];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]+/",$code)){die("NO.");}eval($code);
}else{highlight_file(__FILE__);
}
解讀代碼?
- ?限制了輸入長度,但是不想上一個例子限制的那么嚴(yán)
- "/[A-Za-z0-9_$]+/"這段正則,限制了輸入的內(nèi)容,不能使用大小寫字母、數(shù)字、_、$
- 最后用eval執(zhí)行,highlight_file()高亮顯示?
?這里的PHP版本我使用的是5.6.9版本。
流程思路
那么,該如何繞過這個限制呢?
這里我們得重點(diǎn)關(guān)注這個正則。它雖然過濾了大小寫字母、數(shù)字、_、$,在Linux上確實(shí)很多的命令都不能使用,但真的是這樣嗎??
這里要補(bǔ)充一個知識點(diǎn):在Linux下,我們可以使用 ? 來進(jìn)行文件的匹配。也就是說,如果我們要匹配到 /tmp 目錄下的文件的話,就可以使用/???/?????????類似這種格式,來進(jìn)行一個匹配。但是如果只是這樣的話,匹配到的文件就太多了,還是不能精準(zhǔn)的對這個臨時文件進(jìn)行匹配。
可以知道的一點(diǎn)是,在我們進(jìn)行文件上傳的時候,Linux中的 /tmp 目錄下會自動生成一個文件,它的文件名是隨機(jī)的,但是它的文件名的最后幾位通常存在一個或多個大寫字母,這和我們Linux的其他文件是很不相同的。此時,就需要想一個辦法,既然我們已經(jīng)知道這個文件名的特征了,就可以從這個方面入手。
根據(jù)ascii碼表,我們可以知道大寫字母的范圍是96~123這個范圍內(nèi),但是因?yàn)椴荒苁褂脭?shù)字,所以說就可以用 @-[ 來對其進(jìn)行替代。也就是說現(xiàn)在,我們的匹配命令就可以用ls -al /???/????????[@-[] 來進(jìn)行一個精準(zhǔn)匹配。
知道原理之后,就可以進(jìn)行實(shí)戰(zhàn)的操作了
實(shí)戰(zhàn)操作
先簡單寫一個上傳文件的網(wǎng)頁,上傳成功之后,跳轉(zhuǎn)到web2.php頁面。
因?yàn)榘阎暗呐R時文件刪了,我這里就自己在/tmp目錄下創(chuàng)建了一個phaaaaaaA文件。
然后,對剛才的文件上傳頁面,我們用BP來抓包,分析一下POST上傳文件的結(jié)構(gòu)。
在回到web2.php,對這個網(wǎng)頁抓包。
對比一下這兩個包的結(jié)構(gòu),很明顯可以看出一個是POST傳參,一個是GET傳參?。我們將這兩個數(shù)據(jù)包都放到Rpeater模塊中去,進(jìn)行重放。
首先,我們要對之前web2.php這個頁面的參數(shù)進(jìn)行修改。?將GET改成POST,然后將Content-Type修改成和文件上傳的那個包里的格式相同。然后,就可以將重點(diǎn)放到 ? 后面的內(nèi)容。
第一個問題:這里為什么要用 ?><? 呢?
這里通過查找PHP的官方文檔可以知道,我們需要在 = 前面加上 ?> 來進(jìn)行閉合,這樣才能重新進(jìn)入到PHP模式。
第二個問題:為什么要使用 ` ` (反引號)?
因?yàn)閑val() 可以使用反引號來直接執(zhí)行系統(tǒng)命令。也就是eval()可以利用反引號來執(zhí)行命令,而反引號中的命令,可以在Linux下直接執(zhí)行。所以說此時,代碼執(zhí)行變成了命令執(zhí)行。
第三個問題:為什么要對其進(jìn)行編碼?
因?yàn)槭窃诘刂窓谥?#xff0c;所以要遵守URLcode編碼。而且需要注意的是,里面不能出現(xiàn)空格,需要用+來進(jìn)行連接。
第四個問題:這里為什么既有POST傳參又有GET傳參呢?
這里是PHP的一個流程。POST傳參和GET傳參是可以并行處理的,相互不會影響。
最后,直接send
成功執(zhí)行了。