loading...
文件上传靶场记录一(1-12关)
Published in:2021-11-29 | category: CTF | 靶场

本系列为文件上传漏洞练习
直接上靶场文件https://github.com/c0ny1/upload-labs
线上靶场:http://59.63.200.79:8016/

Pass-01(前端验证)


根据提示发现,该上传文件格式限制php,查看源码

可以看到前端做了文件格式限制
解决方法:
1、在网页中F12找到表单提交处,添加action:””(在此之前获取到目标上传的url)里面写入上传的url
2、使用burpsuite抓包

将filename的jpg改为php


成功上传

Pass-02(MIME验证)


查看源码发现判断标志为content-type,明显的MIME验证漏洞,老方法,用bp抓包,将content-type改成image/jpeg或者png、gif


成功上传

Pass-03(黑名单文件格式过滤)


这里可以利用apache能解析php3,php5和phtml的特性,将后缀改为以上三种格式来实施绕过,前提是对方apache需要开启该文件后缀的解析功能,一般来说是开启的。具体可看php3,php5和phtml的讲解

也是成功上传

Pass-04(.htaccess验证)


第四关在第三关基础上限制了更多的文件后缀,这关可以使用.htaccess的方式绕过。首先创建一个后缀为.htaccess文件(用notepad++)
具体的.htaccess文件博客请移步
里面代码如下

1
2
3
<FilesMatch "abc">
SetHandler application/x-httpd-php
</FileMatch>

意思是允许上传一个文件名有abc的不受限制的文件,执行里面的php语句。
使用一张正常的图片,在图片最后插入php代码,phpinfo()函数,打开上传文件的路径,观察是否执行了php代码(页面是否显示php的信息)

Pass-05(大小写验证)

查看源码,发现没有大小写限制,一般大小写限制有php函数

1
$file_ext = strtolower($file_ext);

本关可直接修改php后缀,可改为pHp,Php等大小写混合后缀。

上传成功

Pass-06(空格验证)


观察到本关没有首尾去空的函数
一般为

1
$file_ext = trim($file_ext);

去空的意思就是将文件名多余的空格去掉,可以利用此特点,在后缀名后面添加一个空格,使其被辨别为带空格的文件名
因为本地windows系统限制不能直接修改,使用bp抓包

加一个空格

上传成功

Pass-07(点验证)


观察代码,与正常的相比少了删除文件名末尾的点的函数

1
$file_name = deldot($file_name);

用bp抓包,在文件名后加一个点,无法识别正常的文件格式,上传后会默认恢复成正常文件


上传成功

Pass-08(::$DATA绕过)

NTFS文件系统存储数据流的一个属性DATA。当我们访问a.asp::DATA时,就是请求a.asp本身的数据,如果a.asp还包含了其他的数据流,比如a.asp:lake2.asp,请求a.asp:lake2.asp::$DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。

php在Windows的时候如果文件名+”::$DATA”会把 :: $DATA之后的数据当作文件流处理,不会检测后缀名,且保持:: $DATA之前的文件名。

查看源码,发现文件名没有过滤::$DATA

bp抓包,在文件后面加入::$DATA


上传成功

Pass-09(构造文件后缀绕过)

查看源码

move_upload_file的文件名直接为用户上传的文件名,我们可控。且会删除文件名末尾的点.
这里构造文件名post.php. .(点+空格+点),经过处理后,即可绕过。


上传成功

Pass-10(双写后缀名绕过)

查看源码

这里是将敏感后缀替换为空,双写.pphphp绕过即可,因为没有循环检验,只要碰到php字符就为空,所以中间的php过滤了,剩下前后php


成功上传

Pass-11(%00截断一)

查看源码

发现本关上传路径是可控的,尝试bp抓包

尝试在上传路径后添加1.php,发送。返回包里回显路径+文件名还有一个1.php,这时候可以使用%00,将1.php后的所有东西截断,失去用处。

可以发现是成功上传,这个时候1.php就是该图片的php格式文件。

Pass-12(%00截断二)

本关与11关类似,同样是%00截断。查看源码

有所不同的是,11关使用的是GET方法,本关使用POST方法。
因为在GET方法中,%00被url解码后是空字符,而在POST方法中不会被url解码,所以需要手动在bp里进行解码。

Prev:
文件上传靶场二(13-21关)
Next:
浅谈游戏服务器匹配机制
catalog
catalog