【W(wǎng)eb滲透】文件上傳漏洞
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
一、文件上傳漏洞介紹 文件上傳:文件上傳是現(xiàn)代互聯(lián)網(wǎng)常見的功能,允許用戶上傳圖片、視頻、及其他類型文件,向用戶提供的功能越多,web受攻擊的風(fēng)險(xiǎn)就越大。 1、文件上傳漏洞上傳文件時(shí),如果未對上傳的文件進(jìn)行嚴(yán)格的驗(yàn)證和過濾,就容易造成文件上傳漏洞,上傳腳本文件(asp、aspx、php、jsp等) 注:asp,aspx對應(yīng)iis解析;php對應(yīng)apache解析;jsp對應(yīng)java(tomcat) 惡意上傳行為可能導(dǎo)致網(wǎng)站甚至整個(gè)服務(wù)器被控制。惡意的腳本文件又被稱為Webshell。Webshell具有強(qiáng)大的功能。如查看服務(wù)器目錄、服務(wù)器中文件、執(zhí)行系統(tǒng)命令等。 二、JS檢查繞過1、檢測原理調(diào)用JS的toLowerCase()函數(shù),先將文件名轉(zhuǎn)換為小寫,然后通過substr獲取文件名后面最后一個(gè)點(diǎn)號后面的后綴(包括點(diǎn)號)進(jìn)行判斷。 substr()返回字符串 //enctype=“multipart/form-data” 專門處理文件上傳的文件流 //return selectFile() 提供點(diǎn)擊提交按鈕,完成文件上傳 (一)JS繞過1、網(wǎng)站源碼構(gòu)造(1)前端代碼
(2)后端代碼 2、網(wǎng)站訪問前端代碼,瀏覽器前端繞過文件上傳注:這里網(wǎng)站的過濾僅為前端過濾,這里前端代碼只允許后綴名偽".jpg"的文件上傳。我們先去嘗試瀏覽器前端過濾。
如圖:通過F12打開開發(fā)者模塊,將onsubmit的值刪除,這里οnsubmit=""調(diào)用的函數(shù)即為我們編寫的判斷(過濾)方法。將此處值刪除后再次點(diǎn)擊上傳我們想要上傳的任意文件,觀察實(shí)驗(yàn)結(jié)果并訪問上傳后的文件
注:這里我們發(fā)現(xiàn)通過修改前端頁面的值,成功上傳并解析了文件 3、使用burpsuit抓包,這里必須先上傳jpg格式的文件注:這里我們可以先將我們想要上傳的php文件后綴直接改為jpg。也可使用合成圖片碼的方式,抓包后將后綴再改回我們需要上傳的文件后綴,放包后觀察結(jié)果。
注:這里將33.jpg文件后綴修改回.php后放包,文件即可成功上傳。
這里我們成功上傳并解析了我們想要上傳的文件,同理,我們可以繞過上傳任何我們想要上傳的任何文件。 注:圖片碼合成方法,代碼1、將圖片與我們想要合成的代碼放入同一文件夾下,在文件夾下打開CMD命令框,輸入下面命令copy 1.jpg/b +1.php/a 2.jpg 這里是將1.jpg與1.php文件合并,生成新圖片2.jpg 三、文件后綴繞過1、檢測原理通過函數(shù)pathinfo()獲取文件后綴,將后綴轉(zhuǎn)為小寫后判斷是不是php 注:pathinfo() 返回文件路徑的信息 2、繞過方法1有些中間件允許解析其他文件后綴的,如在httpd.conf配置文件中,配置如下代碼,則能解析php、php3、phtml文件。所以上傳一個(gè)后綴名為php3、phphtml的文件即可繞過黑名單。
注:這里添加消息的含義是要能夠解析php3,phtml 這里是將添加的這兩種后綴按照php文件解析 3、繞過方法2(apache解析漏洞)結(jié)合Apache文件解析機(jī)制,從右向左開始解析文件后綴,若后綴名不可識別,則繼續(xù)判斷直到遇到可解析的后綴為止,若全部不認(rèn)識,則會(huì)暴露文件內(nèi)容。 4、繞過方法3(windows特性:文件流繞過)在程序開發(fā)部署的時(shí)候,沒有考慮到系統(tǒng)的特性會(huì)導(dǎo)致限制被繞過,利用windows特性。可以在后綴名中加"."或"::$DATA"繞過 注:這里我們給文件名直接加. windows本身特性會(huì)自動(dòng)刪除,限制如此修改文件后綴,這里就需要使用burpsuit來進(jìn)行修改 (二)文件后綴繞過(黑名單繞過)1、源碼構(gòu)造(1)前端代碼
(2)后端代碼 2、網(wǎng)站訪問我們的前端代碼,進(jìn)行文件上傳,觀察相關(guān)結(jié)果
注:這里我們嘗試上傳了.jpg .txt .php這里我們發(fā)現(xiàn)只有php的文件無法上傳,通過代碼我們也可以知道,此處是將php的文件加入了黑名單,不允許后綴為php的文件上傳。 3、畸形文件名上傳繞過這里我們上傳一個(gè)后綴名為php3的文件,如下圖,我們發(fā)現(xiàn)上傳成功,但是訪問該文件時(shí),php文件未解析。
注:我們此模塊的內(nèi)容主要講文件解析及上傳,這里文件上傳已經(jīng)成功,接下來要做的就是文件解析 4、根據(jù)課件筆記提示,修改httpd.conf配置文件(1)打開phpstudy面板,點(diǎn)擊【設(shè)置】–>【配置文件】–>【httpd.conf】–>點(diǎn)擊apache的版本 打開文件
(2)在文件處使用Ctrl+F 進(jìn)行查找,先去查找AddType 如圖:找到如下內(nèi)容,在下面加入以下3條命令
AddType application/x-http-php .php AddType application/x-http-php .php3 AddType application/x-http-php .phtml
注:這里添加消息的含義是要能夠解析php3,phtml 這里是將添加的這兩種后綴按照php文件解析 5、修改完配置文件后,重啟apache服務(wù),重新訪問剛才上傳成功的.php3文件這里我們再次訪問上傳的.php3可以發(fā)現(xiàn)php文件可以正常解析。 6、apache解析漏洞修改文件名為.php.XX 這里XX可以是數(shù)字,也可以是字母,根據(jù)apache解析漏洞來進(jìn)行上傳繞過 7、windows特性繞過使用burpsuit抓包來對文件后綴進(jìn)行修改 可以在后綴名中加"."或"::$DATA"繞過 繞過上傳成功后在文件根目錄注意觀察我們上傳文件的后綴名。
四、文件類型繞過1、檢測原理判斷$_FILES["file"]["type"]是不是圖片格式(image/gif、image/jpeg、image/pjpeg),不是則不允許上傳。 $_FILES["file"]["type"]的值是從請求數(shù)據(jù)包中Content-type中獲取的 注:我們這里的類型檢測,也是有相應(yīng)的配置文件與之對應(yīng)的,檢測文件類型的配置文件為mime.types 文件位置為: D:\phpstudy_pro\Extensions\Apache2.4.39\conf\mime.types
注:這里我們可以看到各種文件類型與對應(yīng)關(guān)系 2、繞過方法1通過抓取數(shù)據(jù)請求包,上傳php文件時(shí),Content-Type值為application/octer-stream,上傳jpg的文件時(shí)Content-Type值為image/jpeg??尚薷奈募愋瓦M(jìn)行繞過。 3、繞過方法2如果代碼使用getimagesize()函數(shù)獲取圖片的寬高等信息,如果上傳的不是圖片,那么則獲取不到信息。 在圖片文件腳本文件開頭補(bǔ)充圖片對應(yīng)的頭部值,或在圖片后寫入腳本代碼(這里就是第一節(jié)課講過的圖片+代碼合成新圖片的知識模塊) (1)方法1 這里我們將文件頭部值寫入文件即可 注:下圖顯示的47 49 46……這些是16進(jìn)制數(shù),可以通過01編輯器進(jìn)行編輯,我們通過nt++編輯時(shí)可直接在代碼前面編寫GIF89a,我們可以通過編碼轉(zhuǎn)換進(jìn)行驗(yàn)證。
(2)方法2 合成圖片這種方法前面已經(jīng)講過,這里不再講。下面再將一種方式 直接將圖片使用記事本模式打開,在亂碼后面直接加入我們需要加入的PHP代碼。 注:這里我們修改完后文件后綴名依舊是.JPG 我們雖然修改了文件內(nèi)容,但是上傳成功后.JPG文件依舊無法解析。這里我們要將添加完代碼的圖片后綴名改為.php后再次上傳,上傳后即可實(shí)現(xiàn)解析。但這里操作沒有方法1方便,操作時(shí)也可將合成圖片上傳后,在burpsuit中將后綴名改為php后放包,即可實(shí)現(xiàn)上傳繞過,也可實(shí)現(xiàn)解析。 (三)文件類型繞過(白名單繞過)1、源碼構(gòu)造(1)前端代碼
(2)后端代碼 2、訪問源文件,上傳各種類型文件并觀察結(jié)果這里我們發(fā)現(xiàn),無論是上傳jpg/png…凡是圖片類型的文件均可上傳,php/txt…其他類型文件均不能上傳。通過代碼我們可以發(fā)現(xiàn),這里是通過白名單的方式,只允許圖片類型的文件上傳,只有在白名單之內(nèi)的文件才可以上傳,這里我們發(fā)現(xiàn),單純通過瀏覽器,網(wǎng)頁前端,我們無法做任何繞過與修改。我們依舊需要使用burpsuit抓包的方式去進(jìn)行繞過。 3、使用burpsuit抓包,修改文件類型進(jìn)行上傳繞過
(1)將文件類型修改為Content-Type:image/jpeg放包后觀察是否文件上傳成功
注:這里我們發(fā)現(xiàn)文件不僅上傳成功,并且成功解析 (四)文件類型繞過(getimagesize繞過)1、文件代碼構(gòu)造(1)網(wǎng)站前端代碼構(gòu)造
(2)網(wǎng)站后端代碼構(gòu)造 2、 在圖片文件腳本文件開頭補(bǔ)充圖片對應(yīng)的頭部值,進(jìn)行繞過
這里我們可以看到文件成功繞過并上傳,訪問文件,觀察結(jié)果 3、合成圖片碼,使用burpsuit抓包后,修改文件后綴名,放包觀察實(shí)驗(yàn)結(jié)果
如圖:圖片亂碼后面就是我們寫入的代碼,根據(jù)圖片步驟,抓包后修改后綴,放包,觀察結(jié)果
可以看到放包后成功上傳,訪問該文件,查看能否成功解析執(zhí)行
可以看到這里文件成功解析,圖片在文件中為亂碼形式,后面加入的php代碼phpinfo();成功解析 五、文件截?cái)嗬@過1、檢測原理由于00代表結(jié)束符,PHP會(huì)把00后面的所有字符刪除 截?cái)鄺l件:PHP版本小于5.3.4、magic_quotes_gpc為OFF狀態(tài) 注:magic_quotes_gpc參數(shù)設(shè)置在phpstudy面板中【設(shè)置】–>【配置文件】–>【php.ini】–>【php5.2.17nts】打開文件,然后查找(Ctrl+F)magic_quotes_gpc參數(shù)設(shè)置為OFF 這里必須要下載一個(gè)版本低于5.3.4的php,然后將網(wǎng)站的php版本修改為低版本。
注:魔術(shù)引號:magic_quotes_gpc=On時(shí),會(huì)把引號進(jìn)行轉(zhuǎn)義。php版本升級后將magic_quotes_gpc函數(shù)丟棄,使用了新的轉(zhuǎn)義函數(shù)。 2、繞過方法GET方法中加入%00截?cái)?/span> POST方法中傳入00并解碼 注:我們上傳的文件進(jìn)行了重命名,所以才會(huì)有我們的上傳00截?cái)?/span> (五)00截?cái)啵℅ET)1、網(wǎng)站源碼構(gòu)造2、訪問網(wǎng)站,上傳相關(guān)文件,觀察總結(jié)這里通過上傳我們發(fā)現(xiàn),只有白名單內(nèi)的文件后綴才能夠上傳,白名單外的文件(如php)均不可上傳。我們通過瀏覽器前端也無法再做什么其他可繞過的方式,我們通過抓包去嘗試?yán)@過。
如圖:上圖標(biāo)記的地方是GET方式的GET請求表單,在jieduan=./upload/后加上2.php后放包進(jìn)行觀察
注:我們這里上傳了一個(gè)圖片碼 放包后我們可以看到文件上傳成功,但是我們上傳的文件名這里重疊了一個(gè)2.php(802020…)我們正常訪問這個(gè)文件依舊可以解析,解析后是一個(gè)圖片。我們接下來嘗試去00截?cái)?/span> 3、上傳圖片碼(內(nèi)含代碼),通過burPOSTpsuit抓包使用00截?cái)噙M(jìn)行繞過
如圖:在GET請求后加入2.php%00 后放包,觀察我們的頁面
如圖,根據(jù)回顯文件地址,去訪問該文件
這里我們發(fā)現(xiàn)回顯的文件404錯(cuò)誤,找不到文件 4、去掉php后面的一長串字符串,僅訪問php文件
這里我們發(fā)現(xiàn),我們成功上傳并解析了剛才上傳的圖片碼,這里就是00截?cái)嗟囊环N繞過方式(GET方式) (五)00截?cái)啵≒OST)1、網(wǎng)站源碼構(gòu)造2、點(diǎn)擊訪問文件,上傳相應(yīng)文件,并觀察總結(jié)這里我們依舊發(fā)現(xiàn)只有白名單內(nèi)的文件允許上傳,其他文件均不允許上傳 3、使用burpsuit抓取數(shù)據(jù)包,并觀察與GET方式的不同
注:這里我們發(fā)現(xiàn)POST請求與GET請求的不同之處。首先是URL處不帶請求,但是文本內(nèi)容重點(diǎn)出現(xiàn)了./upload 這里便是我們的POST請求,POST請求需要 4、在Raw視圖下將"./upload" 修改為"./upload/2.php00"并在Hex視圖下修改0處編碼
如圖,找到上步修改文件名的位置,修改00處的編碼為00(30–>00)前面我們給php后面加的00是為了更快更準(zhǔn)確的找到文件后綴名所在的位置。16進(jìn)制修改為00后再去觀察Raw視圖 如圖:修改完成后我們輸入的00會(huì)轉(zhuǎn)換為兩個(gè)框型圖案 5、釋放修改后的數(shù)據(jù)包,驗(yàn)證是否上傳并解析成功。
如圖,我們看到文件上傳成功,同上面操作過程,檢驗(yàn)文件是否能夠正常解析
這里我們看到文件成功上傳并成功解析,00截?cái)喑晒?/span> 六、文件內(nèi)容繞過1、檢查原理一些網(wǎng)站文件檢測邏輯是先允許上傳任意文件,然后檢查文件內(nèi)容是否包含可執(zhí)行腳本,如果包含則刪除。這里使用sleep()函數(shù)來模擬判斷是否含有腳本所需要的時(shí)間。 2、繞過方法利用成功上傳到刪除的時(shí)間差,上傳一個(gè).php文件,在未刪除之前立即訪問,則會(huì)自動(dòng)生成一個(gè)新php文件,新文件不會(huì)被刪除。 (六)文件內(nèi)容繞過1、源碼構(gòu)造(1)前端代碼
(2)后端代碼 2、點(diǎn)擊訪問文件,上傳相應(yīng)文件,并觀察總結(jié)這里我們發(fā)現(xiàn)任意文件均可上傳,這里上傳時(shí)我們需要等待10s才可上傳成功,這里我們模擬文件上傳,上傳后再經(jīng)過檢查將文件刪除的過程。 3、上傳下面代碼,點(diǎn)擊訪問該文件,即可成功生成shell.php這里可以在10s等待,文件還未上傳成功時(shí),點(diǎn)擊訪問,即可生成新文件shell.php 注:這里是模擬競爭上傳環(huán)境,我們一邊上傳,系統(tǒng)會(huì)自動(dòng)刪除我們上傳的文件,這里就需要快速訪問上傳文件,只要訪問到剛才上傳的文件,即可實(shí)現(xiàn)我們想要寫入的文件生成。
點(diǎn)擊訪問上傳后文件,看是否會(huì)生成新的文件
如圖,這里的shell.php是我們訪問上一步上傳文件后生成的新文件,這里文件內(nèi)容可以自行控制,可以寫入我們想要的任何文件。 該文章在 2023/12/5 11:08:09 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |