目录
环境配置
Windows + phpstudy + pikachu
phpstudy的下载与配置
下载安装
列表下拉,选择左侧的phpStudy v8.1版本下载,一路正常安装即可
配置
安装完成,打开界面,启动这两项
启动成功后,左侧是蓝色小圆圈。
需要注意的是,如果MySQL启动后又自动停止,可能是系统服务中的sql服务正在运行,占用了3306端口,我们只需要打开服务,暂时停止该服务即可(MySQL服务一般设置的是自动运行,所以下次电脑开机依然会运行,不会有影响)
此电脑 右击->管理->服务,进入该界面,找到并双击MySQL服务,停止即可
验证是否安装成功
访问本地:127.0.0.1 或 http://locahost 或 本地IP(私网),如下表示成功
pikachu的下载与配置
下载安装
下载完成后解压,最好把文件夹改名为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
形成的图片马从外表看不出来变化
直接上传,发现上传成功了,并且输出了保存路径