詳解php命令注入攻擊
這次實(shí)驗(yàn)內(nèi)容為了解php命令注入攻擊的過(guò)程,掌握思路。
命令注入攻擊
命令注入攻擊(Command Injection),是指黑客通過(guò)利用HTML代碼輸入機(jī)制缺陷(例如缺乏有效驗(yàn)證限制的表格域)來(lái)改變網(wǎng)頁(yè)的動(dòng)態(tài)生成的內(nèi)容。從而可以使用系統(tǒng)命令操作,實(shí)現(xiàn)使用遠(yuǎn)程數(shù)據(jù)來(lái)構(gòu)造要執(zhí)行的命令的操作。
PHP中可以使用下列四個(gè)函數(shù)來(lái)執(zhí)行外部的應(yīng)用程序或函數(shù):system、exec、passthru、shell_exec。
信息來(lái)源——合天網(wǎng)安實(shí)驗(yàn)室
命令攻擊為什么會(huì)形成漏洞?
首先是因?yàn)閼?yīng)用需要調(diào)用一些執(zhí)行系統(tǒng)命令的函數(shù),比如上面說(shuō)的php中的system等函數(shù)。其次,當(dāng)用戶能夠控制這些函數(shù)中的參數(shù),就可以將一些惡意的命令拼接到一個(gè)正常的命令當(dāng)中,然后就會(huì)造成命令執(zhí)行漏洞。
所以我們可以得出命令執(zhí)行漏洞需要的條件:
- 應(yīng)用調(diào)用的執(zhí)行系統(tǒng)命令的函數(shù)
- 用戶可以對(duì)命令進(jìn)行控制,從而拼接惡意命令
- 應(yīng)用沒(méi)有對(duì)用戶的輸入進(jìn)行過(guò)濾或者過(guò)濾不嚴(yán)格
通過(guò)命令執(zhí)行漏洞,我們可以讀寫一些服務(wù)器上的文件,并且這些文件是不想讓用戶看到的,比如密碼類的敏感文件。而且,我們可以通過(guò)命令打開服務(wù)器的遠(yuǎn)程服務(wù),這樣就可以拿到服務(wù)器的shell,從而操控服務(wù)器或者這個(gè)網(wǎng)頁(yè)。再者,我們還可以對(duì)內(nèi)網(wǎng)進(jìn)行進(jìn)一步的滲透。
下面開始實(shí)驗(yàn)。
1.使遠(yuǎn)程服務(wù)器執(zhí)行whoami
的命令。(whoami命令是查詢當(dāng)前用戶身份的命令,比如管理員或普通用戶)
打開實(shí)驗(yàn)環(huán)境,如下圖所示,我們要使其執(zhí)行whoami
命令。
從返回的結(jié)果來(lái)看服務(wù)器應(yīng)該是windows系統(tǒng),后面有補(bǔ)充。
服務(wù)器中關(guān)鍵代碼如下:
程序獲取GET參數(shù)ip,然后拼接到system()函數(shù)中,利用system()函數(shù)執(zhí)行ping的功能,但是此處沒(méi)有對(duì)參數(shù)ip進(jìn)行過(guò)濾和檢測(cè),導(dǎo)致可以利用管道符執(zhí)行其它的系統(tǒng)命令,后面有管道符的補(bǔ)充。
“|”在windows中的意思是:把前面的結(jié)果當(dāng)成后面的輸入,我們用ip=127.0.0.1|whoami
來(lái)試一下
后面的命令執(zhí)行成功,得到我們的身份是system
“&”在windows中的意思是:兩條命令一起執(zhí)行,先執(zhí)行前面再執(zhí)行后面,我們用ip=127.0.0.1&whoami
來(lái)試一下
可以看出whoami
命令并沒(méi)有成功被執(zhí)行,原因是在ulr中,“&”是一個(gè)連接符號(hào),會(huì)被轉(zhuǎn)義成“%26”,那我們直接使用“%26”,它就會(huì)被轉(zhuǎn)義成真正的“&”,所以我們不妨使用ip=127.0.0.1%26whoami
再試一下
命令執(zhí)行成功,可以看到服務(wù)器執(zhí)行了兩個(gè)命令(ping和whoami),我們的身份是system
“||”在windows中的意思是:當(dāng)前面一個(gè)執(zhí)行失敗,則執(zhí)行后面的,我們用ip=127.0.0.1||whoami
來(lái)試一下
這一次whoami
命令并沒(méi)有被執(zhí)行,這是因?yàn)榍懊娴拿羁梢詧?zhí)行,我們只要把前面的命令搞成不能執(zhí)行的,讓它自動(dòng)執(zhí)行下一條命令,根據(jù)前面提供的關(guān)鍵代碼,我們知道只要傳入了正常的ip地址,命令(ping)就會(huì)成功執(zhí)行,所以我們?cè)囋嚢裪p地址消除,用ip=||whoami
來(lái)試一下
命令執(zhí)行成功,我們的身份是system
2.使遠(yuǎn)程服務(wù)器執(zhí)行ipconfig命令
服務(wù)器的關(guān)鍵代碼如下
補(bǔ)充一下:
preg_match() 函數(shù)用于進(jìn)行正則表達(dá)式匹配,成功返回 1 ,否則返回 0 。
preg_match() 匹配成功一次后就會(huì)停止匹配,如果要實(shí)現(xiàn)全部結(jié)果的匹配,則需使用 preg_match_all() 函數(shù)。
header()函數(shù)的作用是:發(fā)送一個(gè)原始 HTTP 標(biāo)頭[Http Header]到客戶端。標(biāo)頭 (header) 是服務(wù)器以 HTTP 協(xié)義傳 HTML 資料到瀏覽器前所送出的字串,在標(biāo)頭與 HTML 文件之間尚需空一行分隔。
這段代碼對(duì)ip地址進(jìn)行了簡(jiǎn)單的過(guò)濾,如果它匹配到,它會(huì)執(zhí)行下面system那條命令,如果它沒(méi)有匹配到,它就無(wú)法執(zhí)行下面那條命令(即ping),也就是我們開始時(shí)看到的界面:
所以,我們想要讓服務(wù)器執(zhí)行ipconfig,首先想到的思路就是讓它發(fā)生錯(cuò)誤,執(zhí)行失敗,使用雙管道讓它執(zhí)行ipconfig,接下來(lái)我們用ip=127.||ipconfig
試一下:
成功
同理,我們使用單管道(ip=127.0.0.1|ipconfig
)試一試:
成功
繼續(xù),我們使用“%26”(ip=127.0.0.1%26ipconfig
)試一試:
執(zhí)行了兩個(gè)命令,成功!
知識(shí)補(bǔ)充
我們可以通過(guò)ping命令返回結(jié)果中的TTL項(xiàng)查看服務(wù)器的操作系統(tǒng):LINUX——64 WIN2K/NT——128 WINDOWS系列——32 UNIX系列——255(前面為操作系統(tǒng),后面為TTL值) 通過(guò)ping返回結(jié)果,看TTL值與哪項(xiàng)最為接近,服務(wù)器就是哪個(gè)操作系統(tǒng)。
我們ping一下百度的試試
TTL值為52,則它與64之間跨了12個(gè)路由,所以它的服務(wù)器應(yīng)該是LINUX。
接下來(lái)補(bǔ)充一些常用的管道符:
Windows系統(tǒng)支持的管道符如下:
- “|”:直接執(zhí)行后面的語(yǔ)句。
- “||”:如果前面的語(yǔ)句執(zhí)行失敗,則執(zhí)行后面的語(yǔ)句,前面的語(yǔ)句只能為假才行。
- “&”:兩條命令都執(zhí)行,如果前面的語(yǔ)句為假則直接執(zhí)行后面的語(yǔ)句,前面的語(yǔ)句可真可假。
- “&&”:如果前面的語(yǔ)句為假則直接出錯(cuò),也不執(zhí)行后面的語(yǔ)句,前面的語(yǔ)句為真則兩條命令都執(zhí)行,前面的語(yǔ)句只能為真。
Linux系統(tǒng)支持的管道符如下:
- “;”:執(zhí)行完前面的語(yǔ)句再執(zhí)行后面的語(yǔ)句。
- “|”:顯示后面語(yǔ)句的執(zhí)行結(jié)果。
- “||”:當(dāng)前面的語(yǔ)句執(zhí)行出錯(cuò)時(shí),執(zhí)行后面的語(yǔ)句。
- “&”:兩條命令都執(zhí)行,如果前面的語(yǔ)句為假則執(zhí)行執(zhí)行后面的語(yǔ)句,前面的語(yǔ)句可真可假。
- “&&”:如果前面的語(yǔ)句為假則直接出錯(cuò),也不執(zhí)行后面的語(yǔ)句,前面的語(yǔ)句為真則兩條命令都執(zhí)行,前面的語(yǔ)句只能為真。
總結(jié)一下:這種需要分析代碼的問(wèn)題一定不能大意,需要認(rèn)真讀懂什么意思才能破解它的秘密。這次實(shí)驗(yàn)并不是很難,以前在做CTF——Web題有遇到過(guò),那種跟這個(gè)差不多,通過(guò)分析代碼構(gòu)造url獲取flag。
以上所述是小編給大家介紹的php命令注入攻擊詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
簡(jiǎn)介PHP的Yii框架中緩存的一些高級(jí)用法
這篇文章主要介紹了PHP的Yii框架中緩存的一些高級(jí)用法,包括頁(yè)面緩存與會(huì)話緩存限制器等內(nèi)容,需要的朋友可以參考下2016-03-03php park、unpark、ord 函數(shù)使用方法(二進(jìn)制流接口應(yīng)用實(shí)例)
在工作中,我也逐漸了解到park,unpark,ord對(duì)于二進(jìn)制字節(jié)處理的強(qiáng)大。 下面我逐一介紹它們。2010-10-10php基于Fleaphp框架實(shí)現(xiàn)cvs數(shù)據(jù)導(dǎo)入MySQL的方法
這篇文章主要介紹了php基于Fleaphp框架實(shí)現(xiàn)cvs數(shù)據(jù)導(dǎo)入MySQL的方法,涉及PHP基于Fleaphp框架針對(duì)cvs文件的讀取及數(shù)據(jù)庫(kù)操作相關(guān)技巧,需要的朋友可以參考下2016-02-02簡(jiǎn)單實(shí)用的PHP防注入類實(shí)例
這篇文章主要介紹了簡(jiǎn)單實(shí)用的PHP防注入類實(shí)例,以兩個(gè)簡(jiǎn)單的防注入類為例介紹了PHP防注入的原理與技巧,對(duì)網(wǎng)站安全建設(shè)來(lái)說(shuō)非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12PHP實(shí)現(xiàn)會(huì)員賬號(hào)單唯一登錄的方法分析
這篇文章主要介紹了PHP實(shí)現(xiàn)會(huì)員賬號(hào)單唯一登錄的方法,結(jié)合實(shí)例形式分析了php基于session與文件讀寫的單一用戶登陸限制實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03PHP管理依賴(dependency)關(guān)系工具 Composer的自動(dòng)加載(autoload)
Composer 是PHP的一個(gè)包依賴管理工具,類似Ruby中的RubyGems或者Node中的NPM,它并非官方,但現(xiàn)在已經(jīng)非常流行。此文并不介紹如何使用Composer,而是關(guān)注于它的autoload的內(nèi)容吧。2014-08-08PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法,結(jié)合實(shí)例形式分析了php操作session的機(jī)制與提高session響應(yīng)速度的常見操作技巧,需要的朋友可以參考下2019-08-08