文件上传漏洞从pikachu靶机搭建到实例演示——课程报告

文章详细介绍了如何在Windows上配置phpstudy和pikachu环境,包括下载、安装、配置过程,以及遇到的常见问题如密码错误、文件上传的前端js检测绕过方法,还涉及后端MIME检测和文件内容检测的原理及绕过技巧,最后展示了图片马的制作和上传方法。
摘要由CSDN通过智能技术生成

目录

环境配置

phpstudy的下载与配置

下载安装

配置

pikachu的下载与配置

下载安装

配置

配置时可能出现的错误

文件上传实例演示

进入pikachu

前端js检测

原理

绕过

本地禁用js

本地修改js代码

抓包修改

后端MIME检测

原理

绕过

后端内容检测

原理

绕过

文件幻术检测绕过

图片马绕过


环境配置

Windows + phpstudy + pikachu

phpstudy的下载与配置

下载安装

phpstudy集成环境下载

列表下拉,选择左侧的phpStudy v8.1版本下载,一路正常安装即可

配置

安装完成,打开界面,启动这两项

启动成功后,左侧是蓝色小圆圈。
需要注意的是,如果MySQL启动后又自动停止,可能是系统服务中的sql服务正在运行,占用了3306端口,我们只需要打开服务,暂时停止该服务即可(MySQL服务一般设置的是自动运行,所以下次电脑开机依然会运行,不会有影响)
此电脑 右击->管理->服务,进入该界面,找到并双击MySQL服务,停止即可

验证是否安装成功
访问本地:127.0.0.1 或 http://locahost 或 本地IP(私网),如下表示成功

pikachu的下载与配置

下载安装

pikachu下载地址(GitHub)

下载完成后解压,最好把文件夹改名为pikachu,然后将其放入phpstudy安装位置的WWW目录下(上方是我的phpstudy的安装路径):

配置

修改以下路径的config.inc.php配置文件,将用户名和密码改成自己数据库中的即可

配置好之后,启动之前所说的phpstudy的Apache和MySQL,进入http://127.0.0.1/pikachu/

然后上面应该会有红字出现,提示你没有初始化,需要安装/初始化,点进去即可。如果没有提示,那直接进入127.0.0.1/pikachu/install.php也可以安装初始化,点击 安装/初始化

配置时可能出现的错误

以下是我在配置过程中出现过的错误

Access denied for user ‘root‘@‘localhost‘ (using password: YES)

如果出现如图Access denied for user ‘root‘@‘localhost‘ (using password: YES)的错误,那就是数据库mysql登录的用户名和密码不正确,

有两种解决方法:1.更改前面的配置文件config.inc.php,将其改为phpstudy中的密码

2.重设root的密码(之前写的,不如第一种,但是删了太浪费)

(因为在关闭本机MySQL服务,启动phpstudy的MySQL后,在pikachu启动的mysql与我们本机启动的mysql不一样,可能出现密码不一样的情况,因为pikachu的my.ini配置文件的路径在“phpstudy安装路径/Extensions/”下的SQL文件夹中,如下图所示,接下来我们将会暂时修改my.ini文件)

用记事本打开my.ini文件,在“[mysqld]”下添加一行

skip-grant-tables

意思是跳过表认证,也就是说等会不用登录,直接修改root密码,然后重启phpstudy中的MySQL服务

打开终端,输入 mysql -u root -p,提示密码时直接回车,因为这次不需要验证密码,然后输入use mysql切换到mysql数据库

由于mysql5.7 开始新版的mysql数据库下的user表中已经没有password字段,保持密码的字段变成了authentication_string字段,所以我们使用如下命令来修改密码:

update user set authentication_string=password('你在前面配置文件config.inc.php中设置的密码') where user='root';

如果是老版sql,则依然可以使用password字段

修改密码后需要使用命令 flush privileges; 刷新

然后exit退出即可,密码修改成功,记得回去删掉my.ini的那一行 skip-grant-tables 并重启服务。

文件上传实例演示

进入pikachu

根据前面的配置,开启phpstudy的Apache和MySQL,进入127.0.0.1/pikachu/页面,然后进入Unsafe Fileupload,可以看到有三种检测等待我们。

