当前位置: 首页 > article >正文

【DVWA】File Upload任意文件上传实战

何必择地,何必择时,但问立志之真不真耳

1.File Upload(Low)

相关代码分析

<?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' ] );
 
	// Can we move the file to the upload folder?
	if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
		// No
		$html .= '<pre>Your image was not uploaded.</pre>';
	}
	else {
		// Yes!
		$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
	}
}
 
?>

basename(path,suffix)

函数返回路径中的文件名部分,如果可选参数suffix为空,则返回的文件名包含后缀名,反之不包含后缀名。

可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息。

文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。

上传文件1.php(一句话木马)

上传成功并且返回了路径

在这里插入图片描述

蚁剑连接,拿到shell

在这里插入图片描述

2.File Upload(Medium)

相关代码分析

在这里插入图片描述

可以看到,Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB)。

第一种方法,修改文件类型为image/png

在这里插入图片描述

放包,成功上传

在这里插入图片描述

第二种方法,将木马文件写成.png后缀上传,然后修改文件后缀为.php

在这里插入图片描述

放包,成功上传

在这里插入图片描述

第三种方法,%00截断上传,将文件名改为shell.php%00.png

在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以将文件名改为shell.php%00.png

可以看到,包中的文件类型为image/png,可以通过文件类型检查。

在这里插入图片描述

上传成功

在这里插入图片描述

而服务器会认为其文件名为shell.php,顺势解析为php文件。由于本次实验环境的php版本为5.5.9,所以无法进行验证。

在这里插入图片描述

3.File Upload(High)

相关代码分析

在这里插入图片描述

strrpos(string,find,start)

函数返回字符串find在另一字符串string中最后一次出现的位置,如果没有找到字符串则返回false,可选参数start规定在何处开始搜索。

getimagesize(string filename)

函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。

可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

尝试上传一个一句话后门的图片格式脚本 shell.png

在这里插入图片描述

发现即使图片类型为png的, 但是当内容非图片格式的时候, 也不能上传

在这里插入图片描述

第一种方法,可以通过添加jpg图片的格式头到脚本文件里进行绕过

首先在文本文档里写入<?php phpinfo();?>文件后缀修改为.jpg

在这里插入图片描述

上传文件,抓包,在脚本文件前加上GIF89,放包

在这里插入图片描述

成功上传

在这里插入图片描述

第二种方法,在图片文件内容后添加<?php phpinfo();?>

命令行输入copy 1.jpg/b + shell.php/a 2.jpg

在这里插入图片描述

点击上传

在这里插入图片描述

文件上传成功

在这里插入图片描述

上传之后的脚本是图片格式的, 不能当做php解析,

webshell管理工具的原理是向上传文件发送包含参数的post请求,通过控制参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。

如果让让我们的图片以 php 格式运行,可以借助High级别的文件包含漏洞来获取webshell权限,让我们的图片格式的一句话木马以php格式运行。

第一种方法,构造url:

/vulnerabilities/fi/?page=file:var/www/html/hackable/uploads/phpinfo.jpg

在这里插入图片描述

成功解析phpinfo文件

第一种方法,构造url:

/vulnerabilities/fi/?page=file:var/www/html/hackable/uploads/2.jpg

可以看到, jpg的木马图片被当做php解析了

在这里插入图片描述

4.File Upload(Impossible)

相关代码分析

在这里插入图片描述

imagecreatefromjpeg ( filename )

函数返回图片文件的图像标识,失败返回false

imagejpeg ( image , filename , quality)

从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。

imagedestroy( img )

函数销毁图像资源

可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业

CSDN: 
https://rdyx0.blog.csdn.net/

公众号:儒道易行
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect

博客:
https://rdyx0.github.io/

先知社区:
https://xz.aliyun.com/u/37846

SecIN:
https://www.sec-in.com/author/3097

FreeBuf:
https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85

http://www.kler.cn/a/412399.html

相关文章:

  • Spring 框架中AOP(面向切面编程)和 IoC(控制反转)
  • 基于Matlab实现Gabo滤波器(源码)
  • 适用于学校、医院等低压用电场所的智能安全配电装置
  • C++设计模式-中介者模式
  • 问题记录-Java后端
  • Linux下一次性关闭多个同名进程
  • 运维面试题.云计算面试题
  • Scala身份证上的秘密以及Map的遍历
  • arcgis for js FeatureLayer和GeoJSON一个矢量点同时渲染图形和文本
  • Android按键点击事件三种实现方法
  • 88页精品PPT | 某电信集团大数据平台建设方案技术交流
  • JAVA-IO
  • 【iOS】UICollectionView的学习
  • CTF之密码学(BF与Ook)
  • SpringBoot集成ESAPI
  • 深入理解 Spring Boot 的 WebApplicationType
  • 设计模式:11、迭代器模式(游标)
  • 修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题
  • SpringBoot(三十六)SpringBoot使用sentinel自定义注解实现限流
  • CodeIgniter URL结构
  • IntersectionObserver 交叉观察器
  • shell编程4,shell脚本于用户交互+关系运算符
  • C#基础题总结
  • 【大数据学习 | Spark-SQL】SparkSQL读写数据
  • STM32 使用ARM Compiler V6 编译裸机 LWIP协议栈报错的解决方法
  • 【pyspark学习从入门到精通21】机器学习库_4