目录
- Pass-01 js检查
- Pass-02 验证Content-type
- Pass-03 黑名单绕过
- Pass-04 .htaccess绕过
- Pass-05 点+空格+点绕过
- Pass-06 大小写绕过
- Pass-07 空格绕过
- Pass-08 点绕过
- Pass-09 ::$DATA绕过
- Pass-10 点+空格+点绕过
- Pass-11 双写绕过
- Pass-12 00截断
- Pass-13 00截断
- Pass-14 图片马绕过
- Pass-15 getimagesize()-图片马
- Pass-16 exif_imagetype()-图片马
- Pass-17 二次渲染
- Pass-18 条件竞争
- Pass-19 条件竞争
- Pass-20 00截断
Pass-01 js检查
条件:前端对后缀名(.jpg/.png/.gif)做限制
Pass-02 验证Content-type
条件:后端对MIME做限制
Pass-03 黑名单绕过
条件:后端对后缀名(.asp/.aspx/.php/.jsp)做限制(黑名单)
可以上传.phtml .phps .php5 .pht
前提是apache的httpd.conf中有如下配置代码
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
Pass-04 .htaccess绕过
条件:.htaccess绕过
黑名单拒绝了几乎所有有问题的后缀名,除了.htaccess
前提条件(1.mod_rewrite模块开启。2.AllowOverride All)
因此先上传一个.htaccess文件,内容如下:
SetHandler application/x-httpd-php
这样所有文件都会当成php来解析
Pass-05 点+空格+点绕过
可以用第十关的方法来进行绕过也就是点空格点绕过(. .),因为它的验证首先会删除文件名两端的空格,但是我们构造的后缀名的两端没有空格,所以此验证无效,接着它会删除我们后缀名中最后的一个点,然后又会过滤掉我们的一个空格,此时上传文件的后缀名为.php.不在黑名单里面,所以可以成功被上传,而且又因为windows操作系统的原因,文件后缀名最后的点也会被删除,所以我们就完成了绕过。
补充:其实这道题要考察的是通过**.user.ini**进行绕过,但尝试了几次,没成功,以后成功了,在补充这一种方法。
Pass-06 大小写绕过
条件:大小写绕过
Pass-07 空格绕过
条件:空格绕过
这题没有对后缀名进行去空,因此可以在后缀名加空格绕过
Pass-08 点绕过
条件:点绕过
没有对后缀名末尾的点进行处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过:
Pass-09 ::$DATA绕过
没有对后缀名中的’::
D
A
T
A
’
进
行
过
滤
。
在
p
h
p
+
w
i
n
d
o
w
s
的
情
况
下
:
如
果
文
件
名
+
"
:
:
DATA’进行过滤。在php+windows的情况下:如果文件名+"::
DATA’进行过滤。在php+windows的情况下:如果文件名+"::DATA"会把::
D
A
T
A
之
后
的
数
据
当
成
文
件
流
处
理
,
不
会
检
测
后
缀
名
.
且
保
持
"
:
:
DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::
DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::DATA"之前的文件名。利用windows特性,可在后缀名中加” ::$DATA”绕过:
Pass-10 点+空格+点绕过
代码先是去除文件名最后所有的.,再去除文件名前后的空格,再通过strrchar函数来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过
Pass-11 双写绕过
黑名单过滤,将黑名单里的后缀名替换为空且只替换一次,因此可以用双写绕过
Pass-12 00截断
白名单判断,但$img_path是直接拼接,因此可以利用%00截断绕过。
截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态。
Pass-13 00截断
save_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改
Pass-14 图片马绕过
通过读文件的前2个字节判断文件类型,因此直接上传图片马即可,制作图片马:
直接访问图片并不能把图片当做PHP解析,因此还需要利用文件包含漏洞
Pass-15 getimagesize()-图片马
这题是用getimagesize函数判断文件类型,还是可以图片马绕过,方法同pass-14
Pass-16 exif_imagetype()-图片马
这里用到php exif_imagetype模块来判断文件类型,用图片马绕过,方法同pass-14
Pass-17 二次渲染
判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,具体可以参考链接: 这篇文章 。可是在复现的时候还是因为二次渲染以后php代码还是出被修改。
Pass-18 条件竞争
这里是条件竞争,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可。
Pass-19 条件竞争
也存在条件竞争的问题,不过这题对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,因此可以通过不断上传图片马,由于条件竞争可能来不及重命名,从而上传成功。
Pass-20 00截断
move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过