phpstudy的安装这里不再多说,想看的请翻到上一篇文章
这里咋们直接安装uoload-labs靶场
首先输入网址
https://github.com/c0ny1/upload-labs
点击下载 然后解压缩到phpstudy的安装根目录
然后打开phpstudy
咋们点击第一关
先试一试上传本目录下的index.php文件
点击上传
有弹框 没大概率是javaScript
所以咋们尝试前端绕过
f12打开开发者工具
点击禁用
然后点击上传
发现上传成功
然后咋们来看源代码
发现跟咋们猜想的一样 是前端绕过
我们在查看提示
现在咋们看第二关
我们上传php文件
提示文件类型不正确
我们点击显示源码
意思就是只允许上传mine-type类型image/jpeg image/png image/gif
格式的
当然我们可以通过抓包的形式去改变
还是上传php文件
上传进行抓包
修改Content-Type: application/octet-stream为
Content-Type: image/jpeg
点击发送
出现那个小照片 就是上传成功了
我们放包 点击返回到主界面
发现也上传成功
我们点击提示查看
跟我们想的一样
我们接下来看第三关
上传php文件
查看源代码
嗯嗯 大概率是黑名单绕过
黑名单是规定不允许上传的文件,但是如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过。这里我们直接上传一个.php5文件
我们新建一个1.php
输入
<?php phpinfo(); ?>
我们找到咋们自己的apache服务httpd.conf解析服务
找到你们开启的版本
这句话还要我们自己添加
AddType application/x-httpd-php .php .phtml .php5 .php3
添加之后重启服务
打开
然后我们上传我们新建的1.php
上传并且抓包
修改名字为1.phtml
上传成功
上传路径也有
http://127.0.0.1/upload-labs/upload/202501211902438067.phtml
发现还是显示不了phpinfo
一顿搜索之后发现是因为版本不匹配导致(要使用ts版本呢)
因为phpstudyv8.1版本 里边都是nts版本(好像是更符合php 具体不清楚)
所i以我们换掉v8.1版本
我们使用2016或者2018版本phpstudy
这里不带着安装 因为我前边的文章又教你们咋安装
咋们直接开始
AddType application/x-httpd-php .php .phtml .php5 .php3
这句话的作用就是把其他后缀的都已.php来解析
打开httpd.conf配置文件
我们搜索
我们只要去掉注释即可
然后保存
还是一样的抓包上传
修改文件名字1.phtml
http://127.0.0.1/upload-labs/upload/202501211133234555.phtml
访问成功
查看提示
然后我们查看第四关
发现使用上面上传的php5或者其他类型的文件,都以失败告终。
但是发下有一个文件是没有过滤,也是我们上传过程中经常用到的.htaccess
文件上传之 .htaccess文件getshell_上传.htaccess后再上传jpg文件-CSDN博客
咋们这个版本的的已经修改过了
没改过的 可以修改
新建文件.htaccess
<FilesMatch "\.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
新建1.jpg
<?php phpinfo(); ?>
然后我们先上传.htaccess
然后再上传 抓包
http://127.0.0.1/upload-labs/upload/1.jpg
访问成功
查看提示
然后我们来看第五关
没头绪 查看提示
源码里把所有可以解析的后缀名都给写死了,包括大小写,转换,空格,还有点号,正常的php类文件上传不了了,并且拒绝上传 .htaccess 文件。
反复观察发现没有被限制的后缀名有 .php7 以及 .ini
我们呢来看
换成有nts的
先创建.user.ini文件
.user.ini 配置项中有两个配置可以起到一些作用
方法一:
auto_prepend_file = <filename> //包含在文件头
方法二:
auto_append_file = <filename> //包含在文件尾
我们输入
auto_prepend_file = 1.jpg
.user.ini文件里的意思是:所有的php文件都自动包含1.jpg文件。.user.ini相当于一个用户自定义的php.ini
然后创建
<?php phpinfo(); ?>
然后上传两个文件
输入
http://127.0.0.1/upload-labs/upload/readme.php
咋们修改为10
也可以输入
1.php. .
这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功。
http://127.0.0.1/upload-labs/upload/1.php
咋们看第六关
点击查看提示
发现大小写不严谨
我们可以上传.Php .phP .PHP
上传php文件并且抓包 修改
http://127.0.0.1/upload-labs/upload/202501211259277222.Php
然后咋们看第七关
查看提示
发现没有对上传的文件名做去空格的操作->trim()
然后拍咋们上传加空格
http://127.0.0.1/upload-labs/upload/202501211303075567.php
然后咋们看第八关
查看提示
发现对上传的文件后缀名未做去点.
的操作—>strrchr($file_name, '.')
然后我们抓包上传 修改
http://127.0.0.1/upload-labs/upload/1.php.
然后咋们来看第九关
查看提示
这一关黑名单,没有对::D A T A 进 行 处 理 , 可 以 使 用 : : DATA进行处理,可以使用::DATA进行处理,可以使用::DATA绕过黑名单
补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
抓包修改
/upload/202501211311139897.php::$data
输入
http://127.0.0.1/upload-labs/upload/202501211311139897.php
咋们看第十关
查看提示
deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
输入.php. .
/upload/1.php.
输入
http://127.0.0.1/upload-labs/upload/1.php.
我们来看第十一关
查看提示
str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写)
我们输入.pphphp
/upload/1.php
http://127.0.0.1/upload-labs/upload/1.php
我们看十二关
查看提示
需要php的版本号低于5.3.29
,且magic_quotes_gpc
为关闭状态(需要自己关闭)
咋们是用这个
原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
我们上传1.jpg
内容为 <?php phpinfo(); ?>
/upload/1.php�/8720250121213554.jpg
http://127.0.0.1/upload-labs/upload/1.php
但服务端读取到%00时会自动结束,将文件内容保存至1.php中
咋们看十三关
查看提示
这个是post
upload/1.php
http://127.0.0.1/upload-labs/upload/1.php
我们看十四关
查看提示
咋们找一张正常的图片
加入phpinfo
然后上传
/upload/4120250121222251.jpg
退出看到已经上传了
点击那个链接 文件包含漏洞
http://127.0.0.1/upload-labs/include.php?file=/upload/4120250121222251.jpg
然后我们查看十五关
查看提示
getimagesize()
php getimagesize 函数 – 获取图像信息 | 菜鸟教程
还是使用上一关的图片马
所以不说了
咋们来看十六关
查看提示
exif_imagetype()
exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块。
打勾开启
然后操作跟上一个一样
然后咋们看17关
点击提示
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
进行通关
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了。
我们
把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。
第一次上传
/upload/19741.jpg
发现只有i乱码没有phpinfo
我们找到010editor
插入<?php phpinfo(); ?>
具体的不再多说 看看别人的方法
咋们来看十八关
查看提示
/upload/3420250121152039.jpg
我们看十九关
查看提示
上传php文件
点击抓包
设置线程
设置载荷
点后点击
并发的同时
我们同时
http://127.0.0.1/upload-labs/upload/1.php
看看是他删除快 还是你访问快
在网址输入这个 一直刷新 当看到phpinfo界面时就成功了
然后我们来看十九关
查看提示
这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。
还是一样的操作
唯一的区别就要访问文件包含 上传图片马 上传th.jpg
这里有一个细节,由于可能是这个靶场的作者的某种原因可能有误,上传的图片路径不是放在upload文件夹下
,所以我们要进去修改一下第19关的代码文件
然后i重启靶场
http://127.0.0.1/upload-labs/include.php?file=upload/th.jpg
后边还是一样的
还是你访问的快 还是他删除的快
所以我们来看二十关
查看提示
分析代码可知:没有对上传的文件做判断,只对用户输入的文件名做判断,后缀名黑名单
上传的文件名用户可控,黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.
/upload/1.php/.
http://127.0.0.1/upload-labs/upload/1.php
我们来看二十一关
查看提示
抓包
<?php phpinfo(); ?>
------WebKitFormBoundaryyl6QoyYCwLybiBBE
Content-Disposition: form-data; name="save_name[0]"
upload-20.php
------WebKitFormBoundaryyl6QoyYCwLybiBBE
Content-Disposition: form-data; name="save_name[2]"
png
------WebKitFormBoundaryyl6QoyYCwLybiBBE
Content-Disposition: form-data; name="submit"
上传
------WebKitFormBoundaryyl6QoyYCwLybiBBE--
/upload/upload-20.php.
http://127.0.0.1/upload-labs/upload/upload-20.php.
不要小数点也是对的
http://127.0.0.1/upload-labs/upload/upload-20.php