我准备了一张图片和一个php文件待上传

前端js检测

直接上传.php文件会显示不符合要求

原理

主要是基于 JavaScript 代码进行的检测

绕过

本地禁用 js、本地对 前端 js 代码进行修改、或者先上传重命名的正确格式,然后通过抓包软件篡改上传的文件
本地禁用js

通过下载可禁用js的插件即可,在edge里面有个插件叫JavaScript Switch,我们打开此插件,禁用js,发现可以正常上传.php文件了

本地修改js代码

直接在元素里修改是不起作用的,因为浏览器会有缓存,但如果刷新就会刷掉我们的修改,所以我们要使用本地覆盖的方式进行修改

在浏览器右击选项,点击源代码选项,然后点击覆盖选项,点击选择替代文件夹,随便新建一个文件夹就可以,这个替代文件夹就是我们要进行本地缓存覆盖的文件夹,浏览器刷新加载的时候就会优先加载本地的。

他会提示对文件夹的完全访问权限,选择允许

注意这里的启用本地替代需要勾选上

然后进入源代码界面,开始修改本地代码,可以看到这个选择文件调用了一个叫做checkFileExt()函数,我们把它删掉,然后右键选择替代内容(override for replace)

这个本地文件的旁边出现紫色原点就算成功了,这个时候直接刷新界面,就可以上传了。

再次上传.php文件,发现可以上传成功

抓包修改

有关抓包的firefox(火狐浏览器)和burp suite配置可以看这篇Burp Suite代理工具+FireFox浏览器抓包配置

先把.php文件改后缀为要求的格式,这里我改为b.png,通过Burp Suite在开始上传时进行抓包

成功抓包后,将这里的filename值再次改回b.php,即可上传成功

后端MIME检测

原理

在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就
是这个文件的类型 file_type ;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的 file_type 进行对比,如果符合要求就允许上传这个文件。

绕过

部分 Web 应用系统判定文件类型是通过 content - type 字段 ,可以通过抓包,将 content-type字段  改为常见的 图片类型 ,如 image/png  ,从而绕过校验。

在上传文件时,通过抓包,修改Content-type字段

发现上传成功

后端内容检测

原理

一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。

绕过

文件幻术检测绕过

图像相关的信息检测常用getimagesize( )函数。每种类型的图片内容最开头会有一个标志性的头部,这个头部被称为文件幻术。常用图片类型有以下几类:

1.绕过jpg文件幻术检测要在文件开头写上下图的值:

Value = FF D8 FF E0 00 10 4A 46 49 46

2.绕过png文件幻术检测要在文件开头写上下图的值:

Value = 89 50 4E 47

3.绕过gif文件幻术检测要在文件开头写上下图的值:

Value = 47 49 46 38 39 61

比如以记事本打开.php文件,在首部加上GIF89a,就可以绕过getimagesize()函数的检测

然后将其后缀改为.png,发现可以绕过检测,上传成功

如果是其他类型的二进制文件,也有相应的头字节,如下表:

格式文件头
TIFF (tif)49492A00
Windows Bitmap (bmp)424D
CAD (dwg)41433130
Adobe Photoshop (psd)38425053
Rich Text Format (rtf)7B5C727466
MS Word/Excel (xls.or.doc)D0CF11E0
MS Access (mdb)5374616E64617264204A
ZIP Archive (zip)504B0304
RAR Archive (rar)52617221
Wave (wav)57415645
AVI (avi)41564920
Real Media (rm)2E524D46
MPEG (mpg)000001BA
MPEG (mpg)000001B3
Quicktime (mov)6D6F6F76
Adobe Acrobat (pdf)255044462D312E
Windows Media (asf)3026B2758E66CF11
MIDI (mid)4D546864
图片马绕过

准备一张图片,这里为a.png,和一个木马文件b.php,通过以下命令合成一个图片马——c.png: b.php内容:<?php phpinfo(); ?>

命令:

Windows下:
copy a.png /b + b.php /a c.png
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件
​
Linux下:
cat a.png b.php > c.png

形成的图片马从外表看不出来变化

直接上传,发现上传成功了,并且输出了保存路径

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值