"""本人网安小白,此贴仅作为记录我个人测试的思路、总结以便后期复习;今后本着少就是多,慢就是快的方式一步一个脚印进行学习,把这个知识点学扎实了,再学另外一个知识点。费曼教授是不是曾经说过以教代学是最好的学习方式?有很多错点可圈可指,所以也请dalao指出不对的地方,所谓教他人的时候也是在稳固自身"""
未做严格排版,后面有时间了再来整理整理
目录
一、文件上传
1、client check
2、MIME type
3、getimagesize
二、文件包含
1、本地文件包含
2、远程文件包含
三、不安全的文件下载
Ps:靶机链接:https://blog.csdn.net/qq_35258210/article/details/112465795
首先这里上传小马,后缀名不能是脚本后缀名,我们先改为.jpg,选中打开,添加完成后,打开bp抓包
开启抓包后点击开始上传,这时抓到包,可以看到上传文件名,我们把.jpg去掉,完成绕过前端验证,因为后端没做严格验证所以上传上去了,之后用蚁剑或者菜刀连接都可以
这里选择上没有对后缀名进行过滤,但是点击上传时提示我们只能上传那几个后缀的文件,这时我们要开启抓包再点击上传
把Content-Type的值改为image/jpeg
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
先生成一个图片ma,copy /b 原图片+一句话小ma 文件名
copy /b 使用二进制的格式进行拷贝生成
点击浏览找到我们刚才生成的小ma图片
可以看到我们的shell.jpg成功上传了,之后不后端在保存的时候重命名了我们的文件
我这里因为源码问题上传的时候给我报错了,并没有显示上传目标路径,但的确上传了,证明了该方法能成功绕过getimagesize函数就行
这里上传是上传了,但是使用蚁剑连接是因为后缀是jpg,连接的时候返回null,我把文件后缀改为php就连接成功了也可以访问文件夹,但是如果要这样修改文件名后缀的话,很难办呀
后来我找了种利用方法,配合文件包含使用,因为这个小ma图片已经是在服务端本地了,所以我们直接配合本地文件包含利用,这里因为我上传的图片是只有单单一句话小ma的图片,配合本地文件包含也利用不了,那我重新上传一个phpinfo代码的
phpinfo合成的图片文件
这里需要注意的是,路径必须是4个../../../../ ,这个多一个不行少一个不行,可以看到我们的phpinfo函数执行了
1、include 可以包含多次,如果包含文件不存在则提示警告,并继续执行脚本
2、includde_once 只能包含一次,多余的不执行
3、require 可以包含多次,如果包含文件不存在则提示警告、错误,并停止执行
4、require_once 只能包含一次
查看是否开启文件包含功能
本地php运行版本下的php.ini
找到下面的allow...
第一个选项 on是开启本地文件包含,off是关闭,但是据说 on和off都不法控制本地文件包含
第二个是on的时候是可以使用远程文件包含,off是不可以
/***************************************************************************************************************************************************
Ps:下面这些内容是我学习的时候看视频文字识别贴上来的
漏洞原理:
文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以_上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的 参数,Web应用没有进行严格净化,客户端.用户可以影响或控制文件包含的路径,就会产生文件包含漏洞。
特点:
PHP提供的文件包含功能非常强大,有以下特点
@ 无视文件扩展名读取文件
包含文件时,PHP会读取文件的源码,包括图片文件。尝试包含图片,连接为 [http://IP地址/fileInclude/fileinclude.php?path=图片路径] 我们发现打开图片不是图像,而是图片的源码。
@ 无条件解析PHP 代码
文件包含在读取文件源码的同时,如果遇到符合PHP 语法规范的代码,就会无条件执行。例如,将info.php的后缀名改成info.rar,依然能够显示phpinfo()信息。
包含图片马写shell
");?>
文件包含漏洞利用
1、读取敏感文件
2、直接包含图片ma
3、包含木马写shell
4、封装协议--访问本地文件
5、封装协议--传输PHP文件
6、封装协议--执行php命令
php:// php伪协议
***************************************************************************************************************************************/
先在服务器本地新建个php文件:
1.php文件下的代码:
C:\WWW\pikachu-master\vul\fileinclude\include
下拉菜单选择查询是正常使用的,但是我们在本地新建了个php文件是不是可以通过参数的形式传递进去呢?
把上图标记的参数改为我们在服务器端新建的php文件,1.php
因为后端php代码里使用了include包含了一个动态变量,这会产生文件包含漏洞
我们要把第二个选项设置为on,设置完后必须要重启phpStudy
再刷新页面就可以看到已经修改完毕了
在自己客户机上新建一个php文件代码如下图
代码意思是服务器端新建一个shell.php文件并赋予可写权限,再把 一句话小ma写到当前文件并关闭文件
没上传文件前服务器的这个目录下的文件
因为我的攻击机没搭建服务器环境所以使用服务器端上传到服务器端,效果是一样的
执行完后,页面一点感觉都没有,但我们的2.txt成功执行并在服务器端写了一个shell.php脚本。ps:刚开始的时候在上面那个路径折腾了很久,一直上传不了,原来是上图传递的参数路径错了!!!
参数传递后文件上传成功并执行脚本,这页面一点反应一点感觉都没有!
这个时候就可以使用蚁剑连接了
首页是这样的,点击图片下面的文字会提示是否下载。我们先打开bp开启抓包后,随便点击一张图片下的文字
抓到了包甩到repeater模块,进行下一步测试。为了测试我在服务端c盘下创建了一个112.txt文件
把抓到的包,filename的值改为../../../../../../ 多加几个,为了确保我们抵达了根目录
点击Go之后,http响应码200 ok,这时我们把我们构造的路径copy到proxy
把修改后的请求头发送给服务器
成功下载服务器端的未授权文件
源码里只是判断了我们要下载的文件是否在download目录下,如果不在该目录下就提示文件不存在。并没有做过多的验证,这很危险,只要出现这样的漏洞我们就可以下载服务端上的任意文件了。知道路径、文件名前提下