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