我们来测试dvwa的文件上传漏洞.我们先干,后分析代码
我们发现上传界面是这样的
那我们按照要求来随便上传一个文件,我现在直接上传一个php文件,内容为
phpinfo();
?>
选择文件后点击上传可以发现页面有回显上传成功的提示和上传的路径
那么我们可以直接根据这个链接去访问下,看是否能够正常访问刚才上传成功的文件
上传成功,并且访问成功,那么我们可以使用类似于菜刀,中国蚁剑,冰蝎等工具来链接webshell
Low级别的代码:
Your image was not uploaded.
';
}
else {
// Yes!
echo "{$target_path} succesfully uploaded!"; } } ?>
可以看到代码对上传的文件没有任何限制和过滤,存在明显的上传漏洞,成功上传后会提示路径+succesfully uploaded
上传失败则会提示 your image was not uploaded
basename(path,suffix),该函数返 回路径中的文件名部分,如果可选参数suffix为空,则返回的文件名包含后缀,反之则不包含文件名后缀
我们发现直接上传php文件被阻止了
哎呀,被阻止了就很烦,那么现在有几种绕过方式
第一种:我们上传图片马
第二种:我们抓包分析,看是否可以通过修改type类型来绕过
第三种:00截断
那我们一个一个来尝试
第一种:上传图片马,将图片和php一句话木马合并上传[high级别有解释]
第二种:抓包修改type类型
我们将默认的type类型修改为如下格式
image/jpeg
放过看是否绕过,嘿,成功上传,这个方法可行
第三种:00截断
在php<5.3.4中,处理字符串的函数认为0x00是终止符。那么我们可以利用 00截断 漏洞来上传我们的一句话木马。网站上传函数处理1.php%00.jpg时,首先后缀名是合法的jpg格式,可以上传,在保存文件时,使用burpsuite进行包拦截,找到上传的路径,把文件名改为 1.php[空格].jpg ,十六进制查看,空格的十六进制代码为20,将其修改为 00。后端在判断文件后缀名的时候遇到%00字符丢弃后面的jpg,文件后缀最终保存的后缀 名为 1.php。然后我们就可以用我们的菜刀等管理工具连接了。
我们将文件命名为php.jpg
抓包后我们将数据内容发送到repeater模块里并文件名修改为ceshi.php .jpg
修改后查看16进制
我们将其修改为00
然后查看,这里我可能是burp内置的编码问题,没有显示变化,按理来说它会显示一个这样的[]东西,不过点击go显示可以上传成功,说明我们这个绕过也是成功了
我们还可以使用burp的的url-decode功能来进行快捷绕过
我们重新上传抓包并将文件名修改为:ceshi.php%00.jpg
这时我们选中%00进行操作
完成后发现文件名已经发现改变了,点击go发现文件上传成功,绕过成功!
medium级别代码:
Your image was not uploaded.
';
}
else {
// Yes!
echo "{$target_path} succesfully uploaded!"; } } else { // Invalid file echo '
Your image was not uploaded. We can only accept JPEG or PNG images.'; } } ?>
可以看到代码里对上传的类型和大小做了限制,只允许上传格式为jpeg和png格式,上传大小为小于100000字节
我们直接上传一句话木马,发现失败,然后把后缀名该为jpg,也不行,看来仅仅是后缀名改了不行,文件内容必须是图片格式的
我们可以直接在某个图片的后面加上一句话,也可以使用linux或windows下的文件合并,然后上传
可以看到提示上传成功,但是现在我们无法去连接怎么办,必须让它作为php解析,那么我们可以使用文件包含漏洞来让图片木马以php格式运行
我们访问http://127.0.0.1/vulnerabilities/fi/?page=file:////var/www/html/hackable/uploads/timg2.jpeg
我们看到图片成功被解析为PHP格式了,现在我们用菜刀去连接这个连接即可.
high级别代码:
Your image was not uploaded.
';
}
else {
// Yes!
echo "{$target_path} succesfully uploaded!"; } } else { // Invalid file echo '
Your image was not uploaded. We can only accept JPEG or PNG images.'; } } ?>
strrpos(string , find ,start) 查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始
substr(string,start,length) 返回string字符中从start开始的字符串,length参数可选,表示返回字符的长度
strtolower(string) 返回给定字符串的小写
getimagesize(string) :函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING级的错误。所以 getimagesize函数的作用是判断上传的文件是不是有效的图片
move_uploaded_file(file,newlocal) 函数表示把给定的文件移动到新的位置
所以 $uploaded_ext 表示的是上传文件的后缀名 ,这里限制上传的文件的后缀名必须以 jpg 、jpeg 或 png 结尾,同时大小<100000,同时上传的文件必须是有效的图片格式(不只是以图片的格式结尾,而且文件内容是图片格式的)
impossible级别就不说了,如果可以绕过请各位看官评论指教
借鉴的优秀文章如下:
DVWA之File Upload (文件上传漏洞)