前言
- 在wgp狼组安全平台看到一个人写的upload-labs第21关的writeup,就想去找这个靶场来练练手,在github
上找到这个靶场,然后准备记录下自己的解法。
靶场环境
- 采用docker,github上有详细说明docker镜像包下载,搭建很简单,就不记录了。
docker靶机采用的php版本是5.5.38
关卡笔记
注意:
- 它这个靶场网页上查看源码的功能所显示的源码和实际的源码有时不一样,所以这里不推荐直接点击网页
上的查看源码功能,而是看实际的源码
Pass-01
- 第一关只有前端验证,这里F12查看前端源码,如图:

- 分析js代码,可以知道就是对上传文件名后缀进行了一个验证,所以这里绕过思路有两种:
- 通过抓包修改后缀名为.php
- 通过重写js函数允许.php文件上传
- 这里选择第二种,打开控制台,复制js函数,然后给js函数的allow_ext变量添加上.php后缀,回车,如图:

- 然后这里写一个test.php文件上传,上传成功后访问该文件即看到执行成功,如图:

- 这里第一次上传提示没有upload文件夹,这里进入docker环境创建一个即可。
Pass-02


- 这里的Content-Type类型对应$_FILES['upload_file']['type'],所以修改一下就能绕过。
- 验证一下,如图:

Pass-03

- 可以看到如图对.asp,.aspx,.php和.jsp的文件进行了黑名单过滤,并且后续保存文件时,文件名还是
由时间戳+随机数+文件后缀组成的。
- 思路:可以上传其他后缀的文件,比如.phtml,.php5等,但是要求服务器得解析这些文件为php文件,
所以这里往apache配置文件中添加如下规则:
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
- 这里docker没有vi和vim编辑器,那就下一个,依次输入以下命令:
apt-get update
apt-get install vim
安装好vim后打开配置文件,文件绝对路径是:/etc/apache2/apache2.conf,打开加上规则后,重启
apache服务器软件,输入下面命令重启:
apache2ctl -k restart
- 这里上传一个.phtml为后缀的文件,上传成功后,打开控制台可以看到文件名,如图:

- 访问该文件,可以发现文件被当作php文件解析了,如图:

Pass-04
- 这一关扩大了黑名单,加入了很多后缀名过滤,但是文件名不再随机拼接,而是采用原文件名,源码如图:

- 思路:黑名单不好绕了,但是文件保存时是以原文名保存的,那么可以尝试上传一个php文件,但是后缀名
是正常图片后缀,比如.jpg,然后再上传一个.htaccess文件来重写文件解析规则,让服务器将咱们上传的
图片后缀的php文件按php文件解析。
- 这里先写一个test.php文件,然后将后缀改为.jpg,上传到服务器,如图:

- 然后再上传一个.htaccess文件,该文件写入如下匹配规则来将咱们上传的test.jpg文件按PHP文件解析
<FilesMatch "test.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

- 上传成功后,访问咱们的test.jpg文件,如图可以看到被当作php文件解析

Pass-05
- 这一关相比第4关黑名单增加了.htaccess文件,在保存的时候又将文件名随机值重命名了,但是去掉了将后
缀转换为小写,源码如图:


- 思路是:既然对后缀名的验证去掉了转换小写,那么就可以采用大小写混合的方式绕过,上传一个test2.PHp
文件,如图:


Pass-06
- 这关去掉了首尾去空的代码,即
$file_ext = trim($file_ext),如图:



- 从以上两张图可以发现,文件成功上传,但是由于docker是linux系统,所以没法执行成功,但是在windows
系统上是能够执行成功的。因为windows系统下xx.jpg+空格和xx.jpg+点这两类文件都是不允许存在的,
如果这样命名,windows会默认去除空格或点。
Pass-07
- 这关相对于第6关,加上了首尾去空格,但是少了尾部去点。也就是说和Pass-06一样,利用windows系统
的文件命名规则来绕过。就不复现了。源码如图:

Pass-08
- 这图想对于第7关,加上了尾部去点,但是去掉了去除"::$DATA"字符串这一步,源码如图:

- 这里还是利用windows的一个特性,在php+windows的情况下:如果文件名+"::$DATA"会把$DATA之后
的数据当作文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名。即上传类似xx.php::$DATA这
样的文件即可,不是windows,暂时就不复现了。
Pass-09

- 这关并没有少去除什么,但是还是可以绕过,前提目标是windows系统的话。可以看到代码逻辑是先去除
末尾的点,然后取出::$DATA,再将首尾去空,那么可以用.加空格加.的方式来绕过,这样过滤后还剩一个
点,如图,上传一个名为test4.php. .的文件:


- 可以看到成功上传了,如果是windows系统就能利用成功。
Pass-10

- 分析代码可以发现,上传文件名里凡是涉及到黑名单里的后缀名,无论大小写,全部替换为空
- 思路:虽然将涉及到黑名单里的后缀名替换为空,但是这操作只执行一次,所以我们可以采用双写绕过,
比如我们上传一个test5.pphphp的文件,过滤后就成了test5.php,如图:


