文件上傳漏洞是什么
關鍵字:繞過
文件上傳是大部分Web應用都具備的功能,例如用戶上傳附件,改頭像,分享圖片等
文件上傳漏洞是在開發者沒有做充足驗證(包括前端、后端)情況下,運行用戶上傳惡意文件,這里上傳的文件可以使木馬、病毒、惡意腳本或者Webshell等
環境搭建(及靶機)
# 第一次啟動 docker pull registry.cn-shanghai.aliyuncs.com/yhskc/bwapp docker run -d -p 0.0.0.0:80:80 registry.cn-shanghai.aliyuncs.com/yhskc/bwapp docker container list -a # 查看 container id docker start xxx # xxx 就是上一步獲得的 container id,運行完這條命令后,訪問響應的網址即可
安裝
點擊here
安裝成功,注冊用戶
登錄
選擇最低級別的,文件上傳,點擊Hack
初級嘗試攻擊
准備一個簡單的一句話木馬
通過POST取得一個值,這個值是hacker里的一個值,將我們的值轉換為PHP代碼
演示上傳,並演示這段代碼的威力。
點擊瀏覽---》選擇shell.php,點擊上傳、
點擊here,可以看到shell.php上傳到images文件夾中
為什么回顯是空的呢?因為這里是POST請求,沒有攜帶任何參數。我們如何控制呢?
我們可以使用兩個PHP函數,來測試我們的Webshell
- get_current_user:獲取當前用戶名稱
- getcwd:獲取當前路徑地址
可以看到我們獲取當前用戶為www-data。
獲取到當前執行目錄
這里我們使用函數執行,工作效率太低,接來下使用中國菜刀。下載地址https://github.com/raddyfiy/caidao-official-version
打開中國菜刀
點擊空白處添加
添加地址,指定hacker字段,點擊添加,添加后雙擊打開
查看是否能夠執行命令,點擊鏈接右鍵,獲取虛擬終端
不同語言的一句話木馬
asp
<%execute(request("value"))%>
php
<?php @eval($_POST['hacker']); ?>
aspx
<%@ Page Language="Jscript"%> <%eval(Request.Item["value"])%>
其他
<%eval request("value")%> <%execute request("value")%> <%execute(request("value"))%>
初探文件上傳漏洞-->繞過
同樣是file upload 上傳頁,設置為中級,點擊set
我們還是上傳之間的文件,看看是不是還能上傳,點擊瀏覽,選擇之前的shell.php,點擊upload
這里出現上傳文件類型不允許。這時候我們要思考一下,限制文件類型,是限制文件后綴名,我們嘗試一下其他后綴名是否可以上傳。
將shell.php,復制一份叫shell.php3,看是否可以上傳
點擊上傳,可以看到成功上傳
我們上傳的shell.php1 不是常規的php文件,能否執行我們的之句話木馬的指令嗎?我們是curl指令測試一下
其實這里,只能上傳php3后綴的才能正常解析,我們看一下究竟是為什么。我們的靶機是通過apache2容器啟動的,我們來看一下apache2的配置。web-server 不知道后端使用的什么語言,但是對后端語言是具有解析能力的。這是我們看apache2是如何解析php語言的,這樣我們就知道為什么php3可以解析,而其他的不行。
通過這個配置我們可以看到加載了mods解析配置文件,所以我們進入這個文件夾查看所支持的mods,進入我們看到php5.conf的配置文件,我們查看一下如何配置的。
我們可以看到紅框中的配置,意思是當發現文件后綴是php3、4、5或者是phtml、pht的時候都會解析成php代碼。
文件上傳漏洞中級-->前端驗證繞過,.htaccess繞過,大小寫繞過
前端驗證繞過
很多網站、CMS都在使用,只在前端利用JavaScript驗證
漏洞利用流程:(兩個方法都可以)
- 通過Burp Suite抓包,然后修改內容放行
- 通過chrome禁止JavaScript代碼
.htaccess繞過
什么是.htaccess
.htaccess文件是分布式配置文件,使得配置文件可以隨文件夾不同而不同,其所放置的文件夾及所有子文件夾都會受此影響,其語法通apache主配置文件
如何利用.htaccess
場景:啟用.htaccess文件的網站,使用此文件類型來繞過限制較全面的黑名單過濾
繞過流程
1、上傳一個.htaccess文件,文件內容設置為【AddType application/x-httpd-php .test】
2、上傳一句話木馬文件,文件名設置為shell.php
3、在瀏覽器中訪問shell.test即可執行一句話木馬
大小寫繞過
這是一種比較簡單的繞過方式,同樣是針對黑名單過濾
如果想要上傳一個php木馬,那么我們可以上傳一個pHp即可。
文件上傳漏洞高級-->文件流繞過,字符串截斷繞過,文件頭檢查繞過
Windows文件流特性繞過
什么是Windows文件流?
NTFS文件系統實現了多文件流的特性,NTFS環境一個文件默認使用的是未命名的文件流, Windows資源管理器默認不顯示出文件的命名文件流,這些命名文件流在功能上和默認使用的未命名文件流一致,甚至可以用來啟動程序。
我們來用windows平台做一些測試
創建一個文件流
查看test.txt里是沒有內容的
我們使用notepad 打開文件流,我們可以看到文件內容是存在的
接下來把test打印到文件本身,看看文件是否發生變化
查看內容就在文件內
將默認數據流輸入222,
查看內容已經是222
這說明 我們在日常寫文件的過程中,是寫的他的默認數據流
字符串截斷繞過
字符串截斷繞過主要是編碼類的繞過。一般限制是通過白名單限制,例如上傳圖片,會過濾文件結尾不是jpg,png等上傳文件,理論上這種上傳是不好繞過的,但有部分上傳在保存文件的時候,是兩部分組成,一部分是上傳路徑,一部分是文件名,而路徑是從前端獲取的,所以我們可以采用在路徑上截斷。
案例
打開Burp 代理,點擊攔截功能,點擊上傳,將原來shell.php,修改成shell1.php.jpg,並上傳。
可以看到我們已經攔截了,他的請求,接下來我們修改一下內容。可以想一下我們目前要上傳這個文件的話,一定是叫shell1.php.jpg。接下來我們修改一下這個內容,我們在PHP后面加一個空格
空格的編碼是20,便於我們在16進制中查找
接下來我們將20改成00
點擊發送,這樣就繞過了。
文件頭檢查繞過
常見的文件頭格式
png的文件頭
jpg的文件頭
如何實現文件頭繞過呢?
有一些情況下,文件上傳是要檢查文件內容呢?一般就是檢查文件頭,我們可以把php代碼內容追加到一個jpg或者png圖片里,這樣就能繞過文件頭檢查。(簡單說就是把php木馬和圖片文件合並)
防御措施
1、文件類型檢查:白名單優於黑名單
2、使用安全的函數編程
3、熟悉業務不熟的OS、Web Server配置